diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 5225c0958..6dcd3da37 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -122,7 +122,7 @@ jobs: BUILD=build:ci notify: - name: Notify + name: Build Failure Notifications runs-on: ubuntu-latest needs: - build diff --git a/antora.yml b/antora.yml index d357eca8b..f1568a0e4 100644 --- a/antora.yml +++ b/antora.yml @@ -9,4 +9,8 @@ asciidoc: # https://github.com/asciidoctor/asciidoctor/blob/917d3800a08a8f283a8d05beb08bb75af1673de5/lib/asciidoctor.rb#L391 attributes: # Uses zero-width joiner (U+200D) to avoid being split across lines - cpp: C‍+‍+ \ No newline at end of file + cpp: C‍+‍+ + # Use backslash without it escaping things in other situations + literal-backslash: \ + # To keep paths from breaking across lines + NoBreakBackslash: ‍\‍ \ No newline at end of file diff --git a/modules/ROOT/attachments/BeginnersGuide/dependencies/SML.vsconfig b/modules/ROOT/attachments/BeginnersGuide/dependencies/SML.vsconfig index 5fc2cf486..d1c52b3c1 100644 --- a/modules/ROOT/attachments/BeginnersGuide/dependencies/SML.vsconfig +++ b/modules/ROOT/attachments/BeginnersGuide/dependencies/SML.vsconfig @@ -35,7 +35,7 @@ "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", "Microsoft.VisualStudio.Component.Graphics.Tools", "Microsoft.VisualStudio.Component.VC.DiagnosticTools", - "Microsoft.VisualStudio.Component.Windows11SDK.22000", + "Microsoft.VisualStudio.Component.Windows11SDK.26100", "Microsoft.VisualStudio.Component.ManagedDesktop.Prerequisites", "Microsoft.VisualStudio.Component.DotNetModelBuilder", "Microsoft.ComponentGroup.Blend", diff --git a/modules/ROOT/images/BeginnersGuide/CloseIntegrationConfig.png b/modules/ROOT/images/BeginnersGuide/CloseIntegrationConfig.png new file mode 100644 index 000000000..6dd2652f4 Binary files /dev/null and b/modules/ROOT/images/BeginnersGuide/CloseIntegrationConfig.png differ diff --git a/modules/ROOT/images/BeginnersGuide/Wwise/wwise_no_plugins.png b/modules/ROOT/images/BeginnersGuide/Wwise/wwise_no_plugins.png new file mode 100644 index 000000000..dd19c2d36 Binary files /dev/null and b/modules/ROOT/images/BeginnersGuide/Wwise/wwise_no_plugins.png differ diff --git a/modules/ROOT/images/BeginnersGuide/Wwise/wwise_packages.png b/modules/ROOT/images/BeginnersGuide/Wwise/wwise_packages.png new file mode 100644 index 000000000..5f5ee0bae Binary files /dev/null and b/modules/ROOT/images/BeginnersGuide/Wwise/wwise_packages.png differ diff --git a/modules/ROOT/images/BeginnersGuide/Wwise/wwise_version.png b/modules/ROOT/images/BeginnersGuide/Wwise/wwise_version.png new file mode 100644 index 000000000..de1b1dde7 Binary files /dev/null and b/modules/ROOT/images/BeginnersGuide/Wwise/wwise_version.png differ diff --git a/modules/ROOT/images/Development/EditorTools/ResearchTreeEditor/BlankTreeEditor.png b/modules/ROOT/images/Development/EditorTools/ResearchTreeEditor/BlankTreeEditor.png new file mode 100644 index 000000000..4c28629b9 Binary files /dev/null and b/modules/ROOT/images/Development/EditorTools/ResearchTreeEditor/BlankTreeEditor.png differ diff --git a/modules/ROOT/images/Development/EditorTools/ResearchTreeEditor/ExampleComplexTree.png b/modules/ROOT/images/Development/EditorTools/ResearchTreeEditor/ExampleComplexTree.png new file mode 100644 index 000000000..f91ecdc3d Binary files /dev/null and b/modules/ROOT/images/Development/EditorTools/ResearchTreeEditor/ExampleComplexTree.png differ diff --git a/modules/ROOT/images/L10n/AddNewCulture.png b/modules/ROOT/images/L10n/AddNewCulture.png index 85628086c..24aeefc25 100644 Binary files a/modules/ROOT/images/L10n/AddNewCulture.png and b/modules/ROOT/images/L10n/AddNewCulture.png differ diff --git a/modules/ROOT/images/L10n/CompileTranslations.png b/modules/ROOT/images/L10n/CompileTranslations.png index 08d83c692..4d7850772 100644 Binary files a/modules/ROOT/images/L10n/CompileTranslations.png and b/modules/ROOT/images/L10n/CompileTranslations.png differ diff --git a/modules/ROOT/images/L10n/ConfigureTargetDependencies.png b/modules/ROOT/images/L10n/ConfigureTargetDependencies.png index 431cec5bd..6c62d0a5e 100644 Binary files a/modules/ROOT/images/L10n/ConfigureTargetDependencies.png and b/modules/ROOT/images/L10n/ConfigureTargetDependencies.png differ diff --git a/modules/ROOT/images/L10n/EditTranslationsForCulture.png b/modules/ROOT/images/L10n/EditTranslationsForCulture.png index 674126970..1ba7f6ea8 100644 Binary files a/modules/ROOT/images/L10n/EditTranslationsForCulture.png and b/modules/ROOT/images/L10n/EditTranslationsForCulture.png differ diff --git a/modules/ROOT/images/L10n/EditTranslationsInEditor.png b/modules/ROOT/images/L10n/EditTranslationsInEditor.png index e146f2bd0..30f4db857 100644 Binary files a/modules/ROOT/images/L10n/EditTranslationsInEditor.png and b/modules/ROOT/images/L10n/EditTranslationsInEditor.png differ diff --git a/modules/ROOT/images/L10n/GatherText.png b/modules/ROOT/images/L10n/GatherText.png index 4d0987643..8566f081e 100644 Binary files a/modules/ROOT/images/L10n/GatherText.png and b/modules/ROOT/images/L10n/GatherText.png differ diff --git a/modules/ROOT/images/L10n/PickPlugin.png b/modules/ROOT/images/L10n/PickPlugin.png index 4abf535e8..e1b8f5761 100644 Binary files a/modules/ROOT/images/L10n/PickPlugin.png and b/modules/ROOT/images/L10n/PickPlugin.png differ diff --git a/modules/ROOT/images/L10n/RenameTarget.png b/modules/ROOT/images/L10n/RenameTarget.png index 0a75281f5..086c9c968 100644 Binary files a/modules/ROOT/images/L10n/RenameTarget.png and b/modules/ROOT/images/L10n/RenameTarget.png differ diff --git a/modules/ROOT/images/L10n/SchematicDisplayNameAdvancedSettings.png b/modules/ROOT/images/L10n/SchematicDisplayNameAdvancedSettings.png index cb71e78e9..4bb23affb 100644 Binary files a/modules/ROOT/images/L10n/SchematicDisplayNameAdvancedSettings.png and b/modules/ROOT/images/L10n/SchematicDisplayNameAdvancedSettings.png differ diff --git a/modules/ROOT/images/L10n/ViewTarget.png b/modules/ROOT/images/L10n/ViewTarget.png index d5e8c2f76..c6fabe936 100644 Binary files a/modules/ROOT/images/L10n/ViewTarget.png and b/modules/ROOT/images/L10n/ViewTarget.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_GamePreview.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_GamePreview.png new file mode 100644 index 000000000..72c64fa0f Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_GamePreview.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_CreateDataAsset.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_CreateDataAsset.png new file mode 100644 index 000000000..9db5dc1fa Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_CreateDataAsset.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_DataAsset_Settings.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_DataAsset_Settings.png new file mode 100644 index 000000000..2b2228d46 Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_DataAsset_Settings.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_LinkRTPC.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_LinkRTPC.png new file mode 100644 index 000000000..143576cc0 Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_LinkRTPC.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_PickDataAssetClass.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_PickDataAssetClass.png new file mode 100644 index 000000000..6806c786e Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_PickDataAssetClass.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_CreateAudioBus.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_CreateAudioBus.png new file mode 100644 index 000000000..555a24435 Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_CreateAudioBus.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_LinkAudioBus.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_LinkAudioBus.png new file mode 100644 index 000000000..6e1ac8067 Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_LinkAudioBus.png differ diff --git a/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_SelectAudioBus.png b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_SelectAudioBus.png new file mode 100644 index 000000000..eff71acee Binary files /dev/null and b/modules/ROOT/images/Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_SelectAudioBus.png differ diff --git a/modules/ROOT/images/UnrealEditor/MainContentBrowser.jpg b/modules/ROOT/images/UnrealEditor/MainContentBrowser.jpg deleted file mode 100644 index 10bd12172..000000000 Binary files a/modules/ROOT/images/UnrealEditor/MainContentBrowser.jpg and /dev/null differ diff --git a/modules/ROOT/images/UnrealEditor/MainMenuBar.jpg b/modules/ROOT/images/UnrealEditor/MainMenuBar.jpg deleted file mode 100644 index d4fb1e042..000000000 Binary files a/modules/ROOT/images/UnrealEditor/MainMenuBar.jpg and /dev/null differ diff --git a/modules/ROOT/images/UnrealEditor/MainModes.jpg b/modules/ROOT/images/UnrealEditor/MainModes.jpg deleted file mode 100644 index f717d353e..000000000 Binary files a/modules/ROOT/images/UnrealEditor/MainModes.jpg and /dev/null differ diff --git a/modules/ROOT/images/UnrealEditor/MainOutliner.jpg b/modules/ROOT/images/UnrealEditor/MainOutliner.jpg deleted file mode 100644 index 28ad68489..000000000 Binary files a/modules/ROOT/images/UnrealEditor/MainOutliner.jpg and /dev/null differ diff --git a/modules/ROOT/images/UnrealEditor/MainToolBar.jpg b/modules/ROOT/images/UnrealEditor/MainToolBar.jpg deleted file mode 100644 index 2e2ebeab1..000000000 Binary files a/modules/ROOT/images/UnrealEditor/MainToolBar.jpg and /dev/null differ diff --git a/modules/ROOT/images/UnrealEditor/MainViewport.jpg b/modules/ROOT/images/UnrealEditor/MainViewport.jpg deleted file mode 100644 index 75cc4ef8a..000000000 Binary files a/modules/ROOT/images/UnrealEditor/MainViewport.jpg and /dev/null differ diff --git a/modules/ROOT/images/UnrealEditor/TabBar.jpg b/modules/ROOT/images/UnrealEditor/TabBar.jpg deleted file mode 100644 index 31bd340ff..000000000 Binary files a/modules/ROOT/images/UnrealEditor/TabBar.jpg and /dev/null differ diff --git a/modules/ROOT/nav.adoc b/modules/ROOT/nav.adoc index 7baaab6aa..762099401 100644 --- a/modules/ROOT/nav.adoc +++ b/modules/ROOT/nav.adoc @@ -55,12 +55,11 @@ *** xref:Development/Modeling/MainMaterials.adoc[Main Materials] *** xref:Development/Modeling/style.adoc[Style Guide] ** xref:Development/UnrealEngine/index.adoc[Unreal Engine] - *** xref:Development/UnrealEngine/Code.adoc[Code] - *** xref:Development/UnrealEngine/BluePrints.adoc[Blueprints] - *** xref:Development/UnrealEngine/Editor/index.adoc[Unreal Editor] - **** xref:Development/UnrealEngine/Editor/MainWindow.adoc[Main Window] + *** xref:Development/UnrealEngine/UnrealLearningResources.adoc[Unreal Learning Resources] *** xref:Development/UnrealEngine/CoreRedirect.adoc[Core Redirects] *** xref:Development/UnrealEngine/StringClasses.adoc[String Classes] + *** xref:Development/UnrealEngine/Code.adoc[Code] + *** xref:Development/UnrealEngine/BluePrints.adoc[Blueprints] ** xref:Development/Satisfactory/index.adoc[Satisfactory] *** xref:Development/Satisfactory/Multiplayer.adoc[Multiplayer] *** Game Features @@ -128,6 +127,7 @@ ** xref:Development/ReuseGameFiles.adoc[Reusing Base Game Files] ** xref:Development/ExtractGameFiles.adoc[Extracting Game Files] ** xref:Development/TestingResources.adoc[Testing/Multiplayer Testing] +// TODO ** xref:Development/OptionalModDependencies.adoc[Optional Mod Dependencies] ** xref:Development/OpenSourceExamples.adoc[Learning from Open Source Mods] ** xref:UploadToSMR.adoc[Uploading your Mod to SMR] @@ -144,6 +144,8 @@ // * Translating Mods // ** xref:Translation/GetStartedTranslating.adoc[Get Started Translating] // ** xref:Translation/UsingTolgee.adoc[Using Tolgee] +// ** For Users +// *** TODO // ** For Mod Developers // *** xref:Translation/Developers/RequestTolgeeProject.adoc[Using Tolgee] // *** xref:Development/Localization.adoc[Localizing Mods] diff --git a/modules/ROOT/pages/CommunityResources/AssetToolkit.adoc b/modules/ROOT/pages/CommunityResources/AssetToolkit.adoc index 255b677d6..e14ed9099 100644 --- a/modules/ROOT/pages/CommunityResources/AssetToolkit.adoc +++ b/modules/ROOT/pages/CommunityResources/AssetToolkit.adoc @@ -1,15 +1,5 @@ = Unreal Engine Asset Toolkit -[WARNING] -==== -The Asset Toolkit has not yet been fully tested on UE5 or the 1.0 release. -==== - -[NOTE] -==== -This article is a work-in-progress. Please contact us on the Discord if you run into any issues here. -==== - Community member Archengius has created a set of two plugins useful for dumping content from a compiled Unreal Engine game and importing it into the Unreal Engine Editor. @@ -26,10 +16,10 @@ making working with base-game content much more convenient. [WARNING] ==== If you decide to generate a complete copy of the project, -make sure that your Content folder is not publicly available on Github or similar. +make sure that your Content folder is not publicly available on GitHub or similar. -If you only have a plugin-level repo, this is not a problem, -but if you have a project-level repo as well, you should watch out for this. +If you only have a plugin-level repo (root folder has a `.uplugin` file), this is not a problem, +but if you have a project-level repo as well (root folder has a `.uproject` file), you should watch out for this. Because the assets are already tracked (shipped with the starter project), simply adding them to your `.gitignore` will not ensure they are excluded. @@ -44,16 +34,19 @@ for more info. The Asset Toolkit repository consists of two plugins, a dumper, to be installed in the game, and an asset generator, to be installed in the editor. -Both are contained in the https://github.com/mircearoata/UEAssetToolkit/tree/dev[Asset Toolkit repository]. +Both are contained in the https://github.com/satisfactorymodding/UEAssetToolkit/tree/dev[Asset Toolkit repository]. Download a zip of the repository and extract somewhere, or clone it if desired. Regardless, make sure the copy you obtain is of the **`dev` branch** as it will have the latest fixes. [NOTE] ==== -Note that the link above points to the *dev branch of Mircea's fork* of the https://github.com/Archengius/UEAssetToolkit[original project]. +Note that the link above points to the *dev branch of the Satisfactory Modding Org's fork* of the https://github.com/Archengius/UEAssetToolkit[original project]. Said fork is the one that the https://github.com/satisfactorymodding/UnrealProjectUpdater/blob/master/.github/workflows/updateSML.yml#L176[CI scripts] use to semi-automatically generate the starter project, and as such is usually kept more up to date. + +Community changes to the Asset Toolkit are often slow to merge, +so it's best to ask on the Discord to see if there is a more recent fork or branch available. ==== Once you have downloaded the files, @@ -90,7 +83,8 @@ It takes files produced by the dumper and generates the uasset files your editor #include "MaterialEditingLibrary.h" ---- - If you get errors about unresolved external modules, try deleting the project's `Intermediates` folder, regenerating project files, and building again. -- Ask for help on the discord. +- Ask on the Discord if there is a community fork that is more up to date. +- Ask for help on the Discord. === Packaging the Asset Dumper as a Mod @@ -110,22 +104,29 @@ If you don't, you could get ambiguous errors while dumping and generating. ==== A user interface exists for using the dumper, -but there are some crashing problems with it, +but there are many crash problems with it, so these directions will cover using the command line version instead. -To dump assets, navigate to your game install directory in Powershell. -For example, `C:\EpicGamesGames\SatisfactoryEarlyAccess` +First, navigate to your game install directory in Powershell. +Open Powershell and use the `cd` command to change directories. +For example, if your game is installed at `C:{NoBreakBackslash}EpicGamesGames{NoBreakBackslash}SatisfactoryEarlyAccess`, +you would run: + +`cd C:\EpicGamesGames\SatisfactoryEarlyAccess` Next, from that directory, edit the following Powershell command to point to your game executable, then run it: -`FactoryGameEGS.exe -EpicPortal -NoSteamClient -DumpAllGameAssets -RootAssetPath=/Game -ExcludePackagePaths=/Game/WwiseAudio -ExcludePackageNames=/Game/Geometry/Meshes/1M_Cube_Chamfer -PackagesPerTick=32 -ExitOnFinish -log -NewConsole` +// cspell:ignore norhithread +// Prevent break on dash and its argument +`FactoryGameEGS.exe -EpicPortal -NoSteamClient -DumpAllGameAssets -{wj}RootAssetPath=/Game -ExcludePackagePaths=/Game/WwiseAudio -ExcludePackageNames=/Game/Geometry/Meshes/1M_Cube_Chamfer -PackagesPerTick=32 -ExitOnFinish -log -NewConsole -nullrhi -norhithread` [WARNING] ==== The above command assumes you are using an Epic Games copy `FactoryGameEGS`. If you are using a Steam copy of the game: -1. Use the xref:Development/TestingResources.adoc#LaunchScript[Launch Script] at least once before running the command to create the files required for the Steam game to launch correctly from the command line. +1. Use the xref:Development/TestingResources.adoc#LaunchScript[Launch Script] at least once before running the command + to create the files required for the Steam game to launch correctly from the command line. 2. Adjust the command to use `FactoryGameSteam` instead of `FactoryGameEGS`. ==== @@ -142,11 +143,13 @@ which will provide info regarding the dumping process (since `-log -NewConsole` You can safely close the Powershell window once you see the console log window, although you may wish to keep it open to restart it if it crashes. -Normally the dumper would be run with the `-nullrhi` flag to avoid wasting processing power on rendering the game's menu -but this argument seems to be broken as of Satisfactory 1.0, -so it has been excluded from the command. -The game window will appear and will be exceedingly low FPS and behind in playing sound effects. -Keep it minimized as the asset dumper operates and focus on the console window. +The game user interface will never open since we used the `-nullrhi -norhithread` arguments, +leaving only the console window visible. +// Normally the dumper would be run with the `-nullrhi` flag to avoid wasting processing power on rendering the game's menu +// but this argument seems to be broken as of Satisfactory 1.0, +// so it has been excluded from the command. +// The game window will appear and will be exceedingly low FPS and behind in playing sound effects. +// Keep it minimized as the asset dumper operates and focus on the console window. // The game window itself will never open since the `-nullrhi` argument was used. After the game's loading process, you should see a sequence of `LogAssetDumper` messages. @@ -346,6 +349,9 @@ because they are stored raw in the pak file (not the utoc/ucas) and the automati [TIP] ==== +There may be some files in the CustomAssets list that you don't have in your backup copy of the Starter Project. +They were probably removed from the game and the CustomAssets list has not been updated to reflect this. + Check the https://github.com/satisfactorymodding/UnrealProjectUpdater/pulls?q=sort%3Aupdated-desc+is%3Apr+is%3Aopen[open pull requests] for the UnrealProjectUpdater repository to see if there are any additional CustomAssets that haven't been merged into the project's list yet. ==== diff --git a/modules/ROOT/pages/Development/BeginnersGuide/CreateGitRepo.adoc b/modules/ROOT/pages/Development/BeginnersGuide/CreateGitRepo.adoc index e5b5cffb4..bf484fcfa 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/CreateGitRepo.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/CreateGitRepo.adoc @@ -144,7 +144,7 @@ https://docs.github.com/en/desktop/contributing-and-collaborating-using-github-d The custom engine version used in the Satisfactory Modding community has been modified to allow Unreal Engine's Git integration to recognize and work with multiple git repos in a single project. -To enable, navigate to "Tools" > (Source Control heading) > "Connect to Source Control...". +To enable, navigate to "Tools" > (Revision Control heading) > "Connect to Revision Control...". Select Git from the dropdown, then click "Accept Settings". You can now right click on assets in the Content Browser to view their change history, diff assets, and more. diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/NextSteps.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/NextSteps.adoc index 3aa8efa1b..47f5e7173 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/NextSteps.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/NextSteps.adoc @@ -5,17 +5,15 @@ You've reached the end of the getting started guide - congratulations! If you're still looking to learn about a specific concept, check and see if we have a page on it in the other sections of the documentation. -Once you have a mod you're ready to upload, follow the -xref:Development/BeginnersGuide/ReleaseMod.adoc[Releasing Your Mod] -directions to export and upload it for other people to use. - -You can also ask questions on the https://discord.ficsit.app[Discord Server]. - -You may also be interested in {cpp} modding, -which allows modifying and creating much more advanced game behaviors. -More info can be found on that xref:Development/Cpp/index.adoc[here]. - -Consider checking out what mods on ficsit.app have their source code available and -xref:Development/BeginnersGuide/ImportingAnotherMod.adoc[checking them out in your editor] -to learn from their code. -A curated list of open source examples can be found xref:Development/OpenSourceExamples.adoc[here]. +* Once you have a mod you're ready to upload, follow the + xref:Development/BeginnersGuide/ReleaseMod.adoc[Releasing Your Mod] + directions to export and upload it for other people to use. +* You can also ask questions on the https://discord.ficsit.app[Discord Server]. +* You may also be interested in {cpp} modding, + which allows modifying and creating much more advanced game behaviors. + More info can be found on that xref:Development/Cpp/index.adoc[here]. +* Consider checking out what mods on ficsit.app have their source code available and + xref:Development/BeginnersGuide/ImportingAnotherMod.adoc[checking them out in your editor] + to learn from their code. + A curated list of open source examples can be found xref:Development/OpenSourceExamples.adoc[here]. +* Check out resources linked on the xref:Development/UnrealEngine/UnrealLearningResources.adoc[Unreal Learning Resources page] diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/buildable.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/buildable.adoc index 11d35bc94..99fc270ad 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/buildable.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/buildable.adoc @@ -35,11 +35,19 @@ You can learn more about how holograms work on the xref:Development/Satisfactory ==== As you can see in the `Components` pane in the top left, the actor already contains a few components. -But not any visuals, so, now add a new FGColoredInstancedMeshProxy component in the center of the viewport. -The build gun uses the origin when targeting the mesh to be built or snapped. -You can use link:{attachmentsdir}/BeginnersGuide/simpleMod/Mesh_DocBuild.fbx[this example Mesh], the Plantpot of Knowledge, for your buildable. +These are inherited from the parent class `FGBuildable`. + +Note that the building does not currently have any visuals. +To fix this, add a new `FGColoredInstancedMeshProxy` component in the center of the viewport. +This component is an optimized version of the base Unreal static mesh component that supports Satisfactory's Customizer painting system. +To tell it what mesh to display, assign one in the "Static Mesh" field of the component's Details panel. +Import link:{attachmentsdir}/BeginnersGuide/simpleMod/Mesh_DocBuild.fbx[this example Mesh], the Plantpot of Knowledge, +which we'll use for this building. +Use the default import settings when prompted. -This Actor is also where you can define the snapping area and the clearance area, but we won't do that for now. Look to other machines and examples for inspiration as there are several relevant settings to make those behaviors work correctly. +The build gun uses the origin when targeting the mesh to be built or snapped. +This Actor is also where you can define the snapping area and the clearance area (mClearanceData), but we won't do that for now. +Look to other machines and examples for inspiration as there are several relevant settings to make those behaviors work correctly. == Make it Paintable @@ -116,7 +124,8 @@ That's it! You don't need to register anything else. When the recipe gets loaded == Trying it Out -If you load up the game now, you should be able to build the Doc Build in game, but it is purely an object that sits there and exists. You should be able to paint it with the paint tool, and it should look roughly like it does in the icon image. +If you load up the game now, you should be able to build the Doc Build in game. +You should be able to paint it with the paint tool, and it should look roughly like it does in the icon image. == Troubleshooting diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/gameworldmodule.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/gameworldmodule.adoc index 6e7e797c1..eee8e8ae9 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/gameworldmodule.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/gameworldmodule.adoc @@ -195,25 +195,28 @@ By giving it a name that includes the mod reference, it becomes easier to identify in crash logs and helps you tell the modules of different mods apart in the editor. -You will be able to register recipes and other content using this module. - Next, double click on the module to open up its blueprint settings. To make sure that SML automatically detects and loads our module, -we must be sure to mark that it is the Root Module via the `Root Module` details field. +mark it as the Root Module via the `Root Module` checkbox in the Details pane. image:BeginnersGuide/simpleMod/MakeRootModule.png[Make Root Module] [WARNING] ==== -Make sure that you mark your new Module as the Root via the blueprint details field! -There can be one Root module per type (Instance, GameWorld, MenuWorld). -If you don't do this, the module will be silently ignored, -and the content you create later won't be loaded. -This mistake won't be apparent until you have some content to test later. +Make sure to mark your new Module as the Root Module! +Most content not referenced by a module (or the Content Registration API) +will be inaccessible and silently ignored by the game. + +To assist with catching this mistake, +the editor performs data validation when you save Mod Modules. +If you exceed more than one Root module per type (Instance, GameWorld, MenuWorld), +or have modules of a type but none are marked as Root, +the module will **fail data validation** and cause an error in the editor +informing you of what you need to change. ==== -If you'd like to learn more about root modules, you can read about it on the +If you'd like to learn more about root modules, you can read about them on the xref:Development/ModLoader/ModModules.adoc[Mod Modules] system page. == Compile and Save diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleInteraction.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleInteraction.adoc index e0b5975cd..aa19650b6 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleInteraction.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleInteraction.adoc @@ -3,6 +3,14 @@ Let's create a simple interaction GUI for our xref:Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc[Item Counter Machine]. We'll use it to read the current data and to reset the counters. +[WARNING] +==== +This tutorial assumes you have a basic understanding of Unreal Engine's Blueprint editor interface and Blueprint scripting system. + +If you are unfamiliar with this system, please check out the resources linked in the +xref:Development/UnrealEngine/UnrealLearningResources.adoc#UnrealBlueprint[Unreal Learning Resources section: "Blueprint Scripting"] +==== + [TIP] ===== A completed version of this interaction GUI is included in the ExampleMod in the starter project. @@ -26,7 +34,7 @@ This guide focuses on the Satisfactory Modding specific portions of creating a w Check out the following documentation from Unreal as a starting point for learning how to design widgets. -* https://dev.epicgames.com/documentation/en-us/unreal-engine/umg-ui-designer-quick-start-guide-in-unreal-engine#2-displayinghealth,energy&ammo[UMG UI Designer Quick Start Guide: 2 - Displaying Health, Energy & Ammo] +* https://dev.epicgames.com/documentation/en-us/unreal-engine/umg-ui-designer-quick-start-guide-in-unreal-engine?application_version=5.3#2-displayinghealth,energy&ammo[UMG UI Designer Quick Start Guide: 2 - Displaying Health, Energy & Ammo] * https://dev.epicgames.com/documentation/en-us/unreal-engine/umg-editor-reference-for-unreal-engine?application_version=5.3[UMG Editor Reference] == Retrieving Information from our Machine diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc index 22ee790d9..6b5d0b3f3 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc @@ -2,6 +2,14 @@ In this chapter we'll create a machine which simply counts the items and types of items that pass through it, outputting them again on the other side. +[WARNING] +==== +This tutorial assumes you have a basic understanding of Unreal Engine's Blueprint editor interface and Blueprint scripting system. + +If you are unfamiliar with this system, please check out the resources linked in the +xref:Development/UnrealEngine/UnrealLearningResources.adoc#UnrealBlueprint[Unreal Learning Resources section: "Blueprint Scripting"] +==== + [TIP] ===== A completed version of this machine is included in the ExampleMod in the starter project. @@ -53,9 +61,8 @@ 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. -image:BeginnersGuide/simpleMod/machines/SimpleMachine_Init.jpg[image] - -(Logic in the Event Graph) +.Logic in the Event Graph +image::BeginnersGuide/simpleMod/machines/SimpleMachine_Init.jpg[image] == Grab Logic diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SolarPanel.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SolarPanel.adoc index f266aaad9..6114aad0c 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SolarPanel.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SolarPanel.adoc @@ -3,6 +3,14 @@ In this chapter we will create a simple custom power generator - a Solar Panel that only produces energy during the daytime. +[WARNING] +==== +This tutorial assumes you have a basic understanding of Unreal Engine's Blueprint editor interface and Blueprint scripting system. + +If you are unfamiliar with this system, please check out the resources linked in the +xref:Development/UnrealEngine/UnrealLearningResources.adoc#UnrealBlueprint[Unreal Learning Resources section: "Blueprint Scripting"] +==== + == Create the Buildable As in previous examples, we need to create another xref:Development/BeginnersGuide/SimpleMod/buildable.adoc[buildable] (let's name it `Build_DocSolarPanel`) with a mesh, descriptor, recipe, and to add that recipe to our schematic. diff --git a/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/ObtainStarterProject.adoc b/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/ObtainStarterProject.adoc index 8f7c69f89..b07ebcd36 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/ObtainStarterProject.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/ObtainStarterProject.adoc @@ -26,6 +26,8 @@ As such, you should extract the folder somewhere convenient so that you can find ** Windows sometimes automatically cleans up this folder depending on your system settings, deleting your files. * ❌ Cloud-synced folder ** Cloud sync services like Dropbox, Google Drive, and OneDrive can corrupt your project files. +* ❌ Windows Desktop + ** Some cloud sync services will automatically sync your Desktop without telling you about it. * ❌ Documents folder ** Some cloud sync services will automatically sync your Documents folder without telling you about it. * ❌ Nested within many folders diff --git a/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaClone.adoc b/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaClone.adoc index f6c38568e..92505d8be 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaClone.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaClone.adoc @@ -14,31 +14,19 @@ check out our xref:Development/BeginnersGuide/LearnGit.adoc[mini tutorial] that == What Branch to Clone -==== -If you are looking to develop mods for Update 1.0, -follow the link:https://docs.ficsit.app/satisfactory-modding/v3.10.0/index.html[SML v3.10.0] documentation instead. -However, we strongly suggest developing mods for Update 1.1 instead as it will be released to the stable branch on June 10th. -==== - -// When updating the below, remember to update StaterProjectViaClone.adoc, StarterProjectViaZip.adoc, and dependencies.adoc (engine) -==== -This is the *latest stable* version of the docs. -// This is the *development* version of the docs. - -// Stable (Release) and Experimental are currently both the same version - 1.0 Release. +// needed for :archiveactionphrase: +include::../_includes/repo-versions.adoc[] -Clone the **`master` branch** to develop a mod for the stable version of SML. -// You should clone the **`dev` branch** because SML 3.8.? is not released yet. +:verbphrase: clone +:verbphraseCaps: Clone +:actionphrase: . +:archiveactionphrase: the v{this-archive-version} tag. -// You should clone either the **`dev` branch** or the **`master` branch**. -// Of those two, you probably want whichever branch was pushed to most recently, which you can see -// https://github.com/satisfactorymodding/SatisfactoryModLoader/branches[on the GitHub repository]. +include::../_includes/branch-notice.adoc[] -If you're uncertain about which branch to clone, **ask us on the Discord**. -==== +Go to this GitHub repository: +https://github.com/satisfactorymodding/SatisfactoryModLoader/ -https://github.com/satisfactorymodding/SatisfactoryModLoader/[Here] -is a link to the GitHub page of repository to clone. Get the clone URL via the **`<> Code`** dropdown button on the GitHub page. If you just followed the xref:Development/BeginnersGuide/LearnGit.adoc[mini git tutorial], @@ -48,7 +36,7 @@ to use GitHub Desktop to clone the repository. Otherwise, use the git clone method of your choice. Your Git client will probably start you on the `master` branch by default, -so you may have to switch branches to the branch you actually intended to clone. +so you may have to switch branches to the branch or tag you actually intended to clone. You can move the cloned repository folder later, and you can name it whatever you'd like. Make sure to read the notes on the @@ -61,7 +49,7 @@ and you have switched to the branch you intend to use. [IMPORTANT] ==== Many Git clients will automatically clone the repository's default branch. -Make sure it has actually cloned the branch you intended to before proceeding. +Make sure you're on the branch/tag you intended before proceeding. ==== == Next Steps diff --git a/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaZip.adoc b/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaZip.adoc index dfc03f55d..12889925a 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaZip.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/StarterProject/StarterProjectViaZip.adoc @@ -8,29 +8,15 @@ or you will have to repeat some of the setup process again. == What Version to Download -==== -If you are looking to develop mods for Update 1.0, -follow the link:https://docs.ficsit.app/satisfactory-modding/v3.10.0/index.html[SML v3.10.0] documentation instead. -However, we strongly suggest developing mods for Update 1.1 instead as it will be released to the stable branch on June 10th. -==== - -// When updating the below, remember to update StaterProjectViaClone.adoc, StarterProjectViaZip.adoc, and dependencies.adoc (engine) -==== -This is the *latest stable* version of the docs. -// This is the *development* version of the docs. +// needed for :actionphrase: +include::../_includes/repo-versions.adoc[] -Download a zip of the **`master` branch** to develop a mod for the stable version of SML -by clicking https://github.com/satisfactorymodding/SatisfactoryModLoader/archive/refs/heads/master.zip[here]. +:verbphrase: download a zip of +:verbphraseCaps: Download a zip of +:actionphrase: {sp}from here: https://github.com/satisfactorymodding/SatisfactoryModLoader/archive/refs/heads/{suggested-branch}.zip +:archiveactionphrase: this tag: https://github.com/satisfactorymodding/SatisfactoryModLoader/archive/refs/heads/tags/v{this-archive-version}.zip -// Download a zip of the **`dev` branch** (because SML 3.8.? is not released yet) -// by clicking https://github.com/satisfactorymodding/SatisfactoryModLoader/archive/refs/heads/dev.zip[here]. - -// You should download a zip either of the **`dev` branch** or the **`master` branch**. -// Of those two, you probably want whichever branch was pushed to most recently, which you can see -// https://github.com/satisfactorymodding/SatisfactoryModLoader/branches[on the GitHub repository]. - -If you're uncertain about which branch to download, **ask us on the Discord**. -==== +include::../_includes/branch-notice.adoc[] == Unzipping the Files diff --git a/modules/ROOT/pages/Development/BeginnersGuide/StarterProjectStructure.adoc b/modules/ROOT/pages/Development/BeginnersGuide/StarterProjectStructure.adoc index 1226aca92..3332914f1 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/StarterProjectStructure.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/StarterProjectStructure.adoc @@ -39,7 +39,7 @@ because there is an Iron Rod placeholder asset present in the Starter Project. The placeholder generator makes a best effort to fill in fields with the correct values, but it's not always possible to do so, -or the content is purposefully excluded. +and some content is purposefully excluded. For example, recipe ingredients and quantities will be present, but models and textures are intentionally replaced with blanks. You could open up the placeholders to look at them in the editor, @@ -93,7 +93,9 @@ On disk, they can be found in the `Source/` folder. These don't appear in the Content Browser unless you have "Show {cpp} Classes" enabled in your content browser settings. These are **header files** (.h) and **auto-generated {cpp} stubs** (.cpp). -Similar to the Content placeholders, they are automatically generated skeleton versions of the files in the correct locations. +The header files are provided by Coffee Stain in the `CommunityResources/` folder of the game installation, +but the {cpp} files, similar to the Content placeholders, +are automatically generated skeletons of the files in the correct locations. These files are required for the editor to offer the correct game assets and classes for you to reference in your mods. Code in these files is executed by the editor in some circumstances, diff --git a/modules/ROOT/pages/Development/BeginnersGuide/_includes/branch-notice.adoc b/modules/ROOT/pages/Development/BeginnersGuide/_includes/branch-notice.adoc new file mode 100644 index 000000000..3e7db8068 --- /dev/null +++ b/modules/ROOT/pages/Development/BeginnersGuide/_includes/branch-notice.adoc @@ -0,0 +1,32 @@ +include::../_includes/repo-versions.adoc[] + +// Live docs +==== +include::../_includes/current-branch-header.adoc[] + +{verbphraseCaps} the **`{suggested-branch}` branch** to develop a mod for the stable version of SML{actionphrase} + +// You should {verbphrase} either +// the **`dev` branch** or the **`master` branch**. +// Of those two, you probably want whichever branch was pushed to most recently, +// which you can see in the ("Updated" column) +// https://github.com/satisfactorymodding/SatisfactoryModLoader/branches[on the GitHub repository]. + +If you're uncertain about which branch to use, **ask us on the Discord**. +==== + +// Dev docs +// ==== +// include::../_includes/current-branch-header.adoc[] + +// You should {verbphrase} the **`{suggested-branch}` branch** (because SML 3.?.? is not released yet){actionphrase} + +// If you're uncertain about which branch to use, **ask us on the Discord**. +// ==== + +// Archive +// ==== +// include::../_includes/current-branch-header.adoc[] + +// To develop for {this-archive-version}, {verbphrase} {archiveactionphrase} +// ==== diff --git a/modules/ROOT/pages/Development/BeginnersGuide/_includes/current-branch-header.adoc b/modules/ROOT/pages/Development/BeginnersGuide/_includes/current-branch-header.adoc new file mode 100644 index 000000000..172b958f7 --- /dev/null +++ b/modules/ROOT/pages/Development/BeginnersGuide/_includes/current-branch-header.adoc @@ -0,0 +1,24 @@ +include::../_includes/repo-versions.adoc[] + +// Live docs +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +This is the *latest stable* version of the docs. + +Stable (Release) and Experimental are currently both the same version - 1.1 Release. +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +// Dev docs +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// This is the *development* version of the docs. + +// Stable (Release) and Experimental are on different versions of the game. +// If you want to develop mods for the stable release of SML, +// you should follow the https://docs.ficsit.app/satisfactory-modding/latest/index.html[non-`dev` docs branch]. +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +// Archive +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// This is the *archived v{this-archive-version}* version of the docs. + +// If you want to develop mods for a newer release, +// you should follow the https://docs.ficsit.app/satisfactory-modding/latest/index.html[latest docs branch]. +// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/modules/ROOT/pages/Development/BeginnersGuide/_includes/repo-versions.adoc b/modules/ROOT/pages/Development/BeginnersGuide/_includes/repo-versions.adoc new file mode 100644 index 000000000..bda372236 --- /dev/null +++ b/modules/ROOT/pages/Development/BeginnersGuide/_includes/repo-versions.adoc @@ -0,0 +1,10 @@ +:suggested-branch: master +// :suggested-branch: dev + +// If this is an archived docs branch, this should be set to the SML version it corresponds to. +:this-archive-version: NOT-AN-ARCHIVE +// :this-archive-version: 3.9.1 + +// If this is an archived docs branch, this should be set to the Unreal Engine this SML version needs +:engine-version: latest +// :engine-version: tag/5.3.2-css-66 diff --git a/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc b/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc index aca88f1ba..fc3445728 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc @@ -12,7 +12,7 @@ make a note of where you left off so it's easier to resume later. Beware that the modding environment can take up a lot of space once everything is installed and built - 30+ GB is possible. Keep this in mind when deciding where put all your files -- don't keep them on a drive with very little space left. +- don't keep them on a drive with very little space left. == Before you Begin @@ -103,7 +103,7 @@ Satisfactory's dedicated servers typically run on Linux. Cross-compiling from Windows to Linux requires the compatible version of Unreal Engine specific CLang Toolchain to be installed prior to building for Linux Dedicated Servers. -The download link for these files can be found on the Unreal documentation page for +The download link for these files can be found on the Unreal documentation page for https://dev.epicgames.com/documentation/en-us/unreal-engine/linux-development-requirements-for-unreal-engine?application_version=5.3#nativetoolchain[Cross-Compiling for Linux]. Currently, Satisfactory uses Unreal Engine 5.3.2 with custom changes provided by Coffee Stain Studios. @@ -179,21 +179,10 @@ It's imperative that you download the correct engine for the version of the game or you will have to repeat a large amount of the setup process again. ==== -If you are looking to develop mods for Update 1.0, -follow the link:https://docs.ficsit.app/satisfactory-modding/v3.10.0/index.html[SML v3.10.0] documentation instead. -However, we strongly suggest developing mods for Update 1.1 instead as it will be released to the stable branch on June 10th. -==== +include::/_includes/current-branch-header.adoc[] -// When updating the below, remember to update StaterProjectViaClone.adoc, StarterProjectViaZip.adoc, and dependencies.adoc (engine) -==== -This is the *latest stable* version of the docs. -// This is the *development* version of the docs. - -// Stable (Release) and Experimental are currently both the same version - 1.0 Release. - -You should download from the *latest engine release*, -which an be found at the top of this page: -https://github.com/satisfactorymodding/UnrealEngine/releases +Download this engine version: + +https://github.com/satisfactorymodding/UnrealEngine/releases/{engine-version} ==== Download the following files from the release linked above: @@ -267,6 +256,9 @@ and in order to develop mods, you'll need to install and integrate Wwise with your mod project, even if you do not plan to modify sounds. +[id="WwiseLauncher"] +=== Download the Audiokinetic Launcher + Visit https://www.audiokinetic.com/en/download/[Wwise] and click on the `+Download Audiokinetic Launcher+` button. Clicking the button will probably redirect you to a sign in page. @@ -274,6 +266,9 @@ Create an account if you don't have one yet, or sign in, to download and run the After the installer is complete it should open the launcher for you. +[id="WwiseVersion"] +=== Install the Wwise Version + In the launcher's left sidebar, select the topmost `Wwise` section (note: not the "Wwise Audio Lab" section). Under the "INSTALL A NEW VERSION" heading, @@ -282,6 +277,8 @@ Select `2023.1` from the "Major" dropdown. Select version `2023.1.3.8471` from the "Version" dropdown. Click `Install`. +image::BeginnersGuide/Wwise/wwise_version.png[Select Wwise version screenshot, title=Installing a new Wwise version. Wwise UI may differ slightly from this screenshot.] + [WARNING] ==== Watch out - most older versions of Wwise don't have support for Unreal Engine 5, which this project needs. @@ -311,14 +308,19 @@ Once presented with options on what to install, select: *** _Windows_ **** pass:[] Visual Studio 2019 **** pass:[] Visual Studio 2022 +**** pass:[] Game Core -If anything is selected by default, do not uncheck them. They are required for Visual Studio to work. +If anything else is selected by default, do not uncheck them. They are required for Visual Studio to work. + +image::BeginnersGuide/Wwise/wwise_packages.png[Select Wwise packages screenshot, title=Selecting packages and deployment platforms. Wwise UI may differ slightly from this screenshot.] Click `Next` (you may need to scroll down to see the button). You don't need to add any plugins, -so press `Select None` in the top right then `Install` in the bottom left to begin the installation process. +so press `Select None` in the top right then `Install` (or `Modify` if you already have it installed) in the bottom left to begin the installation process. Accept any User Account Control or Terms and Conditions prompts that appear along the way. +image::BeginnersGuide/Wwise/wwise_no_plugins.png[Do not select any Wwise plugins screenshot, title=Deselect all plugins. Wwise UI may differ slightly from this screenshot.] + == Satisfactory Mod Manager xref:index.adoc#_satisfactory_mod_manager_aka_smm[Satisfactory Mod Manager] diff --git a/modules/ROOT/pages/Development/BeginnersGuide/generating_icons.adoc b/modules/ROOT/pages/Development/BeginnersGuide/generating_icons.adoc index 5e352b952..7e4e3eb19 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/generating_icons.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/generating_icons.adoc @@ -9,6 +9,13 @@ This page will eventually walk through using an Icon Generator tool to create ic Until then, look at the xref:CommunityResources/IconGenerator.adoc[list of community created tools] and the tools' own documentation. +== Useful Mods for Icon Capture + +You may also find the following mods useful in creating icons: + +- https://ficsit.app/mod/ChromaKey[Chroma Key] - "Green screen" buildables in a variety of colors, including one that supports customizer painting +- https://ficsit.app/mod/Th3SMBuilder[Buildable Static Meshes] - Build any arbitrary static mesh as a standalone buildable + == Information from Coffee Stain Studios // cspell:ignore Nathalie diff --git a/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc b/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc index ba84bfe11..13e527ca8 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc @@ -10,9 +10,19 @@ However, it is the most practical way to achieve certain functionality. Some other modders have already created mods that assist with the process of overwriting or modifying content. They can save you a lot of time. +=== ContentLib + +https://ficsit.app/mod/ContentLib[ContentLib] by Nog and Robb allows creating and modifying content via writing JSON files. +It also offers a Blueprint and {cpp} API to programmatically generate, modify, or parse content at runtime. +Additionally, it offers a limited form of CDO modification (described below) via JSON files. + +Documentation, including a step-by-step walkthrough of some common tasks, can be found https://docs.ficsit.app/contentlib/latest/index.html[here]. + +The mod has been officially released, and its documentation describes how to configure your mod to depend on it. + === TweakIt -TweakIt by Feyko allows you to write +TweakIt by Feyko allowed you to write https://lua.org/[Lua] scripts to programmatically modify game content. Documentation can be found via the 'docs switcher' on this site's sidebar, or @@ -21,17 +31,7 @@ https://docs.ficsit.app/tweakit/latest/index.html[here] The mod has yet to be officially released, but you can download early builds from the https://discord.gg/2kV6AHbzZK[TweakIt discord], and find its source code https://github.com/Feyko/TweakIt[here]. -Note that the plugin has not been updated to support Satisfactory 1.0 as of March 2025. - -=== ContentLib - -https://ficsit.app/mod/ContentLib[ContentLib] by Nog and Robb allows creating and modifying content via writing JSON files. -It also offers a Blueprint and {cpp} API to programmatically generate, modify, or parse content at runtime. -Additionally, it offers a limited form of CDO modification (described below) via JSON files. - -Documentation, including a step-by-step walkthrough of some common tasks, can be found https://docs.ficsit.app/contentlib/latest/index.html[here]. - -The mod has been officially released, and its documentation describes how to configure your mod to depend on it. +Note that the mod has not been updated to support Satisfactory 1.0 as of August 2025. == Use CDO Manipulation diff --git a/modules/ROOT/pages/Development/BeginnersGuide/project_setup.adoc b/modules/ROOT/pages/Development/BeginnersGuide/project_setup.adoc index 769839afe..eb17add7f 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/project_setup.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/project_setup.adoc @@ -188,13 +188,60 @@ xref:CommunityResources/incredibuild.adoc[here]. Open up the `FactoryGame.sln` file in your project folder. -[TIP] -==== +[id="vs_popups"] +=== Popups and Notices + +You'll be presented with a few notices upon opening the solution for the first time. +We'll go through each of these below, as some of them can safely be ignored, +while others could break your install if you take the wrong action. + +[id="vs_popups_unsupported_projects"] +==== Unsupported Projects + +Visual Studio may tell you "These projects are either not supported or need project behavior impacting modifications <...>" +in a pop-up window upon opening the solution. + +**It is safe to click "OK" on this message and dismiss it.** + +Even though some of the components are outdated or out of support, +they are the ones required by Satisfactory and Unreal and must be used. + +[id="vs_popups_additional_components"] +==== Additional Components + Visual Studio may tell you "Based on your solution, you might need to install extra components for a full development experience" at the top of the Solution Explorer window. -It is safe to ignore this message. + +**It is safe to ignore this message.** + Alternatively, you can install the requested components to keep Visual Studio from complaining about this at the cost of additional disk space. -==== + +[id="vs_popups_package_vulnerabilities"] +==== Packages with Vulnerabilities + +Visual Studio may tell you "This solution contains packages with vulnerabilities" at the top of the Solution Explorer window. + +**It is safe to ignore this message.** + +We must use these exact package versions to match what the game and engine are using, so they should not be updated. + +[id="vs_popups_ue_integration_config"] +==== Unreal Engine Integration Configuration + +An editor tab titled "Unreal Engine Integration Configuration" opens on startup by default. +It assists with initial setup of tools installed with the 'Game Development with {cpp}' workload. + +**Uncheck the "Show on startup" checkbox at the top and close the tab.** +Unfortunately some of the changes required to make the custom engine work are not compatible with these tools. +Do NOT set up the "Visual Studio Integration Tool" or "Unreal Engine Test Adapter", +as they will make changes to the project and engine that break your ability to compile the editor and/or package mods. + +If you accidentally enable one of these, +redownload the starter project and reinstall the engine on top of your existing install to repair it. + +image:BeginnersGuide/CloseIntegrationConfig.png[Uncheck "Show on startup" and close the "Unreal Engine Integration Configuration" tab] + +=== Building the Solution Once Visual Studio loads, you should see a folder tree in the Solution Explorer containing entries for @@ -248,13 +295,12 @@ you must close the Editor and rebuild `Development Editor` from Visual Studio for the changes to take effect. Alpakit (a tool discussed later) will take care of building Shipping for you when required later, -but you can still build it from Visual Studio if you want to. -To build shipping from Visual Studio, -use the `Shipping` configuration and build the `FactoryGameSteam` or `FactoryGameEGS` project instead of `FactoryGame`. +but it's still possible to manually build them from Visual Studio. +More information can be found on the xref:Development/Cpp/setup.adoc#Compile[{cpp} Modding Setup] page. ==== [id='Compiling_Troubleshooting'] -=== Troubleshooting +=== Build Troubleshooting Almost all warnings, and occasionally some errors, reported by the editor can be safely ignored during the build process. This section will help you decide how to proceed if you encounter errors while building. @@ -346,35 +392,62 @@ link:#_project_compilation[compile the editor from Visual Studio] to find out why it's erroring and return here when finished with that step. Consider seeking help on the Discord if you are stuck here. -Once you load into the Editor, -you might see a popup that says 'New plugins are available.' -You can safely dismiss this popup. +[id="FirstTimeUserPopups"] +=== First Time User Pop-Ups -== Familiarize Yourself with the Editor +Opening the editor for the first time may present you with a few pop-up messages to address. -Now is a good time to familiarize yourself with -the Unreal Engine editor through various other tutorials. -We suggest you take the 'Welcome to the Unreal Editor' -guided tutorial that the editor should be telling you about -if you haven't taken or dismissed it yet. +==== "GeneratedSoundBanks folder does not seem to be set" -We also suggest the following resources: +If you see a message: "GeneratedSoundBanks folder does not seem to be set. Would you like to open the settings window to set it?", +you need to change a couple Wwise settings. -- https://docs.unrealengine.com/5.3/en-US/unreal-editor-interface/[Unreal Editor Interface] - -Provides a high-level overview of what each of the editor panels do. -- https://docs.unrealengine.com/5.3/en-US/content-browser-in-unreal-engine/[Content Browser] - -How to access the Content Browser, including adding multiple Content Browser panels to your viewport. -- https://docs.unrealengine.com/5.3/en-US/content-browser-interface-in-unreal-engine/[Content Browser Interface] - -How to use the various features offered by the Content Browser. +Click `Yes` on the popup to open the settings window. +Or, if you've already closed the popup, +// Make sure the below content stays in sync with Audio.adoc#_Unreal_Project_Configuration +open the Unreal Engine project settings (`Edit` > `Project Settings...`) +and navigate to the "Wwise" category's page `Integration Settings`. + +In the "Installation" subsection, +change the `Root Output Path` setting to `/GeneratedSoundBanks`. +Note that it may be pre-filled with an incorrect Wwise project path, +so use the directory picker to ensure you've selected your actual Wwise project. + +Next, head to the "Initialization" subsection +and change the `Unreal Audio Routing` setting to `Both Wwise and Unreal audio`. + +// End stays in sync + +This pop-up should no longer appear next time you open the editor. + +==== "New Plugins Are Available" + +If you see a pop-up that says 'New plugins are available.', +you can safely dismiss this popup, as the plugins required for modding are already installed and enabled. + +==== Level Viewport Errors -[NOTE] -==== You may see error messages in the editor's Level `Viewport 1` tab such as "LANDSCAPE: 64 ACTORS WITH PHYSICAL MATERIALS NEED TO BE REBUILT". It is usually safe to ignore errors in the Level Viewport tab because errors displayed there are unrelated to typical mod content. -==== + +== Familiarize Yourself with the Editor + +Now is a good time to familiarize yourself with +the Unreal Engine editor through various other tutorials. + +We suggest the following resources: + +// keep in sync with UnrealLearningResources.adoc#UnrealEditor +- https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-editor-interface?application_version=5.3[Unreal Editor Interface] - +Provides a high-level overview of what each of the editor panels do. +- https://dev.epicgames.com/documentation/en-us/unreal-engine/content-browser-in-unreal-engine?application_version=5.3[Content Browser] - +How to access the Content Browser, including adding multiple Content Browser panels to your viewport. +- https://dev.epicgames.com/documentation/en-us/unreal-engine/content-browser-interface-in-unreal-engine?application_version=5.3[Content Browser Interface] - +How to use the various features offered by the Content Browser. +// end keep in sync == (Optional) Modify Editor Color Scheme diff --git a/modules/ROOT/pages/Development/Cpp/Cookbook.adoc b/modules/ROOT/pages/Development/Cpp/Cookbook.adoc index 3e53ff61c..7d47f6f8c 100644 --- a/modules/ROOT/pages/Development/Cpp/Cookbook.adoc +++ b/modules/ROOT/pages/Development/Cpp/Cookbook.adoc @@ -93,3 +93,25 @@ const FBuildableBeamLightweightData* beamData = RuntimeData->TypeSpecificData.Ge float length = beamData->BeamLength; return length; ``` + +== Latent Functions + +https://mikelis.net/easy-c-latent-functions-in-unreal-engine-blueprints/ + + +== Creating K2 Nodes + +https://www.gamedev.net/tutorials/programming/engines-and-middleware/improving-ue4-blueprint-usability-with-custom-nodes-r5694/ + +https://forums.unrealengine.com/t/how-do-i-create-my-own-blueprint-node-with-c/294883/2 + +https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Editor/Kismet + +https://dev.epicgames.com/community/learning/tutorials/2lZj/unreal-engine-creating-a-uk2node-returning-a-reference + +https://forums.unrealengine.com/t/how-to-create-k2node-that-appears-as-multiple-node-entries-per-every-component-property-within-blueprint/770002 + +== Custom Cpp Struct Equality Operator + +https://forums.unrealengine.com/t/creating-a-custom-equality-operator-between-structures/151127 +https://forums.unrealengine.com/t/creating-a-custom-equality-operator-between-structures/151127 diff --git a/modules/ROOT/pages/Development/Cpp/setup.adoc b/modules/ROOT/pages/Development/Cpp/setup.adoc index 8ae7b1cab..62f699190 100644 --- a/modules/ROOT/pages/Development/Cpp/setup.adoc +++ b/modules/ROOT/pages/Development/Cpp/setup.adoc @@ -53,18 +53,8 @@ Regardless of the option you chose, consider reading the link:#CreateCppMod_Manual[Creating the Mod-Module From Scratch] section to get a better understanding of the purpose of the files involved in a {cpp} mod. -[id="CreateCppMod_AlpakitTemplate"] -=== Option 1: Using the Alpakit Template - -The Alpakit Create Mod wizard can automatically create a blank {cpp} mod for you. -You can learn more about the wizard on the -xref:Development/BeginnersGuide/SimpleMod/gameworldmodule.adoc#_unreal_plugin_creation[Plugin Setup and Game World Module] page. -Select the "{cpp} and Blueprint" template. - -After using the wizard, advance to the link:#AddClass[Adding New Classes] section of this page. - [id="CreateCppMod_AlpakitConvert"] -=== Option 2: Alpakit "Convert to C++ & Blueprint Mod" on Existing Blueprint Mod +=== Option 1: Alpakit "Convert to C++ & Blueprint Mod" on an Existing Blueprint Mod If you already have an existing blueprint mod that you'd like to add {cpp} to, open the Alpakit Edit Mod dialog for the mod from the Alpakit Dev window and click the "Convert to C++ & Blueprint Mod" button. @@ -74,7 +64,17 @@ After using the button, close the editor, xref:Development/BeginnersGuide/project_setup.adoc#_generate_visual_studio_files[regenerate Visual Studio project files], and build for the Development Editor target so your mod's new {cpp} module is recognized by the editor. -Next, advance to the link:#AddClass[Adding New Classes] section of this page. +Next, advance to the link:#Compile[Compiling] section of this page. + +[id="CreateCppMod_AlpakitTemplate"] +=== Option 2: Using the Alpakit Template + +The Alpakit Create Mod wizard can automatically create a blank {cpp} and Blueprint mod for you. +You can learn more about the wizard on the +xref:Development/BeginnersGuide/SimpleMod/gameworldmodule.adoc#_unreal_plugin_creation[Plugin Setup and Game World Module] page. +Select the "{cpp} and Blueprint" template. + +After using the wizard, advance to the link:#Compile[Compiling] section of this page. [id="CreateCppMod_Manual"] === Option 3: Creating the Mod-Module From Scratch @@ -99,7 +99,7 @@ Make sure to replace all instances of `PLUGIN_NAME` with your actual mod referen [WARNING] ==== -Note that the file we just created is a C# file (.cs) and not a C++ file (.cpp). +Note that the file we just created is a C# file (.cs) and not a {cpp} file (.cpp). ==== This configuration will add the basic Unreal Engine framework, @@ -146,7 +146,7 @@ void FYourModReferenceModule::StartupModule() { IMPLEMENT_GAME_MODULE(FYourModReferenceModule, YourModReference); ---- -=== Adding the Module to the UPlugin +==== Adding the Module to the UPlugin Next we need to tell the Unreal Editor to use our editor module. For this open up the `YourModReference.uplugin` file in your plugin root. @@ -164,13 +164,45 @@ Like this: ---- (the name used was `YourModReference`, make sure you use your own mod reference instead) -=== Finishing Up +==== Finishing Up Now that you have added your module folder, configuration, source, and added it to the targets, you will need to regenerate your Visual Studio project files. Directions on how to do this can be found xref:Development/BeginnersGuide/project_setup.adoc#_generate_visual_studio_files[here]. After this process completes, you should be able to start working on the {cpp} code for your mod. +[id="Compile"] +== Compiling + +Whenever you make changes to the class structure of your code +you will need to recompile the Unreal Editor before you can open it again. +Do this by building the `Development Editor` `Win64` target of the `FactoryGame` project +with the editor closed. + +Using Alpakit Dev or Alpakit Release from the Unreal editor +will automatically build other targets as needed, +so you don't need to worry about building them yourself +unless the builds are failing and you want more specific details. + +To build for specific targets from Visual Studio, see the table below: + +.Manual Build Quick Reference +|=== +| To build for X, use... |Solution Configuration|Solution Platform|Project + +| Unreal Editor (Windows) +| Development Editor | Win64 | FactoryGame + +| Windows Client +| Shipping | Win64 | FactoryGameSteam/FactoryGameEGS + +| Windows Dedicated Server +| Shipping Server | Win64 | FactoryGame + +| Linux Dedicated Server +| Shipping Server | Linux | FactoryGame +|=== + [id="AddClass"] == Adding New Classes diff --git a/modules/ROOT/pages/Development/EditorTools/SMLEditor/ResearchTreeEditor.adoc b/modules/ROOT/pages/Development/EditorTools/SMLEditor/ResearchTreeEditor.adoc index 8adb13d54..2003ac24f 100644 --- a/modules/ROOT/pages/Development/EditorTools/SMLEditor/ResearchTreeEditor.adoc +++ b/modules/ROOT/pages/Development/EditorTools/SMLEditor/ResearchTreeEditor.adoc @@ -10,13 +10,32 @@ If you have any feedback, please let us know in the Discord. Have you been holding off on implementing a MAM research tree in your mod because of how tedious it is? Wait no more! -The new Research Tree Editor allows you to create and edit research trees in a visual interface -and provides basic error checking functionality. +The Research Tree Editor allows you to create and edit research trees in a visual interface +and provides considerable error checking functionality. -To launch the tool, navigate to the `SMLEditor Content/ResearchTree/` folder in the Content Browser, +image::Development/EditorTools/ResearchTreeEditor/BlankTreeEditor.png[Blank Tree Editor] + +image::Development/EditorTools/ResearchTreeEditor/ExampleComplexTree.png[Tree Editor with Example Complex Tree loaded] + +== Launching the Tool + +To launch the tool, right click on a tree asset and select `Scripted Asset Actions` > `SMLEditor: Open in Research Tree Editor`. + +You can also navigate to the `SMLEditor Content/ResearchTree/` folder in the Content Browser, right click on the `ResearchTreeHelper` asset, then select `Run Editor Utility Widget`. -Hover over elements in the tool to see tooltips explaining what they do. -The Example Mod has been updated with a complex research tree (created by the tool) +== Using the Tool + +The Example Mod includes a complex research tree (created by the tool) to demonstrate and explain some important research tree concepts. Explore this tree, and the base game's trees, to learn more about how research trees work. + +Hover over elements in the tool to see tooltips explaining what they do. + +Add new nodes by selecting a position in the grid (double click), +selecting a Schematic asset in any Content Browser, +then clicking `Set Schematic from Selected` in the tool. +You may find the shortcut `Ctrl + Space` to open a temporary Content Browser useful for this. +Note that it only works when you don't already have a text field or button focused within the tool. + +Relocate existing nodes by dragging them around on the grid. diff --git a/modules/ROOT/pages/Development/Localization.adoc b/modules/ROOT/pages/Development/Localization.adoc index e58ab0b20..bc8fd0a68 100644 --- a/modules/ROOT/pages/Development/Localization.adoc +++ b/modules/ROOT/pages/Development/Localization.adoc @@ -66,7 +66,7 @@ In widgets, consider using Canvas Panels, Overlays, and Render Transforms if you ### {cpp} Localization Detailed documentation for {cpp} localization can be found in the -https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/Localization/Formatting/[Unreal documentation]. +https://dev.epicgames.com/documentation/en-us/unreal-engine/text-localization-in-unreal-engine?application_version=5.3[Unreal documentation]. When working in {cpp}, you can use the `NSLOCTEXT` and `LOCTEXT` macros to mark text as localizable. @@ -128,6 +128,11 @@ rename the plugin, or want extra configurability or custom settings, you can change the generated localization profile yourself. +If your mod depends on localized content from other mods, +select that mod's target(s) in the "Target Dependencies" to avoid it being gathered by both mods. + +image:L10n/ConfigureTargetDependencies.png[Configuring target dependencies] + ## Gathering Text Next, Unreal's localization system must gather all of the text that needs to be translated. diff --git a/modules/ROOT/pages/Development/Migration/ScsMigrationGuide.adoc b/modules/ROOT/pages/Development/Migration/ScsMigrationGuide.adoc index 14dc6cb9f..7651b669c 100644 --- a/modules/ROOT/pages/Development/Migration/ScsMigrationGuide.adoc +++ b/modules/ROOT/pages/Development/Migration/ScsMigrationGuide.adoc @@ -23,9 +23,16 @@ When prompted for the Mixin Target use the one from the "Actor Class" in your ol image::Development/UpdatingGuides/PickMixinTargetClass.png[Pick Mixin Target] -From here you can add any logic you had in your old SCS Component into your new Mixin. -Make sure to set any of the settings from your SCS hooks' actor component template(s) on the new component(s) you add to the Mixin, -assuming your editor displays the template, as a now-irrelevant bug prevented the option from being presented in most circumstances. +From here you have two options: + +1. Use the Mixin to attach your existing component to the actor. + In most cases this will be a drop-in replacement for your old SCS Hook, + but be aware that the mixin can spawn your component earlier in the loading sequence than the SCS Hook did in the past. + This is useful if you want to keep the logic in your existing component and just attach it to the actor. + Make sure to copy any of the settings from your SCS hooks' actor component template(s) to the ones you add via the Mixin, + assuming your editor even displays the template (a now-irrelevant bug prevented the option from being presented in most circumstances) +2. Migrate the logic from the component your SCS Hook used to spawn into the Mixin. + Depending on the tasks you need to perform, a component may be unnecessary and you can just write the logic directly to the Mixin. [WARNING] ==== diff --git a/modules/ROOT/pages/Development/ModLoader/AccessTransformers.adoc b/modules/ROOT/pages/Development/ModLoader/AccessTransformers.adoc index e836b215a..46c21cd69 100644 --- a/modules/ROOT/pages/Development/ModLoader/AccessTransformers.adoc +++ b/modules/ROOT/pages/Development/ModLoader/AccessTransformers.adoc @@ -27,6 +27,7 @@ In order to use Access Transformers, create a file in `YourPluginModReference\Co ; You can use semicolons for comments if you want to leave notes about the purpose of an access transformer Friend=(Class="AFGSomeClass", FriendClass="UMyClass") Accessor=(Class="AFGSomeClass", Property="mSomeProperty") +BlueprintType=(Struct="/Script/FactoryGame.SomeStruct") BlueprintReadWrite=(Class="/Script/FactoryGame.FGSomeClass", Property="mSomeProperty") BlueprintCallable=(Class="/Script/FactoryGame.FGSomeClass", Function="SomeFunction") ---- @@ -80,6 +81,8 @@ It cannot be added to a non-`UPROPERTY` field. It also bypasses the private BPRW conflict check (which is compile time only, it does not affect the editor, or the game), so that no changes to the game headers are required. +This is also used for properties within structs, provided they are a UPROPERTY and the struct is BlueprintType (which can be added with an Access Transformer). + === BlueprintCallable Adds `BlueprintCallable` to the specified UFUNCTION, allowing you to call that function from blueprints. @@ -154,7 +157,9 @@ Accessor=(Class="AFGBuildableFactory", Property="mInventoryPotential") BlueprintReadWrite=(Class="/Script/FactoryGame.FGSchematicManager", Property="mPurchasedSchematics") BlueprintCallable=(Class="/Script/FactoryGame.FGDismantleInterface", Function="Dismantle") EditAnywhere=(Class="/Script/FactoryGame.IconData", Property="ID") +; Note that even though WorldScannableData is a struct, BlueprintReadWrite still uses Class to select it BlueprintType=(Struct="/Script/FactoryGame.WorldScannableData") +BlueprintReadWrite=(Class="/Script/FactoryGame.WorldScannableData", Property="Actor") ---- === Blueprint Asset Property Tracing Example diff --git a/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc b/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc index 1114b1d33..137547cb0 100644 --- a/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc +++ b/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc @@ -33,7 +33,8 @@ image::Development/ModLoader/ActorMixins/Components.png[] == Adding Logic By default, Mixins allow you to implement additional code for the Begin Play, Construction Script, End Play, and Tick functions on the actor. -Note that even though the editor labels these as overrides, they do not cancel the original function on the actor (TODO verify) +Note that even though the Unreal editor labels these as overrides when creating them, +they do not cancel the original function on the actor and are instead created as event notes. image::Development/ModLoader/ActorMixins/Functions.png[] @@ -49,8 +50,8 @@ image::Development/ModLoader/ActorMixins/EnableTick.png[] == Adding Hooks -Since Mixins are an extension of a Blueprint Hook asset, -meaning you can open the Hook Graph window to define hooks. +Since Mixins are extensions of Blueprint Hook assets, +you can open the Hook Graph window to define hooks in a Mixin. These hooks always target the actor class you selected when creating the Mixin. image::Development/ModLoader/BlueprintHooks/ViewHookGraph.png[] @@ -64,6 +65,15 @@ Create a Mod Game Instance Module if you don't already have one and add your new image::Development/ModLoader/ActorMixins/RegisterMixin.png[Register Mixin to Game Instance Module] +== Referencing Mixins and their Targets + +When writing blueprint code in a Mixin, the `Self` node refers to the mixin object as opposed to the actor it is targeting. +To get a reference to the target actor instead, use the `Mixin Target` node. + +When you have a reference to an actor and need a reference to a mixin applied to it, +use the `GetActorMixin` node or `UBlueprintActorMixin::GetActorMixin` function. +Be sure to check if the returned mixin object is not null (for example, by using `Is Valid`) before using it. + == Limitations and Workarounds === Blueprint Actors Only diff --git a/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc b/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc index a54093267..b6c715b5f 100644 --- a/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc +++ b/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc @@ -64,6 +64,11 @@ Fill out the drop-downs to specify what class's function you are hooking. image::Development/ModLoader/BlueprintHooks/FillDropdowns.png[Fill dropdowns] +The editor Details pane allows +switching between Insertion hook types +and applying an inline Target Selector (called Target Selection Mode) for convenience. +Compile the hook asset to visually apply any changes made to hook type. + === Target Specifiers Target Specifier nodes connect to the "Target Statement" pin on hook nodes. @@ -125,6 +130,12 @@ Create a Mod Game Instance Module if you don't already have one and add your new image::Development/ModLoader/BlueprintHooks/RegisterHook.png[Register Hook in Game Instance Module] +== Troubleshooting + +If your hooks aren't triggering as expected, +check your logs for messages in the `LogBlueprintHookingCodeGen` and `LogBlueprintHookManager` categories. +A failure to attach a hook will produce a message and usually also the blueprint bytecode. + == Limitations and Workarounds === Event Graph Nodes diff --git a/modules/ROOT/pages/Development/ModLoader/BlueprintInterface.adoc b/modules/ROOT/pages/Development/ModLoader/BlueprintInterface.adoc index 29e189ffa..9a7efb691 100644 --- a/modules/ROOT/pages/Development/ModLoader/BlueprintInterface.adoc +++ b/modules/ROOT/pages/Development/ModLoader/BlueprintInterface.adoc @@ -60,15 +60,6 @@ meaning that A will be sorted before B. Use `TArray::StableSort` instead of this node when working in {cpp}. -== Hooking - -[id="BindOnBPFunction"] -=== BindOnBPFunction(const TSubclassOf Class, FObjFunctionBind Binding, const FString FunctionName, bool HookOffsetStart) - -Allows binding an event to a function that is implemented in blueprint. - -HookOffsetStart controls if your event will be called before or after the hooked function. - == Config [WARNING] diff --git a/modules/ROOT/pages/Development/ModLoader/ContentTagRegistry.adoc b/modules/ROOT/pages/Development/ModLoader/ContentTagRegistry.adoc index 1f5d1321b..937746e9b 100644 --- a/modules/ROOT/pages/Development/ModLoader/ContentTagRegistry.adoc +++ b/modules/ROOT/pages/Development/ModLoader/ContentTagRegistry.adoc @@ -184,10 +184,12 @@ From there, use tag container methods like "Has Tag" and "Has All" to make decis [id="CheckTags_Cpp"] === In C++ +Use `UContentTagRegistry::Get()` to get a reference to the registry. + Use `UContentTagRegistry:GetGameplayTagContainerFor` to get the tag container for a class. From there, use -https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/GameplayTags/FGameplayTagContainer?application_version=5.3[tag container methods]. +https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/GameplayTags/FGameplayTagContainer?application_version=5.3#functions[tag container functions] to query for tags. == Using Tags from Other Mods diff --git a/modules/ROOT/pages/Development/ModLoader/ModModules.adoc b/modules/ROOT/pages/Development/ModLoader/ModModules.adoc index f8a340731..3d5178bb6 100644 --- a/modules/ROOT/pages/Development/ModLoader/ModModules.adoc +++ b/modules/ROOT/pages/Development/ModLoader/ModModules.adoc @@ -65,6 +65,12 @@ You should only have _one of each type_ marked as the root module. Otherwise, SML will purposely crash the game to warn of this mistake. ==== +Although it is possible to have a root mod module defined purely in {cpp}, +it is recommenced to make a blueprint child of it root instead, +as mod modules help you register asset-based content. +To make a {cpp}-defined module a root module, +set `bRootModule = true;` in its constructor. + == Dispatch Lifecycle Event The `DispatchLifecycleEvent` is a function that every Mod Module can override. diff --git a/modules/ROOT/pages/Development/ModLoader/SessionSettings.adoc b/modules/ROOT/pages/Development/ModLoader/SessionSettings.adoc index 9ac64b601..c86fa68fe 100644 --- a/modules/ROOT/pages/Development/ModLoader/SessionSettings.adoc +++ b/modules/ROOT/pages/Development/ModLoader/SessionSettings.adoc @@ -8,12 +8,14 @@ This page is a work in progress. Introduced in SML3.5, Session Settings (referred to in-game as Mod Savegame Settings) are a feature similar to Advanced Game Settings -that allows mods to store configuration information on a per-game-save basis. -They do not require Advanced Game Settings to be enabled to be used. +that allows mods to store configuration information on a _per-game-save_ basis. +Session Setting values are xref:Development/Satisfactory/Multiplayer.adoc[automatically replicated in multiplayer] +and can be edited by any connected player. +Note that Session Settings do not require Advanced Game Settings to be enabled to be used. Session Settings are currently stored in the Map Travel URL, making them available exceedingly early in the loading process. -This may change in the future. +This may change in the future depending on what mod developers decide is more useful. It's possible to make a session setting specific to only a certain level, making them particularly useful for providing config options for custom levels @@ -148,6 +150,12 @@ Session Settings are good for things you want to be a choice per save file, such Session Setting values are xref:Development/Satisfactory/Multiplayer.adoc[replicated in multiplayer]. +Session settings are always per-game-save, while mod config is per game install. +For example, in a dedicated server, the server has its own mod config and each client has their own mod config. +Making the server aware of client's chosen configs (or vice versa) is only required if +some behavior on both sides requires it, for example movement speeds or content registration. +Replicating config values must be implemented by the mod developer. + == Advanced Game Settings In order to create an Advanced Game Setting instead of a Session Setting, diff --git a/modules/ROOT/pages/Development/ModLoader/Subsystems.adoc b/modules/ROOT/pages/Development/ModLoader/Subsystems.adoc index 8750369fb..be70b6fbb 100644 --- a/modules/ROOT/pages/Development/ModLoader/Subsystems.adoc +++ b/modules/ROOT/pages/Development/ModLoader/Subsystems.adoc @@ -33,6 +33,20 @@ If you're implementing a subsystem in {cpp} and you override BeginPlay or EndPla be sure to call the super functions, or the subsystem will not be handled correctly! ==== +=== Hybrid Subsystems + +Subsystems can be a convenient place to implement hybrid Blueprint and {cpp} functionality +since they can be easily retrieved from anywhere with world context. +To do this, define your subsystem in {cpp} with `UCLASS(Abstract, Blueprintable)` +then create a Blueprint child of that class in the Unreal editor. +Name the blueprint class `BP_YourCppSubsystemName` to follow the convention used by the base game. +Only the blueprint child class should be listed in the `Mod Subsystems` array of a Game World Module. + +The following UFUNCTION specifiers are useful for hybrid subsystems: + +- Implementing functions in {cpp} that can be called from Blueprints: `BlueprintCallable`, `BlueprintNativeEvent` +- Implementing functions in Blueprints that can be called from {cpp}: `BlueprintImplementableEvent`, `BlueprintNativeEvent` + == Replication Policy A subsystem's replication policy determines which side(s) the subsystem will exist on in multiplayer @@ -42,7 +56,7 @@ Subsystems have the `SpawnOnServer` replication policy by default, meaninging clients do not have an instance of the subsystem. If this is not the desired behavior, review the table below to find the replication policy that best suits your needs, -then change it in the Class Defaults (blueprint) or constructor (C++). +then change it in the Class Defaults (Blueprint) or constructor ({cpp}). .Replication Policy Quick Reference: Sidedness |=== @@ -99,15 +113,39 @@ make sure that you have correctly configured its Replication Policy. == Referencing a Subsystem -A subsystem itself is an actor inheriting from `ModSubsystem`. -You can also use subsystems to store data to save states. - Subsystems are held by the `SubsystemActorManager` that can be obtained using the `GetSubsystemActorManager` function. Use the `GetSubsystemActor` function on the manager to get a reference to a subsystem. +Consider checking if the retrieved subsystem is valid before trying to do anything with it using an IsValid node. + +=== From Blueprints + image:Satisfactory/Subsystems/Subsystems_sam.PNG[GameWorldModule] * The first parameter of the function is a reference to a `SubsystemActorManager` acquired using the `GetSubsystemActorManager` function. * The second parameter is the class of the subsystem actor to retrieve. -Consider checking if the retrieved subsystem is valid before trying to do anything with it. +=== From {cpp} + +The SubsystemActorManager is a UWorldSubsystem and as such can be accessed from the world context via Unreal's getter. +GetSubsystemActor can be used with a generic type parameter to retrieve the subsystem actor of the specified class. + +```cpp +// Requires something with world context, for example, an actor +UWorld* WorldObject = GEngine->GetWorldFromContextObjectChecked(WorldContext); +USubsystemActorManager* SubsystemActorManager = WorldObject->GetSubsystem(); +check(SubsystemActorManager); + +AYourSubsystem* subsystem = SubsystemActorManager->GetSubsystemActor() +``` + +Make sure to only use subsystems from the game thread. + +== Wait for Subsystem + +Although subsystems spawn relatively early in the game world loading sequence, +sometimes code that wants to use them may end up triggering sooner. +This can happen in multiplayer when a subsystem has not replicated to the client yet, +or on hosts when an xref:Development/ModLoader/ActorMixins.adoc[Actor Mixin] is triggering code on Begin Play. + +In these situations, you can use the `Wait for Subsystem` node in Blueprint event graphs to wait until the subsystem is available. diff --git a/modules/ROOT/pages/Development/OptionalModDependencies.adoc b/modules/ROOT/pages/Development/OptionalModDependencies.adoc new file mode 100644 index 000000000..4cdde5f40 --- /dev/null +++ b/modules/ROOT/pages/Development/OptionalModDependencies.adoc @@ -0,0 +1,91 @@ += Optional Mod Dependencies + +[NOTE] +==== +You have found a hidden docs page! + +This page is still a work in progress. + +If you have any feedback, please let us know in the Discord. +==== + +To make optional instead of required, in uplugin, set the mod's "Plugins" entry field "Optional" to `true`. + +TODO link to uplugin page. + +The "SemVersion" field means "if the mod is installed, the installed version must match this semver range". + +[id="SafeReference"] +== Safely Referencing Content + +Only hard reference content you know will be loaded, +can cause crashes otherwise. +Soft class paths can be useful. +Easiest to bring the mod into your project via xref:Development/BeginnersGuide/ImportingAnotherMod.adoc[Importing Other Mods to your Project]. +If not public or infeasible, make a dummy plugin with stubs. +Asset toolkit can do this for mods too but is not documented. + +Test extensively with and without the mod installed. + +[id="blueprint"] +== Optional Mod Dependencies in Blueprint + +TODO anything special to mention here? + +[id="cpp"] +== Optional Mod Dependencies in {cpp} + +Required to depend on another mod's {cpp} content. + +Your normal code can't directly reference types from the optional mod, +you must fence that into a separate {cpp} module. + +Add a new {cpp} module to your mod by following the steps TODO xref:Development/Cpp/setup.adoc[Setup] manual? + +Add the module name to the `PrivateDependencyModuleNames` array in your main module's Build.cs file. + +In your uplugin, list your new {cpp} module +and set its "LoadingPhase" to `None` to prevent it from automatically loading +(which would fail when the mod is not present). +Then add the mod to the "Plugins" array. +Example: + +// cspell:ignore BlueBeka +```json +"Modules": [ + { + "Name": "BlueBekaTweaks", + "Type": "Runtime", + "LoadingPhase": "Default" + }, + { + "Name": "BlueBekaTweaksFicsitFarming", + "Type": "Runtime", + "LoadingPhase": "None" // <- Don't load automatically + } +], +"Plugins": [ + { + "Name": "SML", + "Enabled": true, + "SemVersion": "^3.11.1" + }, + { + "Name": "FicsitFarming", + "Enabled": true, + "SemVersion": "^4.2.34", + "Optional": true // <- Mark Optional + } +] +``` + +TODO generalize this info for the docs. Possibly cpp example mod content? See BlueBeka use case on modding discord https://discord.com/channels/555424930502541343/1410620050989256714/1411668949497548850 + +Add an FModuleManager::OnModulesChanged delegate to the Unreal Module Manager singeleton, +and when the mod you care about is loaded (check the Name argument), +load your {cpp} module via FModuleManager::LoadModule (passing the FName of your {cpp} module as defined in your uplugin). + +TODO does this have to be done in a TFuture? BlueBeka's use case did + +To spawn child xref:Development/ModLoader/ModModules.adoc[Mod Modules] based on the presence of another mod, +use SpawnChildModule as described on their page. diff --git a/modules/ROOT/pages/Development/ReuseGameFiles.adoc b/modules/ROOT/pages/Development/ReuseGameFiles.adoc index 47fcfdf75..b1911ae2e 100644 --- a/modules/ROOT/pages/Development/ReuseGameFiles.adoc +++ b/modules/ROOT/pages/Development/ReuseGameFiles.adoc @@ -34,12 +34,22 @@ As an example, let's say you wanted to reuse the static mesh and icon from the https://satisfactory.wiki.gg/HUB_Parts[HUB Parts] component mentioned earlier. -The first step is to track down the location of the asset in the base game. -This is done by figuring out the Blueprint Path of the asset via the -https://satisfactory.wiki.gg/[Satisfactory Wiki], -searching around for it in xref:Development/ExtractGameFiles.adoc#FModel[FModel] -(the case for most GUI elements), -or using a mod like https://ficsit.app/mod/ContentInspector[Content Inspector]. +=== Finding the Assets + +The first step is to track down the location - the Blueprint Path - of those asset in the base game's files. +The game's assets are not named or organized predictably, +so it's often easier to start with another (easier to locate) asset that references the content you want, +then look at its properties. +For example, we don't know what the blueprint path of HUB Parts' icon or mesh is, +but we do know that the HUB Parts item must be referencing them somehow to use them. + +There are multiple ways to track down content, including: + +- For items, recipes, and some actors, use https://ficsit.app/mod/TFIT[TFIT's debugging features], which can display recipe and item paths. +- For schematics, use https://ficsit.app/mod/MAMTips[MAM Enhancer's debug mode], which displays schematic paths +- For arbitrary content (images used in machine UIs, particle systems, sounds), browse with xref:Development/ExtractGameFiles.adoc#FModel[FModel] +or https://ficsit.app/mod/ContentInspector[Content Inspector]. +- The https://satisfactory.wiki.gg/[Satisfactory Wiki] has manually entered blueprint paths for some items. .HUB Parts on the Satisfactory Wiki image::ReuseContent/WikiHubPartsBox.png[HUB Parts on the Satisfactory Wiki] @@ -53,7 +63,7 @@ so we should go to `\FactoryGame\Resource\Parts\HUBParts` in FModel to find the relevant files. -.HUB Parts inside of the FModel Folders browser +.HUB Parts inside of the FModel "Folders" browser image::ReuseContent/FModelFoundPath.png[HUB Parts inside of FModel] Upon switching to the Packages tab we can see @@ -69,6 +79,8 @@ Use the Commands button in the top left of the viewer to see navigation keybinds .HUB Parts in the FModel 3D Viewer image::ReuseContent/FModelHubParts.png[HUB Parts in the FModel 3D Viewer] +=== Creating the Placeholders + Now that you've found the location of the asset in the base game, you're ready to set up the placeholder for it. Within your editor, you should go to the same path that you followed in FModel, creating @@ -82,9 +94,9 @@ and a Texture called `IconDesc_HubParts_256` at the path [TIP] ==== -Notice that the actual content you use for the content you are +Notice that the content of the asset you are creating a placeholder for _does not matter at all_ - just that it -has the correct name, path, and asset type as the content you want to reference. +has the same name, path, and asset type as the content you want to reference. ==== [TIP] @@ -108,13 +120,16 @@ from the xref:Development/BeginnersGuide/SimpleMod/recipe.adoc[Recipe/Schematic tutorial], which you can copy in from the ExampleMod in your project or download it again from the above link. -image:ReuseContent/PlaceholderMesh.png[Final Placeholder Mesh] -image:ReuseContent/PlaceholderIcon.png[Final Placeholder Icon] +image::ReuseContent/PlaceholderMesh.png[Final Placeholder Mesh] +image::ReuseContent/PlaceholderIcon.png[Final Placeholder Icon] -Note that these screenshots also contain placeholders +[NOTE] +==== +These screenshots also contain placeholders of some other files related to the HUB Parts. You do not need to have placeholders for everything, just the content you want to reference. +==== Once these placeholder assets are created, you can refer to them from elsewhere in your mod project. diff --git a/modules/ROOT/pages/Development/Satisfactory/AbstractInstance.adoc b/modules/ROOT/pages/Development/Satisfactory/AbstractInstance.adoc index d9f70f675..dcf90fc36 100644 --- a/modules/ROOT/pages/Development/Satisfactory/AbstractInstance.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/AbstractInstance.adoc @@ -34,7 +34,8 @@ edit the following properties on your buildable: 2. Add an Abstact Instance Data Object to `mInstanceData` 3. Create a new array element in the data object 4. Set the Static Mesh accordingly -5. Set `Num Custom Data Floats` to 20 +5. Set `Num Custom Data Floats` to 20. + This is the number of fields Coffee Stain's implementation uses and should not be changed unless you are doing something advanced. A building can have multiple abstract instance meshes via multiple array elements. You may also find the following properties useful: diff --git a/modules/ROOT/pages/Development/Satisfactory/AdaMessages.adoc b/modules/ROOT/pages/Development/Satisfactory/AdaMessages.adoc index f29ddb5bf..521347f58 100644 --- a/modules/ROOT/pages/Development/Satisfactory/AdaMessages.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/AdaMessages.adoc @@ -92,100 +92,33 @@ Additional trigger settings: * Priority - The priority of this message - suggested baseline value of 1. -== Generating Audio +== Generating ADA Audio -All voice lines spoken by ADA (and the ????) are generated using Google's Text-to-Speech API. -You can try it out on https://cloud.google.com/text-to-speech[the demo website] using the following settings: +All voice lines spoken by ADA (and the ????) are generated using Google's Text-to-Speech API +with the `en-US-Wavenet-C` voicebank. +The additional affects applied to the ???? voice are not currently known by the community. + +It was previously possible to try out on the https://cloud.google.com/text-to-speech[Google Cloud TTS demo website] using the following settings, but **they have since removed it from the list**. * Voice type: `WaveNet` * Voice name: `en-US-Wavenet-C` * Pitch: `-1.2` -** The demo's slider makes it difficult to enter precise values. Click the slider to focus it, then use the left and right arrow keys to adjust the value. - -You may need to change the text of what the TTS is saying to not match what the captions are when saying certain words. -// cspell:ignore fixit -For example, to have it pronounce FICSIT correctly, use the word 'fixit' - -It is strongly suggested that you keep the text you fed to the TTS on hand so you can re-record lines later if needed or figure out how you got it to say a specific word in the past. - -== Importing Audio to the Editor - -The SML team is working on patches to enable Wwise to function properly in the editor. -Until this system is implemented it is not possible to play message audio in game through normal means - -you will have to come up with your own workaround. -//// - -== BELOW IS OLD VERSION - -[NOTE] -==== -You have found a hidden docs page! - -This page is a work in progress. - -Currently, it's just a rough write up that I (Robb) made while implementing ADA messages in my own mod. - -It's quite out of date but will Eventually(TM) be updated. -==== +The community is not currently aware of a place to use the `en-US-Wavenet-C` voicebank for free, +however, some similar alternatives are known: -Look at either -https://github.com/budak7273/ArmorModules[PowerSuit Modules] -or -~~Ficsit Networks~~ (FIN no longer has ADA messages) -for examples. - -Messages are two parts - the voice line and the file that shows up in the inbox - -You can just download the content folder and add it as a separate content folder -within your modding project to be able to poke around in the UAssets and see how things are set up. - -Strongly suggested you try and keep with the writing style of the game for ADA messages -Speaking mannerisms, patterns in what she says across voice lines -link:{attachmentsdir}/Development/Satisfactory/AdaMessages/All_Vanilla_ADA_Voicelines.txt[reference file] -For more examples check PowerSuit modules - -the sound wave goes in the Dialogue Sounds array of an FGAudioMessage, there are lots of other settings there as well - -Need custom BP code inside of InitGameWorld to register them since SML doesn't by default - -Need to add a new variable to your InitGameWorld for the the schematic-Message mapping. - -Don't need to create a new sender unless you want. Can reuse ADA without issue. - -You can reuse the same Audiokinetic event for all of your messages. - -You can record ADA voicelines using either pacas01's github project (need google api key thingy + billing set up) or you can use audacity loopback to record them from your own computer audio. waveset C pitch -1.2 (a bit hard to select on the slider, try dragging it far away then guesstimating where it needs to be). if using audacity loopback use the best quality sound device you have and keep it set to a consistent volume when recording. DON'T use laptop speakers for example, they suck miserably -- https://github.com/pacas00/Simple-ADA-Like-Voice-Generator[pacas01's tool] -- https://cloud.google.com/text-to-speech[the demo website] +- The https://ttsfree.com/text-to-speech/[TTSFree website] allows generating audio using `en-US-Standard-C` voicebank, + which is similar but has clearly audible differences. +- https://actions-on-google-labs.github.io/nightingale-ssml-editor/[Nightingale Text to Speech Demo] claims to allows generating audio using `en-US-Wavenet-C`, but it seems to be using `en-US-Standard-C` instead. You may need to change the text of what the TTS is saying to not match what the captions are when saying certain words. +// cspell:ignore fixit For example, to have it pronounce FICSIT correctly, use the word 'fixit' It is strongly suggested that you keep the text you fed to the TTS on hand so you can re-record lines later if needed or figure out how you got it to say a specific word in the past. -Since this can be different from the text you want to display to the user in the inbox (ex. 'fixit' case) you should still keep a separate copy of this. - - -You can use the advanced format of telling the tts what to do to insert custom emphasis and pauses; -look at google's docs and example of this in the demo widget - -Can't have newlines in messages - have to do separate AudioMessage AudioEvents - -You can change the speaking rate if the boxes of multiple messages aren't really lining up with what is being said in the recording. -Usual is 0.065, I find 0.07 works well for these types - -If you want to send more than one message event per schematic, for example one in Inbox and one in Tutorial, you will either have to modify the BP code, or set the schematic to grant a hidden schematic that is mapped to the other message, and grant the other one as an unlock reward - if you do this - the messages will queue up - the other (granted as a reward) schematic will play first - you must have a sound file associated with it still (see below section) - you can make a schematic hidden by giving it an impossible dependency - for example, make it depend on the schematic `FGSchematic` - this means that even if you grant the schematic as a reward this way it will still never actually show up in the terminal because the condition for showing up can't be fulfilled - Look at powersuit modules' `SchematicClass_HiddenSchematic` and `Schematic_Hidden_ModuleKeybindsTutorial` for an example - -If you have a message incoming that does not have a Dialogue Sounds file set, none of the messages in that 'queued batch' will play, it will cancel them all! - to fix this, give it a sound file of just silence to play. Example of this in Powersuit Modules - +== Importing ADA Audio to the Editor -//// +Message data assets reference the audio to play via the `mAudioEvent` field that takes an Audiokinetic Event. +Importing audio and creating Audiokinetic Events is done through Wwise, +the process of which is documented on the xref:Development/Satisfactory/Audio.adoc[Audio] page. diff --git a/modules/ROOT/pages/Development/Satisfactory/Audio.adoc b/modules/ROOT/pages/Development/Satisfactory/Audio.adoc index 1dbe01fcd..863275f52 100644 --- a/modules/ROOT/pages/Development/Satisfactory/Audio.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/Audio.adoc @@ -229,10 +229,21 @@ Do so by following the steps in the link:#_generating_sound_banks[respective sec === Unreal Project Configuration -Open the Unreal Engine project settings and Navigate to the Wwise integration settings. +// Make sure this content stays in sync with project_setup.adoc#FirstTimeUserPopups + +Open the Unreal Engine project settings (`Edit` > `Project Settings...`) +and navigate to the "Wwise" category's page `Integration Settings`. + +In the "Installation" subsection, +change the `Root Output Path` setting to `/GeneratedSoundBanks`. +Note that it may be pre-filled with an incorrect Wwise project path, +so use the directory picker to ensure you've selected your actual Wwise project. + +Next, head to the "Initialization" subsection +and change the `Unreal Audio Routing` setting to `Both Wwise and Unreal audio`. + +// End stays in sync -Change the `Root Output Path` setting to `/GeneratedSoundBanks`. -Then change the `Unreal Audio Routing` setting to `Both Wwise and Unreal audio`. You may need to restart the Unreal Editor after making these changes. === Creating AKEvents In Unreal Engine @@ -285,6 +296,7 @@ otherwise it will continue to play with no way to stop it. image:Satisfactory/Wwise/Wwise_UEAkEvent_EndPlay.png[Wwise_UEAkEvent_EndPlay, 100%] +[id="UpdateWwiseRTPCValues"] === Updating Wwise Values From Your Mod Wwise uses a feature called Real-Time Parameter Control (RTPC) that allows game engines like Unreal or Unity to change values on Wwise assets in real-time. @@ -431,6 +443,89 @@ Follow the steps in the main Volume Options section to combine the relevant volu === Volume with Wwise The game's master volume slider is automatically applied to any sounds played through Wwise. -Following other base game volume sliders requires using the respective audio busses on the event. -The RTPC system can be used to factor in arbitrary volume options from other sources. +You will need to create your own volume slider to be able to control Wwise audio for your mod. + +== Creating a Modded Wwise Volume Slider + +=== Create the Volume Slider Data Asset + +To add a new volume slider to the games user settings you will need to create a new `FGUserSetting` Data Asset + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_CreateDataAsset.png[Wwise_Volume_UE_CreateDataAsset, 700] + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_PickDataAssetClass.png[Wwise_Volume_UE_PickDataAssetClass, 700] + +Once the Data Asset is created you will need to set the settings: + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_DataAsset_Settings.png[Wwise_Volume_UE_DataAsset_Settings, 700] + +* **Str Id**: The user setting id (Recommend using RTPC.Menu_Volume_) +* **Display Name**: The display name that will appear on the options menu. + This should include the friendly name of your mod so users can tell what mod added the setting. +* **Tool Tip**: Give a descriptive tool tip for the slider. +* **Category Class**: Set this to `USC_Audio` +* **Sub Category Class**: Set this to relevant sub category (Search for `USubC_Audio_`) +* **Menu Priority**: Set this to a high value to not interfere with the game's options e.g. 50+ +* **Apply Type**: Set this to `FGUserSettingApplyType_UpdateInstantly` +* **Value Selector**: Set this to what is presented in the image above. +* **Manager Type Availability**: Set this to `FGGameUserSettings` +* **Show In Builds**: Set this to `PublicBuilds` + +This will add a slider to the audio options menu. Now you need to bind the slider to the Wwise sounds. + +=== Create the Wwise Audio Bus + +Create a new audio bus in Wwise by going to the `Audio` tab. +Go to `Master-Mixer Hierarchy` -> `Default Work Unit` -> `Master Audio Bus` Right click and `New Child` -> `Audio Bus` + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_CreateAudioBus.png[Wwise_Volume_Wwise_CreateAudioBus, 700] + +Set the name to anything that you want. + +Now link the audio bus to the Wwise audio: + +Navigate to your audio in Wwise and go to the `General Settings` tab and click the `...` in the `Output Bus` section. + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_SelectAudioBus.png[Wwise_Volume_Wwise_SelectAudioBus, 700] + +Select the new Audio Bus. + +=== Create the RTPC for the Audio Bus + +Create a new RTPC in Wwise using the documentation above: +link:#UpdateWwiseRTPCValues[Updating Wwise Values From Your Mod]. + +[IMPORTANT] +==== +Make sure that the RTPC min/max values are 0.0 -> 1.0 +==== + +Name the RTPC something like `RTPC__Volume` + +=== Link the RTPC to the Audio Bus + +Go to the `Audio` tab in Wwise and click on the new Audio Bus that you created. Then go to the `RTPC` tab. + +Click the first `>>` and select `Bus Volume` +Click the second `>>` and go to `Game Parameters` then select the newly created RTPC + +You should then have the following graph going from 0 to 1: + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_Wwise_LinkAudioBus.png[Wwise_Volume_Wwise_LinkAudioBus, 700] + +=== Linking the Slider to the RTPC + +You will need to create the new RTPC in Unreal Engine: + +image:Satisfactory/Wwise/Wwise_UE_RTPC_Create.png[Wwise_UE_RTPC_Create, 700] + +Name the RTPC in Unreal Engine exactly the same as what you named in Wwise. + +Add code to your `GameWorldModule` as part of the construction stage to link the slider to the RTPC using the following: + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_UE_LinkRTPC.png[Wwise_Volume_UE_LinkRTPC, 700] + +Once this has been done you should see the volume slider in the game's audio options: + +image:Satisfactory/Wwise/Wwise_Volume/Wwise_Volume_GamePreview.png[Wwise_Volume_GamePreview, 700] diff --git a/modules/ROOT/pages/Development/Satisfactory/ConditionalPropertyReplication.adoc b/modules/ROOT/pages/Development/Satisfactory/ConditionalPropertyReplication.adoc index b6fb19b18..0b02800fa 100644 --- a/modules/ROOT/pages/Development/Satisfactory/ConditionalPropertyReplication.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/ConditionalPropertyReplication.adoc @@ -52,6 +52,8 @@ void AFGBuildableManufacturer::BeginPlay() + * If you skip this step, your inventory will ALWAYS be replicated if the owner building is replicated. However, if you follow it, the inventory will ONLY be replicated to the client if it has the buildable UI open. + * The UObject passed to `SetReplicationRelevancyOwner` is expected to implement IFGConditionalReplicationInterface. + Buildings implement this for you. + 4. Now just use the same inventory on both server and client. No need for any kind of hacks with inventory object swapping or waiting for inventories. diff --git a/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc b/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc index 84a176215..33b71d00b 100644 --- a/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc @@ -190,7 +190,7 @@ UMyModGameInstanceModule* MyModGameInstanceModule = CastBindAction(MyModGameInstanceModule->InputActionTagBindings[FGameplayTag::RequestGameplayTag(TEXT("Tag.Name"))], ETriggerEvent::Triggered, this, &Class::Function); ``` -== Reading Input Action Information +== Displaying Information about Input Actions In order to retrieve the name(s) of the key(s) bound to an action for display to the user, call the FGInputLibrary function `Get Input Action Name as Text` @@ -198,6 +198,17 @@ on a Player Controller instance passing in the Name given to the action in its M This will automatically handle multi-key binds and display them in a combined format like `Left Alt + Q`. Note that if the mapping context is not registered at call time you will get back `UNKNOWN_KEY()`. +The "Get Key Name For Action Simple" function may also be useful. +Supply it with the player-mappable key settings Name of the action +and it will return a text representation of the action. +For example, given `PlayerActions_Use`, it will return `E` (by default). + +For buildables, the output of the "Get Look At Description" function +will be rendered as rich text by the base game. +To get the "orange box" around the keybind, use rich text formatting hints like this: +// \{ required to escape AsciiDoc attribute processing +`Press \{KeyName} to \{ActionDescription}`. + If you need to retrieve the exact key structures involved in an input action, call the FGInputLibrary function `Get Current Mapping for Action` on a Player Controller instance passing in the Name given to the action in its Mapping Context. diff --git a/modules/ROOT/pages/Development/Satisfactory/Multiplayer.adoc b/modules/ROOT/pages/Development/Satisfactory/Multiplayer.adoc index d97a2716c..6901ccb80 100644 --- a/modules/ROOT/pages/Development/Satisfactory/Multiplayer.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/Multiplayer.adoc @@ -2,6 +2,8 @@ Although not all mods need special code to handle multiplayer, it's important to create your mods with multiplayer in mind. +Mods coded properly for multiplayer will also work in singleplayer - +no additional code paths are required specifically for singleplayer. Adding support for multiplayer to your mod is similar to creating multiplayer code for any other Unreal Engine project. diff --git a/modules/ROOT/pages/Development/TestingResources.adoc b/modules/ROOT/pages/Development/TestingResources.adoc index 7d8cad763..a2b45379f 100644 --- a/modules/ROOT/pages/Development/TestingResources.adoc +++ b/modules/ROOT/pages/Development/TestingResources.adoc @@ -73,8 +73,13 @@ You can shave some time off of this process by launching via a script that loads In order to use this script, create a file with the `.ps1` extension somewhere convenient to you. Next, copy the contents of the below codeblock into the file. -Note that you will have to modify the section near the top + +[IMPORTANT] +==== +You must modify the section near the top of the script +labeled `Configure this section` to match the location of files on your system. +==== If you have never ran a powershell script before on your Windows install, you may need to @@ -219,12 +224,12 @@ function ResolveGamePathFromParams() { $actualBranch = "steam" } $gamePathInfo = $selectedSide[$actualBranch] - if (($gamePathInfo -eq $null) -or ($gamePathInfo -eq "UNSET")) { + 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) { + 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 } diff --git a/modules/ROOT/pages/Development/UnrealEngine/BluePrints.adoc b/modules/ROOT/pages/Development/UnrealEngine/BluePrints.adoc index fd4cf4f5d..121b990b0 100644 --- a/modules/ROOT/pages/Development/UnrealEngine/BluePrints.adoc +++ b/modules/ROOT/pages/Development/UnrealEngine/BluePrints.adoc @@ -1,5 +1,11 @@ = Blueprints +[WARNING] +==== +This docs page has not been edited for a long time and may contain outdated information. +Consider following some of the tutorials listed on the xref:Development/UnrealEngine/UnrealLearningResources.adoc[Unreal Learning Resources page] instead. +==== + The `+Blueprint+` system is a node-based visual coding language for Unreal. Blueprints compile into a variant of bytecode which gets executed by the Unreal Blueprint Virtual Machine. diff --git a/modules/ROOT/pages/Development/UnrealEngine/Code.adoc b/modules/ROOT/pages/Development/UnrealEngine/Code.adoc index 0ef078fa2..56849626c 100644 --- a/modules/ROOT/pages/Development/UnrealEngine/Code.adoc +++ b/modules/ROOT/pages/Development/UnrealEngine/Code.adoc @@ -1,5 +1,11 @@ = Code & Content +[WARNING] +==== +This docs page has not been edited for a long time and may contain outdated information. +Consider following some of the tutorials listed on the xref:Development/UnrealEngine/UnrealLearningResources.adoc[Unreal Learning Resources page] instead. +==== + In Unreal we have generally two types of codes and one type of content. == Content diff --git a/modules/ROOT/pages/Development/UnrealEngine/Editor/MainWindow.adoc b/modules/ROOT/pages/Development/UnrealEngine/Editor/MainWindow.adoc deleted file mode 100644 index c03b448f4..000000000 --- a/modules/ROOT/pages/Development/UnrealEngine/Editor/MainWindow.adoc +++ /dev/null @@ -1,72 +0,0 @@ -= MainWindow - -The main window contains most important settings and docks for the -primary editor features. - -== Menu-Bar - -image:UnrealEditor/MainMenuBar.jpg[image] - -Every window has a menu bar, but the menu bar of the main window is a -little bit special because it also contains entries for global settings, -project settings and file management. - -== Tab-Bar - -image:UnrealEditor/TabBar.jpg[image] - -Every window has a tab bar which can hold multiple views/windows. If the -main window/view get closed (as tab or the containing "real" window) the -project gets completely closed, also all other windows. - -== Viewport - -image:UnrealEditor/MainViewport.jpg[image] - -The viewport is simply a preview of the map, where you can place and -manipulate a world. We don't have access to the Satisfactory map source files like Coffee Stain does, -so this viewport is more or less useless to us. Our work will take place mainly in other windows. - -== Tool-Bar - -image:UnrealEditor/MainToolBar.jpg[image] - -The tool-bar is a strongly simplified version of the menubar and is icon -base, but its the only place where you can find the access to the -`+Alpakit+` window. The Tool-bar contains mainly shortcuts for the -project settings, c++ building and source control, the remaining features are mostly -not useful without a map as mentioned above in the Viewport section. - -== Outliner - -image:UnrealEditor/MainOutliner.jpg[image] - -The outliner is here again pretty useless because it contains the -list of placed objects in the world, and again, we don't have the map files. - -== Modes - -image:UnrealEditor/MainModes.jpg[image] - -One more useless view cause we don't have a proper map to edit, but this -would help you to place things into the world and contains a list of -basic actors and edit tools for brushes, terrain and so on. - -== Content-Browser - -image:UnrealEditor/MainContentBrowser.jpg[image] - -Finally a very very useful and important view. This view is simply a -file browser for all contents of your mod project and SF/UE source like -C++ classes, models and textures, etc. - -In the left half, you can see a tree structure based folder explorer -where you can select a folder which contents get the displayed on the -right-hand side half of the view. - -It also has in the left upper corner or in the context menu -(r-click-menu) the ability to create, import, export, delete or modify -content. - -You can find in the `Content`-Root folder all "normal" assets and the -`C++-Classes` root folder contains all c++ classes. diff --git a/modules/ROOT/pages/Development/UnrealEngine/Editor/index.adoc b/modules/ROOT/pages/Development/UnrealEngine/Editor/index.adoc deleted file mode 100644 index a4422dffb..000000000 --- a/modules/ROOT/pages/Development/UnrealEngine/Editor/index.adoc +++ /dev/null @@ -1,23 +0,0 @@ -= Unreal Editor - -The Unreal Editor should have been installed during the -xref:/Development/BeginnersGuide/index.adoc[Getting Started setup process]. -This is your IDE where you will spend the most time in to add especially -"visible" content called `assets`. But it's also used to add simple -logic to your mod with an integrated visual programming language called -Blueprints. - -[TIP] -==== -If you want to learn more about `Blueprints` and the so called -`UObject-System` we recommend you the concept page for -xref:Development/UnrealEngine/BluePrints.adoc[Blueprints] -and Unreal's documentation on the UObject system. -==== - -[TIP] -==== -We recommend the https://academy.unrealengine.com/[Unreal Academy] for -learning more about the concepts and deep topics of Unreal Engine itself -(like Particle System, advanced Blueprints, and so on) -==== diff --git a/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc new file mode 100644 index 000000000..93afb09c5 --- /dev/null +++ b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc @@ -0,0 +1,92 @@ += Unreal Learning Resources + +Although this documentation site covers many aspects of modding Satisfactory, +there is a lot of core Unreal Engine knowledge that you must acquire on your own from other tutorials. +This page contains a list of some of those other tutorials. + +Entries with a 📖 are primarily written, 📽 have a video component, and ⭐ are the ones we find especially useful and informative. + +== Disclaimer: Satisfactory Could Be Different + +Because Satisfactory is an established Unreal Engine game with its own systems, +there are a lot of Unreal Engine systems you don't need to worry about +Coffee Stain has already implemented them. + +Furthemore, some Unreal concepts do not carry over to Satisfactory because +Coffee Stain has implemented their own systems instead. +The most obvious example of this are machines and the lightweight buildable system - +any buildings you create should use the optimized systems provided by Coffee Stain +wherever possible instead of trying to implement your own. + +Some tutorials can't be followed in the Satisfactory Unreal project because +they rely on Play-in-Editor (PIE) functionality that the project lacks code for. +You'll have to install a separate copy of Unreal Engine 5 and create a separate project to follow those. + +Keep this in mind as you follow other tutorials. + +[id="UnrealEditor"] +== Using the Unreal Editor + +* ⭐📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-terminology?application_version=5.3[Unreal Engine Terminology] - + A glossary of common Unreal Engine terms you may encounter in other tutorials. + +// keep below links in sync with Project Setup # Familiarize Yourself with the Editor +* ⭐📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-editor-interface?application_version=5.3[Unreal Editor Interface] - + Provides a high-level overview of what each of the editor panels do. + +* ⭐📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/content-browser-in-unreal-engine?application_version=5.3[Content Browser] - + How to access the Content Browser, including adding multiple Content Browser panels to your viewport. + +* ⭐📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/content-browser-interface-in-unreal-engine?application_version=5.3[Content Browser Interface] - + How to use the various features offered by the Content Browser. +// end keep in sync + +* ⭐📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/reference-viewer-in-unreal-engine?application_version=5.3[Reference Viewer] - + Using the Reference Viewer to see what assets reference a given asset, and what other assets are referenced by it. + +* 📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/property-matrix-in-unreal-engine?application_version=5.3[Property Matrix] - + Quickly viewing or editing the properties of multiple assets at once using the Property Matrix. + +* 📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/global-asset-picker-in-unreal-engine?application_version=5.3[Global Asset Picker] - + Quickly opening an asset you already know the name of using the Global Asset Picker. + +[id="UnrealBlueprint"] +== Blueprint Scripting + +* ⭐📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/introduction-to-blueprints-visual-scripting-in-unreal-engine?application_version=5.3[Introduction to Blueprints] - + 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/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/blueprint-tutorials-in-unreal-engine?application_version=5.3[Blueprint Tutorials] - + Links to walkthroughs of accomplishing various tasks in the Blueprint scripting editor. + Note that the page currently duplicates all available tutorials in each complexity heading. + +* 📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/searching-in-blueprints-in-unreal-engine?application_version=5.3[Blueprint Search] + How to use the Blueprint editor's search functionality. + +* 📖 https://dev.epicgames.com/documentation/en-us/unreal-engine/graphs-in-unreal-engine?application_version=5.3[Anatomy of a Blueprint : Graphs] - + Overview of the different kinds of blueprint graphs with links to additional information. + +[id="UnrealCpp"] +== Unreal {cpp} + +* ⭐📖📽 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://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. + +[id="General"] +== General + +// cspell:ignore Sensei +* 📽 https://www.youtube.com/watch?v=k-zMkzmduqI[Unreal Sensei: Unreal Engine 5 Beginner Tutorial - UE5 Starter Course] - + A walkthrough of creating an Unreal landscape level from scratch. + 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. diff --git a/modules/ROOT/pages/Development/UnrealEngine/index.adoc b/modules/ROOT/pages/Development/UnrealEngine/index.adoc index 4810a8bf3..b5aac7ea2 100644 --- a/modules/ROOT/pages/Development/UnrealEngine/index.adoc +++ b/modules/ROOT/pages/Development/UnrealEngine/index.adoc @@ -3,16 +3,9 @@ Satisfactory uses a customized version of Unreal Engine (UE) 5.3.2 by Epic Games as its game engine. UE provides a solid framework for developing fast executing native code and a interface for artists to use a more easy way for creating content. -In this section we go over some minor basics you should know. +The modding documentation does not replace the https://docs.unrealengine.com/[Unreal Engine Documentation]. +Although this section is titled "Unreal Engine", +it only aims to cover Unreal concepts that are especially relevant to modding Satisfactory +or must be done differently due to modding/Satisfactory intricacies. -[WARNING] -==== -This does not replace the https://docs.unrealengine.com/[Unreal Engine Documentation]. - -Even if we make mods and not a standalone game, most of the stuff you will need to use is not stuff from Satisfactory, it will be actually from the Unreal Engine. That means, we highly recommend you to go through some Unreal Engine tutorials and try to make such a tutorial game. -Because the process creating the content is nearly the same! - -Most of your answerers will be answered there! This documentation here, is rly just for the stuff about modding, the modloader and Satisfactory itself. - -For getting started with Unreal Engine we also recommend the https://academy.unrealengine.com/[Unreal Academy]. -==== +Consider following some of the tutorials listed on the xref:Development/UnrealEngine/UnrealLearningResources.adoc[Unreal Learning Resources page] instead. diff --git a/modules/ROOT/pages/ForUsers/DedicatedServerSetup.adoc b/modules/ROOT/pages/ForUsers/DedicatedServerSetup.adoc index e4c5e7e76..80ffc5a99 100644 --- a/modules/ROOT/pages/ForUsers/DedicatedServerSetup.adoc +++ b/modules/ROOT/pages/ForUsers/DedicatedServerSetup.adoc @@ -58,6 +58,7 @@ The below list is shuffled each time the page is loaded to avoid bias towards an