2
2
#include < MinHook.h>
3
3
4
4
#include " ModLoader.h"
5
+ #include " Hook.h"
6
+ #include " Log.h"
5
7
#include " util/Hooking.h"
6
8
7
9
#include " cdc/file/MultiFileSystem.h"
10
+ #include " cdc/file/ArchiveFileSystem.h"
8
11
9
12
#include " file/FileSystem.h"
10
13
#include " file/HookFileSystem.h"
11
14
#include " file/MultiFileSystem.h"
15
+ #include " file/ModFileSystem.h"
16
+
17
+ static ModLoader* loader = nullptr ;
12
18
13
19
static cdc::FileSystem* CreateHookFileSystem ()
14
20
{
@@ -43,10 +49,9 @@ static void InitArchive()
43
49
44
50
// Create our hook file system and multi file system
45
51
auto fileSystem = CreateHookFileSystem ();
46
- auto multiFileSystem = new MultiFileSystem ();
52
+ auto multiFileSystem = loader-> GetFileSystem ();
47
53
48
- // auto archiveFile = new cdc::ArchiveFileSystem(*(cdc::FileSystem**)0x838890);
49
- // archiveFile->Open("mods/bigfile.000");
54
+ loader->MountMods ();
50
55
51
56
multiFileSystem->Add (fileSystem);
52
57
multiFileSystem->Add (GetFS ());
@@ -56,13 +61,67 @@ static void InitArchive()
56
61
}
57
62
58
63
// Initialize the mod loader and insert all hooks
59
- ModLoader::ModLoader ()
64
+ ModLoader::ModLoader () : m_fileSystem()
60
65
{
66
+ loader = this ;
67
+
61
68
#ifndef TR8
62
69
MH_CreateHook ((void *)GET_ADDRESS (0x45C670 , 0x45F5B0 , 0x473840 ), InitArchive, (void **)&s_InitArchive);
63
70
#else
64
71
MH_CreateHook ((void *)0x478930 , InitPatchArchive, (void **)&s_InitPatchArchive);
65
72
#endif
66
73
67
74
MH_EnableHook (MH_ALL_HOOKS);
75
+ }
76
+
77
+ void ModLoader::MountMods ()
78
+ {
79
+ auto log = Hook::GetInstance ().GetModule <Log>();
80
+
81
+ for (auto & entry : std::filesystem::directory_iterator (" mods" ))
82
+ {
83
+ auto name = entry.path ().filename ();
84
+
85
+ // Mount files with bigfile extension as archive
86
+ if (entry.is_regular_file () && name.extension () == " .000" )
87
+ {
88
+ log->WriteLine (" Mounting mod archive %s" , name.string ().c_str ());
89
+
90
+ MountArchive (name);
91
+ }
92
+
93
+ // Mount folders as new mod file system
94
+ if (entry.is_directory ())
95
+ {
96
+ log->WriteLine (" Mounting mod directory %s" , name.string ().c_str ());
97
+
98
+ MountDirectory (name);
99
+ }
100
+ }
101
+ }
102
+
103
+ void ModLoader::MountArchive (std::filesystem::path& name) noexcept
104
+ {
105
+ auto path = " mods" / name;
106
+
107
+ // Open the archive
108
+ auto archive = new cdc::ArchiveFileSystem (*(cdc::FileSystem**)0x838890 );
109
+ archive->Open (path.string ().c_str ());
110
+
111
+ // Mount the archive
112
+ m_fileSystem.Add ((cdc::FileSystem*)archive);
113
+ }
114
+
115
+ void ModLoader::MountDirectory (std::filesystem::path& name) noexcept
116
+ {
117
+ auto path = " mods" / name;
118
+ auto fileSystem = new ModFileSystem (name.string ().c_str ());
119
+
120
+ // Mount the file system
121
+ m_fileSystem.Add (fileSystem);
122
+ }
123
+
124
+ MultiFileSystem* ModLoader::GetFileSystem () noexcept
125
+ {
126
+ return &m_fileSystem;
68
127
}
0 commit comments