Documentation
Readme
View as plain text
---------------Written by Pokémon Professor Vokun on FB---------------
Please upload this README txt file with your mods to help educate people who wish to learn to mod
---------------Making a .pak file mod---------------
1.) Download UnrealEngine 5.2.1 (You will need to install Epic Games Launcher)
1a.) Link: https://store.epicgames.com/en-US/download
2.) Download Visual Studio 2022 with C++ Components.
2a.) Link: https://visualstudio.microsoft.com/downloads/
3.) (SHOUTOUT to AuriCrystal) Download or Clone https://github.com/Auricrystal/Rem2Proj into your folder for UE_5.2\Projects (This allows multithread cooking and packing with minimal complications)
3a.) Link for the unreal project: https://github.com/Auricrystal/Rem2Proj
3b.) Link for GitHub installer: https://desktop.github.com/download/
4.) Download Fmodel and mapping file
4a.) Link: https://fmodel.app/download
4b.) Discord group Link: https://discord.com/invite/jX5qd2RefK
4c.) Remnant 2 mappings file for Fmodel Link: https://discord.com/channels/1132777000600358977/1132790911286378627/1288635649372721193
5.) In the extracted project find Remnant2.uproject, right-click and press "Generate Visual Studio project files" wait for this to finish.
6.) Open UE5.2
7.) Open Remnant2.uproject from Rem2Proj with UE5.2
8.) Select Edit->Editor Preferences
9.) On the sidebar to the left under General select Experimental and search or find the setting for "Allow ChunkID Assignments" and set true.
10.) Click Edit>Project Settings and on the sidebar to the left under project click Packaging and enable "Use Pak File", "Use Io Store", and "Generate Chunks" if needed
11.) Once you edit an asset you have to assign a chunk (THIS CANNOT BE 0 OR 1 AS THEY ARE DEFAULT VALUES)
12.) To Assign a chunk you want to right-click the asset you edited and then select Asset Actions>Assign to Chunk
13.) Literally choose any number greater than 1 ***REMEMBER THE NUMBER YOU USED FOR STEP 18***
14.) Once finished on the top bar look for a button called Platforms click it then click Windows>Package Project
15.) Now onto selecting a folder. My preference is using UE_5.2\Projects\Rem2Proj\Packaged (This minimizes the amount of issues with multithread cooking)
16.) Now the packaging process... it will either fail or succeed. If this fails open the output log and scroll to the red lines of text (Fatal Errors) I had 7 and only made 2 changes
16a.) Find the issue file which may not even be something you edited and open it, at the bottom click the issue outlined by the red text and just delete it (Keeps it simple)
17.) After correcting any fatal errors attempt to Package the project again
18.) After it succeeds open the export path or UE_5.2/Projects/Rem2Proj/Packaged/Windows/Remnant2/Content/Paks
19.) Now you will need to find the number you assigned to whatever you edited. For example if you used 100 then look for pakchunk100-windows and you will see 3 files (.pak, .ucas, .utoc)
20.) Rename the files from pakchunk100-windows_P (You can change pakchunk100-windows to anything but it MUST end in _P)
21.) Now move the files to wherever your game is installed like Remnant2\Content\Paks\~mods
21a.) For xbox/pcgamepass avigate to XboxGames\Remnant 2\Content\Remnant2\Content\Paks\~mods
---------------Making a Script Mod *BEGINNER*---------------
1.) Navigate to \Remnant 2\Content\Remnant2\Binaries\Win64\Mods\ for steam&epic or \Remnant 2\Content\Remnant2\Binaries\WinGDK\Mods\ for xbox
2.) Create a new folder and name it whatever you want your mod to be called like Example
3.) Open the folder and right-click>New Text Document and name it enabled.exe so Example\enabled.txt
4.) Now add a new folder called scripts inside your folder so Example\Scripts
5.) Now since this is for beginners create a new text document in the scripts folder and name it main.txt
5.a) For more advanced users you can create a main.lua file and open it with Visual Studio 2022 but this readme is for beginners
6.) Now using one of the examples down below or using a reference paste it into main.txt
7.) Save your text file
8.) Rename main.txt to main.lua
---------------ModifyStat Script Reference---------------
function ModifyStat (asset,name,value)
local Item = StaticFindObject(asset)
if not Item:IsValid() then return end
Item:SetPropertyValue(name, value)
end
RegisterHook("/Script/Engine.PlayerController:ClientRestart", function(self, NewPawn)
ExecuteInGameThread(function()
ModifyStat("FullPath.Default__BPPath_C","Property/Effect", NewValue)
end)
end)
---------------ModifyStat Script Reference Multiple Targets---------------
function ModifyStat (asset,name,value)
local Item = StaticFindObject(asset)
if not Item:IsValid() then return end
Item:SetPropertyValue(name, value)
end
RegisterHook("/Script/Engine.PlayerController:ClientRestart", function(self, NewPawn)
ExecuteInGameThread(function()
ModifyStat("FullPath.Default__BPPath_C","Property/Effect", NewValue)
ModifyStat("FullPath.Default__BPPath_C","Property/Effect", NewValue)
end)
end)
---------------ModifyItem Script Reference---------------
function ModifyItem (name)
local Item = StaticFindObject(name)
if not Item:IsValid() then return end
Item:SetPropertyValue("Property/Effect", NewValue)
end
RegisterHook("/Script/Engine.PlayerController:ClientRestart", function(self, NewPawn)
ExecuteInGameThread(function()
ModifyItem("FullPath.Default__BPPath_C")
end)
end)
---------------LoadDataTable Script Reference---------------
function LoadDataTable(dataTablePath)
local dataTable = StaticFindObject(dataTablePath)
if dataTable and dataTable:IsValid() then
print("Data table loaded successfully:", dataTablePath)
return dataTable
else
print("Failed to load data table:", dataTablePath)
return nil
end
end
local myCustomDataTable = LoadDataTable("FullPath.BPPath_C")
---------------ModifyStat Script Example---------------
function ModifyStat (asset,name,value)
local Item = StaticFindObject(asset)
if not Item:IsValid() then return end
Item:SetPropertyValue(name, value)
end
RegisterHook("/Script/Engine.PlayerController:ClientRestart", function(self, NewPawn)
ExecuteInGameThread(function()
ModifyStat("/Game/World_Nerud/Items/Trinkets/Amulets/Hyperconductor/Amulet_Hyperconductor.Default__Hyperconductor","HeavyWeaponAmmoMod", 69)
end)
end)
---------------ModifyStat Script Example Multiple Targets---------------
function ModifyStat (asset,name,value)
local Item = StaticFindObject(asset)
if not Item:IsValid() then return end
Item:SetPropertyValue(name, value)
end
RegisterHook("/Script/Engine.PlayerController:ClientRestart", function(self, NewPawn)
ExecuteInGameThread(function()
ModifyStat("/Game/World_Nerud/Items/Trinkets/Amulets/Hyperconductor/Amulet_Hyperconductor.Default__Hyperconductor","SkillCooldownPercentage", 69)
ModifyStat("/Game/World_Nerud/Items/Trinkets/Amulets/Hyperconductor/Amulet_Hyperconductor.Default__Hyperconductor","HeavyWeaponAmmoMod", 69)
end)
end)
---------------ModifyItem Script Example Ring---------------
function ModifyItem (name)
local Item = StaticFindObject(name)
if not Item:IsValid() then return end
Item:SetPropertyValue("HeavyWeaponAmmoMod", 69)
end
RegisterHook("/Script/Engine.PlayerController:ClientRestart", function(self, NewPawn)
ExecuteInGameThread(function()
ModifyStat("/Game/World_Nerud/Items/Trinkets/Amulets/Hyperconductor/Amulet_Hyperconductor.Default__Hyperconductor")
end)
end)
---------------LoadDataTable Script Example---------------
function LoadDataTable(dataTablePath)
local dataTable = StaticFindObject(dataTablePath)
if dataTable and dataTable:IsValid() then
print("Data table loaded successfully:", dataTablePath)
return dataTable
else
print("Failed to load data table:", dataTablePath)
return nil
end
end
local myCustomDataTable = LoadDataTable("/Game/World_SCT/Items/Traits/MindsEye/Trait_MindsEye_Stats.Trait_MindsEye_Stats_C")