@@ -76,12 +76,14 @@ def dataLooksValid(
7676 self , filetree : mobase .IFileTree
7777 ) -> mobase .ModDataChecker .CheckReturn :
7878 status = mobase .ModDataChecker .INVALID
79+ if filetree .find ("ue4ss/UE4SS.dll" ) is not None :
80+ return mobase .ModDataChecker .FIXABLE
7981 for entry in filetree :
8082 name = entry .name ().casefold ()
8183 if entry .parent ().parent () is None :
8284 if is_directory (entry ):
8385 if name in [dirname .lower () for dirname in self ._dirs ]:
84- if name in ["obse" , "root" , "movies" ]:
86+ if name in ["obse" , "root" , "movies" , "paks" ]:
8587 status = mobase .ModDataChecker .VALID
8688 break
8789 for sub_entry in entry :
@@ -98,11 +100,14 @@ def dataLooksValid(
98100 else :
99101 if name == "paks" :
100102 for paks_entry in sub_entry :
101- if not is_directory ( paks_entry ):
102- paks_name = paks_entry . name (). casefold ()
103- if paks_name . endswith ( ".pak" ) :
103+ paks_name = paks_entry . name (). casefold ()
104+ if is_directory ( paks_entry ):
105+ if paks_name in [ "~mods" , "logicmods" ] :
104106 status = mobase .ModDataChecker .VALID
105107 break
108+ else :
109+ if paks_name .endswith (".pak" ):
110+ return mobase .ModDataChecker .VALID
106111 if status == mobase .ModDataChecker .VALID :
107112 break
108113 else :
@@ -122,6 +127,8 @@ def dataLooksValid(
122127 if status == mobase .ModDataChecker .VALID :
123128 break
124129 else :
130+ if name == "obse64_loader.exe" :
131+ return mobase .ModDataChecker .INVALID
125132 if name .endswith (
126133 tuple (self ._extensions + [".pak" , ".lua" , ".bk2" ])
127134 ):
@@ -146,15 +153,24 @@ def dataLooksValid(
146153 return status
147154
148155 def fix (self , filetree : mobase .IFileTree ) -> mobase .IFileTree :
156+ if filetree .find ("ue4ss/UE4SS.dll" ) is not None :
157+ entries = []
158+ for entry in filetree :
159+ entries .append (entry )
160+ for entry in entries :
161+ filetree .move (
162+ entry ,
163+ "Root/OblivionRemastered/Binaries/Win64/" ,
164+ mobase .IFileTree .MERGE ,
165+ )
166+ return filetree
149167 for entry in filetree :
150168 if entry is not None :
151169 if is_directory (entry ):
152170 if entry .name ().casefold () in [
153171 dirname .lower () for dirname in self ._data_dirs
154172 ]:
155- data_dir = filetree .find ("Data" )
156- if data_dir is None :
157- data_dir = filetree .addDirectory ("Data" )
173+ data_dir = self .get_dir (filetree , "Data" )
158174 entry .moveTo (data_dir )
159175 elif entry .name ().casefold () not in [
160176 dirname .lower () for dirname in self ._dirs
@@ -163,9 +179,7 @@ def fix(self, filetree: mobase.IFileTree) -> mobase.IFileTree:
163179 else :
164180 name = entry .name ().casefold ()
165181 if name .endswith (".pak" ):
166- paks_dir = filetree .find ("Paks" )
167- if paks_dir is None :
168- paks_dir = filetree .addDirectory ("Paks" )
182+ paks_dir = self .get_dir (filetree , "Paks/~mods" )
169183 pak_files : list [mobase .FileTreeEntry ] = []
170184 for file in entry .parent ():
171185 if file is not None :
@@ -179,9 +193,7 @@ def fix(self, filetree: mobase.IFileTree) -> mobase.IFileTree:
179193 for pak_file in pak_files :
180194 pak_file .moveTo (paks_dir )
181195 elif name .endswith (".bk2" ):
182- movies_dir = filetree .find ("Movies/Modern" )
183- if movies_dir is None :
184- movies_dir = filetree .addDirectory ("Movies/Modern" )
196+ movies_dir = self .get_dir (filetree , "Movies/Modern" )
185197 movie_files : list [mobase .FileTreeEntry ] = []
186198 for file in entry .parent ():
187199 if file is not None :
@@ -191,9 +203,7 @@ def fix(self, filetree: mobase.IFileTree) -> mobase.IFileTree:
191203 for movie_file in movie_files :
192204 movie_file .moveTo (movies_dir )
193205 elif name .endswith (tuple (self ._extensions )):
194- data_dir = filetree .find ("Data" )
195- if data_dir is None :
196- data_dir = filetree .addDirectory ("Data" )
206+ data_dir = self .get_dir (filetree , "Data" )
197207 data_files : list [mobase .FileTreeEntry ] = []
198208 for file in entry .parent ():
199209 data_files .append (file )
@@ -205,87 +215,66 @@ def parse_directory(
205215 self , main_filetree : mobase .IFileTree , next_dir : mobase .IFileTree
206216 ) -> mobase .IFileTree :
207217 for entry in next_dir :
208- name = entry .name ().casefold ()
209- if is_directory (entry ):
210- for dir_name in self ._dirs :
211- if name == dir_name .lower ():
212- if name == "ue4ss" :
213- ue4ss_mods = next_dir .find ("Mods" )
214- if ue4ss_mods :
215- if main_filetree .find ("UE4SS" ) is None :
216- main_filetree .addDirectory ("UE4SS" )
217- main_filetree .find ("UE4SS" ).merge (ue4ss_mods )
218- else :
219- main_filetree .move (next_dir , "" )
220- self .detach_parents (next_dir )
221- continue
222- elif name == "paks" :
223- if entry .find ("~mods" ):
224- main_filetree = self .parse_directory (
225- main_filetree , entry
226- )
218+ if entry is not None :
219+ name = entry .name ().casefold ()
220+ if is_directory (entry ):
221+ for dir_name in self ._dirs :
222+ if name == dir_name .lower ():
223+ if name == "paks" :
224+ paks_dir = self .get_dir (main_filetree , "Paks" )
225+ paks_dir .merge (entry )
226+ self .detach_parents (entry )
227227 continue
228- main_dir = main_filetree .find (dir_name )
229- if main_dir is None :
230- main_dir = main_filetree .addDirectory (dir_name )
231- main_dir .merge (entry )
228+ main_dir = self .get_dir (main_filetree , dir_name )
229+ main_dir .merge (entry )
230+ self .detach_parents (entry )
231+ if name in ["~mods" , "logicmods" ]:
232+ paks_dir = self .get_dir (main_filetree , "Paks" )
233+ entry .moveTo (paks_dir )
234+ continue
235+ elif name in [dirname .lower () for dirname in self ._data_dirs ]:
236+ data_dir = self .get_dir (main_filetree , "Data" )
237+ data_dir .merge (entry )
232238 self .detach_parents (entry )
233- if name == "~mods" :
234- paks_dir = main_filetree .find ("Paks" )
235- if paks_dir is None :
236- paks_dir = main_filetree .addDirectory ("Paks" )
237- paks_dir .merge (entry )
238- self .detach_parents (entry )
239- continue
240- elif name in [dirname .lower () for dirname in self ._data_dirs ]:
241- data_dir = main_filetree .find ("Data" )
242- if data_dir is None :
243- data_dir = main_filetree .addDirectory ("Data" )
244- data_dir .merge (entry )
245- self .detach_parents (entry )
246- continue
247- main_filetree = self .parse_directory (main_filetree , entry )
248- else :
249- if name .endswith (tuple (self ._extensions )):
250- data_dir = main_filetree .find ("Data" )
251- if data_dir is None :
252- data_dir = main_filetree .addDirectory ("Data" )
253- data_dir .merge (next_dir )
254- self .detach_parents (next_dir )
255- elif name .endswith (".pak" ):
256- paks_dir = main_filetree .find ("Paks" )
257- if paks_dir is None :
258- paks_dir = main_filetree .addDirectory ("Paks" )
259- if next_dir .name ().casefold () == "paks" :
260- paks_dir .merge (next_dir )
239+ continue
240+ main_filetree = self .parse_directory (main_filetree , entry )
241+ else :
242+ if name .endswith (tuple (self ._extensions )):
243+ data_dir = self .get_dir (main_filetree , "Data" )
244+ data_dir .merge (next_dir )
261245 self .detach_parents (next_dir )
262- return main_filetree
263- else :
264- main_filetree . move ( next_dir , "Paks/" )
265- return main_filetree
266- elif name . endswith ( ".lua" ):
267- if next_dir . parent () and next_dir . parent () != main_filetree :
268- if (
269- main_filetree .find (
270- "Root/OblivionRemastered/Binaries/Win64/ue4ss/Mods"
246+ elif name . endswith ( ".pak" ):
247+ paks_dir = self . get_dir ( main_filetree , "Paks" )
248+ if next_dir . name (). casefold () == "paks" :
249+ paks_dir . merge ( next_dir )
250+ self . detach_parents ( next_dir )
251+ return main_filetree
252+ else :
253+ main_filetree .move (
254+ next_dir , "Paks/~mods/" , mobase . IFileTree . MERGE
271255 )
272- is None
273- ):
274- main_filetree .addDirectory (
275- "Root/OblivionRemastered/Binaries/Win64/ue4ss/Mods"
256+ return main_filetree
257+ elif name .endswith (".lua" ):
258+ if next_dir .parent () and next_dir .parent () != main_filetree :
259+ if (
260+ main_filetree .find (
261+ "Root/OblivionRemastered/Binaries/Win64/ue4ss/Mods"
262+ )
263+ is None
264+ ):
265+ main_filetree .addDirectory (
266+ "Root/OblivionRemastered/Binaries/Win64/ue4ss/Mods"
267+ )
268+ main_filetree .move (
269+ next_dir .parent (),
270+ "Root/OblivionRemastered/Binaries/Win64/ue4ss/Mods/" ,
276271 )
277- main_filetree .move (
278- next_dir .parent (),
279- "Root/OblivionRemastered/Binaries/Win64/ue4ss/Mods/" ,
280- )
281- self .detach_parents (main_filetree )
282- return main_filetree
283- elif name .endswith (".bk2" ):
284- movies_dir = main_filetree .find ("Movies/Modern" )
285- if movies_dir is None :
286- movies_dir = main_filetree .addDirectory ("Movies/Modern" )
287- movies_dir .merge (next_dir )
288- self .detach_parents (next_dir )
272+ self .detach_parents (main_filetree )
273+ return main_filetree
274+ elif name .endswith (".bk2" ):
275+ movies_dir = self .get_dir (main_filetree , "Movies/Modern" )
276+ movies_dir .merge (next_dir )
277+ self .detach_parents (next_dir )
289278
290279 return main_filetree
291280
@@ -302,6 +291,12 @@ def detach_parents(self, directory: mobase.IFileTree) -> None:
302291 else :
303292 directory .detach ()
304293
294+ def get_dir (self , filetree : mobase .IFileTree , directory : str ) -> mobase .IFileTree :
295+ tree_dir = filetree .find (directory )
296+ if tree_dir is None :
297+ tree_dir = filetree .addDirectory (directory )
298+ return tree_dir
299+
305300
306301class OblivionRemasteredGamePlugins (mobase .GamePlugins ):
307302 def __init__ (self , organizer : mobase .IOrganizer ):
@@ -604,8 +599,7 @@ def moviesDirectory(self) -> QDir:
604599
605600 def paksDirectory (self ) -> QDir :
606601 return QDir (
607- self .gameDirectory ().absolutePath ()
608- + "/OblivionRemastered/Content/Paks/~mods"
602+ self .gameDirectory ().absolutePath () + "/OblivionRemastered/Content/Paks"
609603 )
610604
611605 def obseDirectory (self ) -> QDir :
0 commit comments