|
2 | 2 | import re |
3 | 3 | import shutil |
4 | 4 | from collections import Counter |
5 | | -from collections.abc import Iterable |
| 5 | +from collections.abc import Iterable, Mapping |
6 | 6 | from dataclasses import dataclass |
7 | 7 | from pathlib import Path |
8 | | -from typing import Literal, TypeVar |
| 8 | +from typing import Any, Literal, TypeVar |
9 | 9 |
|
10 | 10 | import mobase |
11 | 11 | from PyQt6.QtCore import QDateTime, QDir, qInfo |
@@ -294,10 +294,27 @@ def active_mod_paths(self) -> Iterable[Path]: |
294 | 294 | yield mods_path / mod |
295 | 295 |
|
296 | 296 |
|
| 297 | +@dataclass |
| 298 | +class PluginDefaultSettings: |
| 299 | + organizer: mobase.IOrganizer |
| 300 | + plugin_name: str |
| 301 | + settings: Mapping[str, mobase.MoVariant] |
| 302 | + |
| 303 | + def is_plugin_enabled(self): |
| 304 | + return self.organizer.isPluginEnabled(self.plugin_name) |
| 305 | + |
| 306 | + def apply(self) -> bool: |
| 307 | + if not self.is_plugin_enabled(): |
| 308 | + return False |
| 309 | + for setting, value in self.settings.items(): |
| 310 | + self.organizer.setPluginSetting(self.plugin_name, setting, value) |
| 311 | + return True |
| 312 | + |
| 313 | + |
297 | 314 | class Cyberpunk2077Game(BasicGame): |
298 | 315 | Name = "Cyberpunk 2077 Support Plugin" |
299 | 316 | Author = "6788, Zash" |
300 | | - Version = "2.1.0" |
| 317 | + Version = "2.2.0" |
301 | 318 |
|
302 | 319 | GameName = "Cyberpunk 2077" |
303 | 320 | GameShortName = "cyberpunk2077" |
@@ -341,7 +358,32 @@ def init(self, organizer: mobase.IOrganizer) -> bool: |
341 | 358 | "mods/*/", |
342 | 359 | ), |
343 | 360 | ) |
| 361 | + self._rootbuilder_settings = PluginDefaultSettings( |
| 362 | + organizer, |
| 363 | + "RootBuilder", |
| 364 | + { |
| 365 | + "usvfsmode": False, |
| 366 | + "linkmode": False, |
| 367 | + "linkonlymode": True, # RootBuilder v4.5 |
| 368 | + "backup": True, |
| 369 | + "cache": True, |
| 370 | + "autobuild": True, |
| 371 | + "redirect": False, |
| 372 | + "installer": False, |
| 373 | + "exclusions": "archive,setup_redlauncher.exe,tools", |
| 374 | + "linkextensions": "dll,exe", |
| 375 | + }, |
| 376 | + ) |
| 377 | + |
| 378 | + def apply_rootbuilder_settings_once(*args: Any): |
| 379 | + if not self.isActive() or not self._get_setting("configure_RootBuilder"): |
| 380 | + return |
| 381 | + if self._rootbuilder_settings.apply(): |
| 382 | + qInfo(f"RootBuilder configured for {self.gameName()}") |
| 383 | + self._set_setting("configure_RootBuilder", False) |
344 | 384 |
|
| 385 | + organizer.onUserInterfaceInitialized(apply_rootbuilder_settings_once) |
| 386 | + organizer.onPluginEnabled("RootBuilder", apply_rootbuilder_settings_once) |
345 | 387 | organizer.onAboutToRun(self._onAboutToRun) |
346 | 388 | return True |
347 | 389 |
|
@@ -380,11 +422,19 @@ def settings(self) -> list[mobase.PluginSetting]: |
380 | 422 | "Deploy redmod before game launch if necessary", |
381 | 423 | True, |
382 | 424 | ), |
| 425 | + mobase.PluginSetting( |
| 426 | + "configure_RootBuilder", |
| 427 | + "Configures RootBuilder for Cyberpunk if installed and enabled", |
| 428 | + True, |
| 429 | + ), |
383 | 430 | ] |
384 | 431 |
|
385 | 432 | def _get_setting(self, key: str) -> mobase.MoVariant: |
386 | 433 | return self._organizer.pluginSetting(self.name(), key) |
387 | 434 |
|
| 435 | + def _set_setting(self, key: str, value: mobase.MoVariant): |
| 436 | + self._organizer.setPluginSetting(self.name(), key, value) |
| 437 | + |
388 | 438 | def executables(self) -> list[mobase.ExecutableInfo]: |
389 | 439 | game_name = self.gameName() |
390 | 440 | game_dir = self.gameDirectory() |
@@ -439,7 +489,7 @@ def _onAboutToRun(self, app_path_str: str, wd: QDir, args: str) -> bool: |
439 | 489 | and "-modded" in args |
440 | 490 | and not self._deploy_redmod() |
441 | 491 | ): |
442 | | - return False |
| 492 | + return False # Auto deploy failed |
443 | 493 | self._map_cache_files() |
444 | 494 | if self._get_setting("enforce_archive_load_order"): |
445 | 495 | self._modlist_files.update_modlist("archive") |
|
0 commit comments