Skip to content

Commit eec1cd7

Browse files
committed
Improved mod handling
- Map 'Paks' to game 'Paks' (instead of ~mods) - Validate LogicMods Paks dir - Handle core OBSE / UE4SS files better - Add 'get_dir' function to simplify code
1 parent b23e892 commit eec1cd7

File tree

1 file changed

+88
-94
lines changed

1 file changed

+88
-94
lines changed

games/game_oblivion_remaster.py

Lines changed: 88 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -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

306301
class 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

Comments
 (0)