aboutsummaryrefslogtreecommitdiff
path: root/libs/form43_checker/src
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
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')
-rw-r--r--libs/form43_checker/src/CMakeLists.txt6
-rw-r--r--libs/form43_checker/src/Form43Checker.py105
-rw-r--r--libs/form43_checker/src/Form43Checker_en.ts27
3 files changed, 138 insertions, 0 deletions
diff --git a/libs/form43_checker/src/CMakeLists.txt b/libs/form43_checker/src/CMakeLists.txt
new file mode 100644
index 0000000..7237e8a
--- /dev/null
+++ b/libs/form43_checker/src/CMakeLists.txt
@@ -0,0 +1,6 @@
+cmake_minimum_required(VERSION 3.16)
+
+find_package(mo2-cmake CONFIG REQUIRED)
+
+add_custom_target(Form43Checker ALL)
+mo2_configure_python(Form43Checker SIMPLE)
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()
diff --git a/libs/form43_checker/src/Form43Checker_en.ts b/libs/form43_checker/src/Form43Checker_en.ts
new file mode 100644
index 0000000..b758636
--- /dev/null
+++ b/libs/form43_checker/src/Form43Checker_en.ts
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+ <context>
+ <name>Form43Checker</name>
+ <message>
+ <location filename="Form43Checker.py" line="27" />
+ <source>Checks plugins (.ESM/.ESP files) to see if any are lower than Form 44 (Skyrim SE).</source>
+ <translation type="unfinished" />
+ </message>
+ <message>
+ <location filename="Form43Checker.py" line="49" />
+ <source>Form 43 (or lower) plugin detected</source>
+ <translation type="unfinished" />
+ </message>
+ <message>
+ <location filename="Form43Checker.py" line="55" />
+ <source>You have one or more plugins that are not form 44. They are:{0}</source>
+ <translation type="unfinished" />
+ </message>
+ <message>
+ <location filename="Form43Checker.py" line="59" />
+ <source>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.&lt;br&gt;&lt;br&gt;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.&lt;br&gt;&lt;br&gt;Online guides can have more information on how to correctly convert mods for Skyrim SE.&lt;br&gt;</source>
+ <translation type="unfinished" />
+ </message>
+ </context>
+</TS>