aboutsummaryrefslogtreecommitdiff
path: root/libs/form43_checker/src/Form43Checker.py
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
commit7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch)
tree27fb39be241fdb5ac2734c574de678977d1856d0 /libs/form43_checker/src/Form43Checker.py
Fluorine Manager: full Linux port of Mod Organizer 2
Complete native Linux port with FUSE-based virtual filesystem, Proton/umu-run integration, and Flatpak packaging. Key features: - FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak) - Proton/GE-Proton/umu-run launcher with env var forwarding - Flatpak support (sandbox-aware VFS, NXM handler, umu-run) - Wine prefix management UI - Case-insensitive path resolution for Linux filesystems - QSettings-safe INI handling (avoids Bethesda INI corruption) - Portable instance support with auto-generated launcher scripts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'libs/form43_checker/src/Form43Checker.py')
-rw-r--r--libs/form43_checker/src/Form43Checker.py105
1 files changed, 105 insertions, 0 deletions
diff --git a/libs/form43_checker/src/Form43Checker.py b/libs/form43_checker/src/Form43Checker.py
new file mode 100644
index 0000000..339f6c9
--- /dev/null
+++ b/libs/form43_checker/src/Form43Checker.py
@@ -0,0 +1,105 @@
+from pathlib import Path
+
+import mobase
+from PyQt6.QtCore import QCoreApplication
+
+
+class Form43Checker(mobase.IPluginDiagnose):
+ __organizer: mobase.IOrganizer
+ __invalidPlugins: list[str] = []
+
+ def __init__(self):
+ super().__init__()
+
+ def init(self, organizer: mobase.IOrganizer):
+ self.__organizer = organizer
+ return True
+
+ def name(self):
+ return "Form 43 Plugin Checker"
+
+ def localizedName(self):
+ return "Form 43 Plugin Checker"
+
+ def author(self):
+ return "AnyOldName3"
+
+ def description(self):
+ return self.tr(
+ "Checks plugins (.ESM/.ESP files) to see if any are lower than Form 44 (Skyrim SE)."
+ )
+
+ def version(self):
+ return mobase.VersionInfo(1, 2, 0, 0, mobase.ReleaseType.FINAL)
+
+ def requirements(self):
+ return [
+ mobase.PluginRequirementFactory.gameDependency("Skyrim Special Edition")
+ ]
+
+ def settings(self) -> list[mobase.PluginSetting]:
+ return []
+
+ def activeProblems(self) -> list[int]:
+ self.__updateInvalidPlugins()
+ if self.__invalidPlugins:
+ return [0]
+ else:
+ return []
+
+ def shortDescription(self, key: int) -> str:
+ return self.tr("Form 43 (or lower) plugin detected")
+
+ def fullDescription(self, key: int) -> str:
+ pluginList = self.__listPlugins()
+ pluginListString = "<br><br>• " + ("<br>• ".join(pluginList))
+ outputString = self.tr(
+ "You have one or more plugins that are not form 44. They are:{0}"
+ ).format(pluginListString)
+ outputString += "<br><br>"
+ outputString += self.tr(
+ "Form 43 (or lower) plugins are modules that were made for Skyrim LE (Oldrim) and have not been "
+ "properly ported to Skyrim Special Edition, which uses form 44 plugins. This usually results in "
+ "parts of the mod not working correctly."
+ "<br><br>"
+ "To be converted, these plugins simply need to be opened and saved with the SSE Creation Kit "
+ "but their presence can be an indication that a mod was not properly ported to SSE and so "
+ "can potentially have additional issues."
+ "<br><br>"
+ "Online guides can have more information on how to correctly convert mods for Skyrim SE.<br>"
+ )
+ return outputString
+
+ def hasGuidedFix(self, key: int) -> bool:
+ return False
+
+ def startGuidedFix(self, key: int) -> None:
+ # Maybe we could use xEdit or something to resave the file?
+ pass
+
+ def tr(self, value: str):
+ return QCoreApplication.translate("Form43Checker", value)
+
+ def __testFile(self, path: str) -> bool:
+ version = self.__getForm(path)
+ return version != -1 and version < 44
+
+ def __getForm(self, file: str) -> int:
+ pluginName = Path(file).name
+ return self.__organizer.pluginList().formVersion(pluginName)
+
+ def __updateInvalidPlugins(self) -> None:
+ self.__invalidPlugins.clear()
+ for file in self.__organizer.findFiles("", "*.es[pm]"):
+ if self.__testFile(file):
+ self.__invalidPlugins.append(file)
+
+ def __listPlugins(self) -> list[str]:
+ return [
+ f"{Path(file).name} (form {self.__getForm(file)})"
+ for file in self.__invalidPlugins
+ ]
+
+
+def createPlugin():
+ return Form43Checker()