Changelog (1.26.0)
1.26.0 is a small feature update, bringing small features and bugfixes intended to make Reloaded-II
better work 'out of the box' for various different kinds of users. (i.e. Reliability)
Through most of its life, Reloaded-II has been a 'solo' project, so this update focuses on making R2
last just a little bit longer while I spend the next ~2 years working on Reloaded3.
Below is a small 'Progress Report'.
Community contributions are always welcome, and as usual, thanks for using this software.
Win32 Microsoft Store (i.e. GamePass) Games should now work 'Out of the Box'
In short: They should be as simple to set up as games on other launchers.
(If you're interested in the details, read on, otherwise skip.)
For a very long time, GamePass games have been a pain to set up.
Due to Copy Protection (DRM) that Microsoft employs at the Operating System level,
you're not allowed to read all of the game files, even if you 'own' the game.
This is problematic, because:
- We can't inject code into game directly, as it needs to be started via
gamelaunchhelper.exe
. - So you can have working cloud saves, etc.
- We can't install a shim (e.g. ASI Loader), because we can't read the EXE files.
- They're encrypted on disk, and only decrypted when the game is ran.
- So we can't figure out how to install a shim.
Unfortunately, as a result, this meant that we just had to say 'figure it out yourself' for a while.
As Reloaded-II has historically mostly been a solo effort, and I don't use Windows outside of debugging mods,
I've never really had opportunities to investigate further.
That was until @Aemony gave me a hint by linking the following post.
So I bought GamePass from my own pocket, and started investigating.
Turns out that if you spawn a process in the 'AppX' context of the game via Invoke-CommandInDesktopPackage,
or via IDesktopAppxActivator
COM interface, you can read the normally encrypted files just fine.
With that in mind, I've written some code to dump unencrypted game files, and then replace the originals
with them, so Reloaded-II can work as expected. The process is multi step, and error prone to some
degree, however all games on GamePass that are frequently used with Reloaded seem to work just fine for now.
Source Code. The code I wrote should work on Win10 21H2 and above, no guarantees for older
Windows builds.
An additional set of patches were made to ensure:
- GamePass games survive 'Verify Game Files' functionality.
- GamePass games survive updates (hopefully).
- Note: GamePass games can change their real EXE location (not the fake one in your game folder) after an update.
- If this happens Reloaded-II should still work now.
When finding a GamePass game, Reloaded-II will now auto-unprotect it for you, and install ASI Loader.
When you launch from the launcher, it'll boot gamelaunchhelper.exe
, to ensure your cloud saves work,
and the ASI Loader shim will handle loading Reloaded itself when the actual game boots.
Things should hopefully work 'just fine', for now.
PS. If you're unfortunate enough to have a Denuvo game on GamePass, your game start times should
now be ~3 seconds faster on a typical PC. You're welcome. Unfortunately, this is just another
case of how anti-piracy tech unfortunately always hurts the paying customer the most.
Mod Subfolders
(Originally contributed by @ItsKaa, thanks!)
You can now store mods in subfolders of Mods folder.
Example Reloaded-II/Mods
folder:
Mods
├── FlatOut
│ ├── flatout2.packs.goofyahhmod
│ ├── flatout2.utils.modloader
│ ├── flatout2.utils.mpnamechange
│ ├── flatout2.utils.richpresence
│ └── flatout2.utils.zpatch
├── <other unrelated mod 1>
├── <other unrelated mod 2>
└── <other unrelated mod 3>
If you're a fan of manual mod organization, say in the style of Stardew Valley, this is for you.
Should make you feel more at home.
Preserve Mod Order
(Contributed by @ItsKaa, thanks!)
The order of mods in the launcher is now fully preserved across restarts.
Previously, the enabled mods would show first in load order, and disabled ones would show after
in alphabetical order.
For newly added games, this is now the default (may change depending on feedback). For games
people previously added before this update, this is opt-in.
In either case, you can change this setting at any time according to your preference.
Reloaded-II now defaults to DLL Hijacking as opposed to DLL Injection
i.e. Reloaded-II now uses ASI Loader by default, instead of DLL Injection for newly added games.
Many Steam users have been reporting that their Steam clients render their controllers absolutely
unusable for anything that wasn't launched by Steam. Unfortunately, I don't think this will be
fixed any time soon either.
In order to reduce tech support requests of I launched via Reloaded and my controller doesn't work
,
I decided to (unfortunately) bend over to Valve and make using a shim for launching Reloaded's
Loader the default.
Although I really, really, really don't like modifying game folders (they should be untouched!!),
I'm unfortunately forced to make this change to avoid end user issues.
Improving 'Missing Dependencies' Experience
In some rare cases, mods which depend on other mods don't have the required update information to
download the other mod.
As Reloaded doesn't have a central package server, we copy the update info of each dependency into
each mod that depends on it. That update info is then used to download the needed dependencies in
lieu of a lack of a central package server. Reloaded updates this info on every reboot of the launcher.
In some cases, a modder may for example, forget to add update info to their mod, and some other mod
may set a dependency on it. Or the author of the mod that depends on it may have added the dependency
with a text editor, before hitting 'Publish'. In both these cases, the update info may be missing,
and dependency cannot be auto downloaded.
In this Release, 2 changes have been made to improve this experience:
- Hitting 'Publish' triggers the action to copy dependency info.
- Missing Dependency Dialog shows which mod's dependency is missing.
With these two changes, the likelyhood of a missing dependency error is reduced. And if it occurs,
it's easy to figure out which package was incorrectly uploaded/packaged or is missing update info.
Automatic Language Selection on First Boot
Bing Chilling!
This is very long overdue, and a simple change. When you first boot Reloaded-II, it'll
auto select the language for you. So if your system display language is 中文(简体), Reloaded
will auto select zh-CN.xaml
on first boot.
Drag & Drop Mod Installation
Mods can now be installed by dragging them over the Reloaded-II window.
This is intended to make mod installation easier in the cases where you're downloading a mod from
a place that doesn't provide you a '1 click install' button. (e.g. GitHub, Nexus, that certain
kinky mod site etc.)
Loader Logging Change
A small change to how the loader logs mods that are about to be loaded.
Old logs:
[Reloaded] Loaded: FlatOut2.Utils.ModLoader in 118ms
[Reloaded] Loaded: FlatOut2.Utils.RichPresence in 9ms
[Reloaded] Loaded: FlatOut2.Utils.ZPatch in 3ms
New logs:
[Reloaded] Loading 3 Mod(s).
[Reloaded]
[Reloaded] Loading: FlatOut 2 Mod Loader
[Reloaded] - AppId : FlatOut2.Utils.ModLoader
[Reloaded] - LoadTime: 112ms
[Reloaded]
[Reloaded] Loading: FlatOut 2 Discord Rich Presence
[Reloaded] - AppId : FlatOut2.Utils.RichPresence
[Reloaded] - LoadTime: 9ms
[Reloaded]
[Reloaded] Loading: ZPatch
[Reloaded] - AppId : FlatOut2.Utils.ZPatch
[Reloaded] - LoadTime: 3ms
Although more verbose, this change should make it easier for troubleshooting.
You can identify if a mod is stuck/deadlocked by the fact LoadTime
doesn't appear.
And you can more easily match up mod IDs to user friendly mod names.
Miscellaneous Changes
- Loader and Launcher now filter out duplicate mods (in a predictable manner).
- Updated translations. (@Mark-Shun @AntJun)
- Loader saves ~150KB of RAM again, with trimming re-enabled.
Bug Fixes
- Added a minimum height in mod update dialog.
- Fixed a bug where updating multiple outdated copies of the same mod at once would cause the launcher to crash.
- Added an explicit full config refresh during dependency resolution.
- Should make the 'Download Loop' issue less common on networked drives, maybe even OneDrive.
End of human written changelog.
Complete Changes (Autogenerated)
1.26.0 - 2024-03-11
Merged
- Fuck Microsoft Store DRM (Copy Protection)
#332
- Updated the Dutch translation to the latest version
#329
- Maintain mod order
#325
- Translation bug fixes
#326
- Update zh-CN.xaml
#324
Commits
- Increased the max search depth for mods.
7a1d0c7
- Updated file/folder watchers to look at subdirectories.
f040b3e
- Updated logic to check if a folder is in the Mod Config directory for mods in sub-directories.
c9ea5a3
- Added properties for the mod sub-directories and a ModNameDisplay to show the name in the user-interface without affecting the actual mod name that's stored in the json.
269c803
- Added method to set the mod subdirectories and update where needed.
0c55a39
- Show the mod display name in the Manage Mods and Configure Mods pages.
a6d06b9
- Updated the directory watchers to look at the subdirectories.
4a36f7f
- Added a rename watcher for subdirectories.
fc503c9
- Re-Added: Trimming to .NET 8 Loader Builds
ee57956
- Fix bug where duplicate mods are found during the directory scan.
d0ead01
- Updated: Launcher to Reloaded.Memory 9.X and added fast display name generation
a4b1b7a
- Optimized Config Reads with faster Deduplicate and Stopping Recursion Early
af101b5
- Perf: Stop recursion early on new found directories
b432e23
- OnDeleteDirectory: Paths sent here or in ItemsByFolder can't contain a separator, therefore, adding one conditionally is not needed.
2dc822e
- Improved: Slightly Optimize OnDeleteDirectory with nested children
a569b9c
- Removed: Redundant Directory Separators. Use start string to determine if contained.
1895275
- Improved: Speed of directory deletion in case of non-nested mods.
090f60c
- Add: Explicit Mod Refresh on Dependency Check & Revert Accidentally Deployed OneDrive Hack
d0ecf9e
- Changed: Restore additional path seperators to avoid unintended
7e9ec35
- Added: A Minimum Height in Update Dialog in case of Huge Mods
4a132a5
- Changed: Format of printing loaded mods at runtime, to provide more info and show potential deadlocks.
51a266e
- Error Handler: Show which missing dependency was required by which
4afe717
- Added: Indicator when a mod batch is being loaded.
3f767c4
- Fixed: Languages are now applied at start of program execution, fixing some dialogs not being translated.
f79d1a2
- Added: Default to user's System Language on First Launch
f7d8160
- Added: Ability to Drag & Drop Mods onto the Main Window
1af298b
- Bumped: Launcher Version & Added Changelog
ec4908d
- Added: Separate binary for doing the copying work.
3c3d917
- Changed: Bypass Execution Policy on Powershell during Invoke
d640d8d
- Fixed: Execution of unprotect when user name contains space.
da366b8
====
Previous Changelog (1.25.10) | Misc Hotfixes
- Fixed bug introduced in last update 32-bit Reloaded Launcher (
Reloaded-II32.exe
) couldn't DLL inject on 64-bit operating systems. - Slightly redesigned settings menu, to better expose language selection.
Also thanks to @Sencaid for German Translation, I missed that in last changelog >w<
Expect more minor bugfixes over weekend, this is just all I can do after work hours so far this week.
Defender Mitigation Announcement | Changelog (1.25.9)
This release (1.25.9) is dedicated to Windows Defender. I'll try to keep it short.
In the past week alone, I've seen over 300 reports of false positive virus detections
affecting users. At peak, around 4 issue reports an hour.
This is because Defender suddenly started flagging a small part of Reloaded related to DLL Injection
that I wrote (and haven't changed at all) in almost 4 years.
This was not easy for anyone. I respond to all issues, usually within 10 minutes if awake.
Likewise, volunteers in game specific modding servers also take their time out of their day to help
troubleshoot users' issues. It was a heavy burden on everyone.
This was Rough
As this coincided with 2 game releases, where people starting Reloaded, the timing could not have been
any more unfortunate. Many new users had to experience an absolute trainwreck of a first impression;
whether it be due to defender, some longstanding rare bugs, or silent antivirus treatment.
Worseover, I could not even fix these bugs. Because the virus detections were made by the 'machine learning'
side of Defender, releasing ANY UPDATE AT ALL means that 1000s of users would get new false positives.
Dolphin Emulator was in the same predicament a few years ago.
This was a result of the releases not being 'deterministic', the files in each Reloaded build/version
would change, even if the code didn't, and Defender would flag it. Reporting a false positive therefore
would be ineffective; defender would see it as a 'different file'. I COULD NOT RELEASE ANY UPDATES AT ALL.
Needless to say, the situation was so dire, I booked a day off work and spent around 50 hours this week
so far towards fixing the issue (10+ hours per day). I've spent almost every hour of every day out
of my bed getting this resolved.
So what's been done so far to mitigate this issue?
Replaced DLL Injection logic
R2 now uses my fork of dll-syringe, a Rust library based
on my old Reloaded.Injector.
Extra care has been taken to ensure this hopefully works as expected.
For the people running on Linux, I've even found, reported and worked around two new WINE bugs
#56357, #56362.
Hopefully, by replacing the entire DLL Injection logic, we can avoid any false positives for the time being.
I pray the next build does not give people false positives.
Note: The work there is not 'Reloaded3 Quality' yet, notably, performance wise.
The library is 300kB, when it could be ~40kB (unacceptable!!), and error handling could be better.
But it's good enough for a hotfix release. In the coming weeks, hopefully, I'll polish the rest up.
Deterministic Builds
I've made as many components of Reloaded-II as deterministic as possible. If the code doesn't change,
the actual files in the releases won't change.
This hopefully means that if a file gets a false positive virus detection, releasing an update won't
cause it to be flagged again.
Download Loops
Note
Historically this has been a very rare occurrence, but has been sighted more commonly recently.
Some people get stuck downloading dependencies. This usually manifests itself as a download window
appearing and disappearing endlessly on loop.
For the time being, I've added 'bare minimum' workaround. If Reloaded gets stuck, in a loop, it'll
inform you what it's failing to download, and ask you to install manually.
It's a very awful hack, but it's the best I can do for now. I could never reproduce this issue myself,
so fixing it is a shot in the dark. I'll eventually need to borrow someone inflicted by this bug.
That's All
In the future, say, with Reloaded3, I may invest in code signing certificate (i.e. legal form of
extortion to avoid false positives), but for now, I'm doing what I can.
I'm sorry for the inconvenience caused, and I want to thank all the volunteers who helped out with troubleshooting.
I'm aware some other issues are still present, I hope to get to them soon. However, I'm just a single
person, and there's only so much I can do...
Note
Most big modding frameworks/loaders/managers are maintained by teams of people. Unfortunately, I'm not that fortunate, it's all done solo here.