RDR2 - Lennys Mod Loader 0.4.7790
The general idea of Lenny’s Mod Loader is to provide an easy way to modify the game. In its current state for RDR 2 it will allow you to replace any file in the game, whether they are streaming files such as models, data files, font files etc. In comparison to GTA 5 there is no UI support yet or support for addon files, but I might add that in the future!
The three screenshots show replaced assets, replaced font and an altered meta file to change the police response in Valentine to Saint Denis police. These are all included in the examples in the download for you to explore.
Conceptually there are two different ways to replace files depending on your needs. Streaming files (models, textures etc.) can be placed under lml\stream and will replace the original game assets automatically. Hashed names are also supported. Data files or other non-streaming assets require the full game path to properly override the file. This is why under lml\replace you can replicate the internal game file structure to replace files. E.g. for dispatch.meta in update.rpf/common/data you would place your modified copy under lml\replace\update\common\data\dispatch.meta. See the readme.txt for more information.
1.) Copy all files into your game folder, including the lml folder.
2.) See lml\readme.txt for instructions on the various replacement modes available.
This download comes with a few examples that modify various aspects of the game. Check them out in the included examples folder!
Verify your file got replaced
If you feel that your file is not being replaced properly, have a look at the log file and see if you can find any entry related to it. Perhaps the path was not correct and hence it did not work. Search for “replaced” for files in replace and “adding” for files in stream.
Since this is the first release for RDR I expect there to be quite a few problems and certain files might not work as expected. If you have trouble replacing specific files, please do not hesitate to comment here or reach out and include your modified file and file structure so I can have a look.
Detailed explanation of stream vs replace
In the lml folder you can find two subfolders, one called “replace” and one called “stream”. Both can be used for the same thing but replace is ultimately more powerful, but also more advanced. The stream folder you might recognize from Map Editor or Rampage Trainer and just loads streaming files directly.
As mentioned, similar to other tools available this merely loads streaming files into the game when the game is loading. For instance, model or texture files would go in there and will replace the existing assets in the game. If you do not know the name of an asset, but only its hash, simply name it 0xhash.ext (e.g. 0x9E54B506.ytd for w_melee_machete01+hi.ytd) and it will still be recognized and replace the asset correctly.
This is the most convenient way to quickly replace streaming files as you do not have to worry about where in the game files they are located but only their name.
This folder creates a virtual mapping of the entire game file structure and hence allows you to replace any game file, granted you know its full location. This is similar to the paths you can see in OpenIV when navigating RPFs, but not exactly the same. If you want to change the dispatch.meta file for instance, you will need to modify it in update.rpf, as the one in common.rpf is superseded by that. To do that, you would create the following structure: “replace\update\common\data\dispatch.meta”. This is exactly the path you would use in OpenIV (without the .rpf ending for update). Now, whenever the game wants to access this file, it will load yours instead. It is that simple!
If you want to replace the font file font_lib_efigs.gfx in scaleform_frontend.rpf for instance, you would create the following structure: “replace\update\x64\patch\data\cdimages\scaleform_frontend\font_lib_efigs.gfx”.
Word of caution: File paths do not always match their RPF names unfortunately, hence this is a bit more advanced but also allows greater control. Say you want to replace player_zero_coat_001_open.ydd which is present in both packs_1.rpf (original) and dlc.rpf (from patchpack001, an update to the file). Files DLCs follow a slightly different pathing scheme. The full path to this file would be “replace\dlc_patchPack001\x64\packs\base\models\component_models\player_zero_coat_001_open.ydd”. As you can see, it does not match the file path directly, which is also why for many files using the stream folder is just simpler. This is because the game maps some files differently and when you open the dlc.rpf (in patchpack001) and its setup2.xml you will see why: the device name is dlc_patchPack001 which is the “root” of all files inside this archive. Thus the path starts at “dlc_patchPack001” and then follows the RPF structure until you arrive at “replace\dlc_patchPack001\x64\packs\base\models\component_models\player_zero_coat_001_open.ydd”. Not that complicated, but certainly not as easy as the streaming folder and something to look out for.
Thanks to NTA for his work on fwEvents, hooking, fiDevice and sysAllocator
Thanks to listener for his work on fiDevice and advice over the years (hope you are well!)
Thanks to the OpenIV team for OpenIV
Thanks to dexyfex for CodeWalker
Thanks to Gan Ceann, Will and GameRoll for testing as well as Jewels, GuiCORLEONEx794 and jack.sharif for providing example assets