diff --git a/.gitignore b/.gitignore index f058e01f..ec279d3d 100644 --- a/.gitignore +++ b/.gitignore @@ -21,5 +21,5 @@ logs/ qt_ui/logs/liberation.log *.psd -plugin/custom/__plugins.lst -plugin/custom/*.lua +resources/plugins/custom/__plugins.lst +resources/plugins/custom/*.lua diff --git a/.gitmodules b/.gitmodules index e4041d5d..4d2ad31a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,6 @@ [submodule "plugin/veaf"] path = plugin/veaf url = https://github.com/VEAF/dcs-liberation-veaf-framework +[submodule "resources/plugins/veaf"] + path = resources/plugins/veaf + url = https://github.com/VEAF/dcs-liberation-veaf-framework diff --git a/game/game.py b/game/game.py index 57fabfd6..67eeb200 100644 --- a/game/game.py +++ b/game/game.py @@ -28,6 +28,7 @@ from .event.event import Event, UnitsDeliveryEvent from .event.frontlineattack import FrontlineAttackEvent from .infos.information import Information from .settings import Settings +from plugin import INSTALLED_PLUGINS COMMISION_UNIT_VARIETY = 4 COMMISION_LIMITS_SCALE = 1.5 @@ -217,6 +218,11 @@ class Game: def on_load(self) -> None: ObjectiveDistanceCache.set_theater(self.theater) + + # set the settings in all plugins + for pluginName in INSTALLED_PLUGINS: + plugin = INSTALLED_PLUGINS[pluginName] + plugin.setSettings(self.settings) def pass_turn(self, no_action=False): logging.info("Pass turn") diff --git a/game/operation/operation.py b/game/operation/operation.py index b537395e..e42d7b14 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -148,7 +148,8 @@ class Operation: if pluginName == None: pluginName = "custom" - plugin_path = Path("./plugin",pluginName) + plugin_path = Path("./resources/plugins",pluginName) + logging.debug(f"plugin_path = {plugin_path}") if scriptFile != None: scriptFile_path = Path(plugin_path, scriptFile) @@ -468,7 +469,8 @@ dcsLiberation.TargetPoints = { # Inject Plugins Lua Scripts and data self.listOfPluginsScripts = [] - for plugin in INSTALLED_PLUGINS: + for pluginName in INSTALLED_PLUGINS: + plugin = INSTALLED_PLUGINS[pluginName] plugin.injectScripts(self) plugin.injectConfiguration(self) diff --git a/game/settings.py b/game/settings.py index 5d0d5c91..bb7754d4 100644 --- a/game/settings.py +++ b/game/settings.py @@ -1,3 +1,4 @@ +from plugin import INSTALLED_PLUGINS class Settings: @@ -24,8 +25,6 @@ class Settings: self.sams = True # Legacy parameter do not use self.cold_start = False # Legacy parameter do not use self.version = None - self.include_jtac_if_available = True - self.jtac_smoke_on = True # Performance oriented self.perf_red_alert_state = True @@ -42,5 +41,9 @@ class Settings: # LUA Plugins system self.plugins = {} + for pluginName in INSTALLED_PLUGINS: + plugin = INSTALLED_PLUGINS[pluginName] + plugin.setSettings(self) + diff --git a/gen/armor.py b/gen/armor.py index b6133b6b..21ae5a25 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -34,6 +34,7 @@ from gen.ground_forces.ai_ground_planner import ( from .callsigns import callsign_for_support_unit from .conflictgen import Conflict from .ground_forces.combat_stance import CombatStance +from plugin import INSTALLED_PLUGINS SPREAD_DISTANCE_FACTOR = 0.1, 0.3 SPREAD_DISTANCE_SIZE_FACTOR = 0.1 @@ -139,7 +140,8 @@ class GroundConflictGenerator: self.plan_action_for_groups(self.enemy_stance, enemy_groups, player_groups, self.conflict.heading - 90, self.conflict.to_cp, self.conflict.from_cp) # Add JTAC - if "has_jtac" in self.game.player_faction and self.game.player_faction["has_jtac"] and self.game.settings.include_jtac_if_available: + useJTAC = INSTALLED_PLUGINS and INSTALLED_PLUGINS["JtacAutolasePlugin"] and INSTALLED_PLUGINS["JtacAutolasePlugin"].isEnabled() + if "has_jtac" in self.game.player_faction and self.game.player_faction["has_jtac"] and useJTAC: n = "JTAC" + str(self.conflict.from_cp.id) + str(self.conflict.to_cp.id) code = 1688 - len(self.jtacs) diff --git a/plugin/__init__.py b/plugin/__init__.py index c3cd6fb2..2bbf459c 100644 --- a/plugin/__init__.py +++ b/plugin/__init__.py @@ -3,8 +3,8 @@ from .veaf_plugin import VeafPlugin from .jtacautolase_plugin import JtacAutolasePlugin from .liberation_plugin import LiberationPlugin -INSTALLED_PLUGINS=[ - VeafPlugin(), - JtacAutolasePlugin(), - LiberationPlugin() - ] \ No newline at end of file +INSTALLED_PLUGINS={ + "VeafPlugin": VeafPlugin(), + "JtacAutolasePlugin": JtacAutolasePlugin(), + "LiberationPlugin": LiberationPlugin(), +} diff --git a/plugin/base_plugin.py b/plugin/base_plugin.py index c2a850e2..4eb6e744 100644 --- a/plugin/base_plugin.py +++ b/plugin/base_plugin.py @@ -15,16 +15,18 @@ class BasePlugin(): def setupUI(self, settingsWindow, row:int): self.settings = settingsWindow.game.settings - if not self.nameInSettings in self.settings.plugins: - self.settings.plugins[self.nameInSettings] = self.enabledDefaultValue - self.uiWidget = QCheckBox() - self.uiWidget.setChecked(self.settings.plugins[self.nameInSettings]) + self.uiWidget.setChecked(self.isEnabled()) self.uiWidget.toggled.connect(lambda: self.applySetting(settingsWindow)) settingsWindow.pluginsGroupLayout.addWidget(QLabel(self.nameInUI), row, 0) settingsWindow.pluginsGroupLayout.addWidget(self.uiWidget, row, 1, Qt.AlignRight) + def setSettings(self, settings): + self.settings = settings + if not self.nameInSettings in self.settings.plugins: + self.settings.plugins[self.nameInSettings] = self.enabledDefaultValue + def applySetting(self, settingsWindow): self.settings.plugins[self.nameInSettings] = self.uiWidget.isChecked() self.enabled = self.settings.plugins[self.nameInSettings] @@ -38,4 +40,9 @@ class BasePlugin(): return self.isEnabled() def isEnabled(self) -> bool: + if not self.settings: + return False + + self.setSettings(self.settings) # create the necessary settings keys if needed + return self.settings != None and self.settings.plugins[self.nameInSettings] diff --git a/plugin/jtacautolase_plugin.py b/plugin/jtacautolase_plugin.py index d8becf03..8b0c316c 100644 --- a/plugin/jtacautolase_plugin.py +++ b/plugin/jtacautolase_plugin.py @@ -12,6 +12,7 @@ class JtacAutolasePlugin(BasePlugin): #Allow spawn option nameInUI_useSmoke:str = "JTACs use smoke" nameInSettings_useSmoke:str = "plugin.jtacAutolase.useSmoke" + enabledDefaultValue_useSmoke:bool = True def setupUI(self, settingsWindow, row:int): # call the base method to add the plugin selection checkbox @@ -42,6 +43,12 @@ class JtacAutolasePlugin(BasePlugin): pluginEnabled = self.uiWidget.isChecked() self.optionsGroup.setEnabled(pluginEnabled) + def setSettings(self, settings): + # call the base method + super().setSettings(settings) + if not self.nameInSettings_useSmoke in self.settings.plugins: + self.settings.plugins[self.nameInSettings_useSmoke] = self.enabledDefaultValue_useSmoke + def applySetting(self, settingsWindow): # call the base method to apply the plugin selection checkbox value super().applySetting(settingsWindow) @@ -61,7 +68,7 @@ class JtacAutolasePlugin(BasePlugin): # add a configuration for JTACAutoLase and start lasing for all JTACs smoke = "local smoke = false" - if self.settings.plugins[self.nameInSettings_useSmoke]: + if self.isUseSmoke(): smoke = "local smoke = true" lua = smoke + """ @@ -78,3 +85,11 @@ class JtacAutolasePlugin(BasePlugin): operation.injectLuaTrigger(lua, "Setting and starting JTACs") + def isUseSmoke(self) -> bool: + if not self.settings: + return False + + self.setSettings(self.settings) # create the necessary settings keys if needed + + return self.settings.plugins[self.nameInSettings_useSmoke] + diff --git a/plugin/liberation_plugin.py b/plugin/liberation_plugin.py index e9a01a39..ef97be3a 100644 --- a/plugin/liberation_plugin.py +++ b/plugin/liberation_plugin.py @@ -18,3 +18,6 @@ class LiberationPlugin(BasePlugin): def injectConfiguration(self, operation): if super().injectConfiguration(operation): pass + + def isEnabled(self) -> bool: + return True # mandatory plugin diff --git a/plugin/veaf_plugin.py b/plugin/veaf_plugin.py index 2e3b0531..c32cd86a 100644 --- a/plugin/veaf_plugin.py +++ b/plugin/veaf_plugin.py @@ -61,7 +61,7 @@ class VeafPlugin(BasePlugin): operation.injectPluginScript("veaf", "src\\scripts\\mist.lua", "mist") operation.injectPluginScript("veaf", "src\\scripts\\Moose.lua", "moose") operation.injectPluginScript("veaf", "src\\scripts\\CTLD.lua", "ctld") - operation.injectPluginScript("veaf", "src\\scripts\\NIOD.lua", "niod") + #operation.injectPluginScript("veaf", "src\\scripts\\NIOD.lua", "niod") operation.injectPluginScript("veaf", "src\\scripts\\WeatherMark.lua", "weathermark") operation.injectPluginScript("veaf", "src\\scripts\\veaf.lua", "veaf") operation.injectPluginScript("veaf", "src\\scripts\\dcsUnits.lua", "dcsunits") diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 82010be9..88382ee0 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -183,28 +183,10 @@ class QSettingsWindow(QDialog): self.generate_marks.setChecked(self.game.settings.generate_marks) self.generate_marks.toggled.connect(self.applySettings) - - if not hasattr(self.game.settings, "include_jtac_if_available"): - self.game.settings.include_jtac_if_available = True - if not hasattr(self.game.settings, "jtac_smoke_on"): - self.game.settings.jtac_smoke_on= True - - self.include_jtac_if_available = QCheckBox() - self.include_jtac_if_available.setChecked(self.game.settings.include_jtac_if_available) - self.include_jtac_if_available.toggled.connect(self.applySettings) - - self.jtac_smoke_on = QCheckBox() - self.jtac_smoke_on.setChecked(self.game.settings.jtac_smoke_on) - self.jtac_smoke_on.toggled.connect(self.applySettings) - self.gameplayLayout.addWidget(QLabel("Use Supercarrier Module"), 0, 0) self.gameplayLayout.addWidget(self.supercarrier, 0, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Put Objective Markers on Map"), 1, 0) self.gameplayLayout.addWidget(self.generate_marks, 1, 1, Qt.AlignRight) - self.gameplayLayout.addWidget(QLabel("Include JTAC (If available)"), 2, 0) - self.gameplayLayout.addWidget(self.include_jtac_if_available, 2, 1, Qt.AlignRight) - self.gameplayLayout.addWidget(QLabel("Enable JTAC smoke markers"), 3, 0) - self.gameplayLayout.addWidget(self.jtac_smoke_on, 3, 1, Qt.AlignRight) self.performance = QGroupBox("Performance") self.performanceLayout = QGridLayout() @@ -315,7 +297,8 @@ class QSettingsWindow(QDialog): self.pluginsGroup.setLayout(self.pluginsGroupLayout) row:int = 0 - for plugin in INSTALLED_PLUGINS: + for pluginName in INSTALLED_PLUGINS: + plugin = INSTALLED_PLUGINS[pluginName] plugin.setupUI(self, row) row = row + 1 @@ -342,8 +325,6 @@ class QSettingsWindow(QDialog): self.game.settings.map_coalition_visibility = self.mapVisibiitySelection.currentData() self.game.settings.external_views_allowed = self.ext_views.isChecked() self.game.settings.generate_marks = self.generate_marks.isChecked() - self.game.settings.include_jtac_if_available = self.include_jtac_if_available.isChecked() - self.game.settings.jtac_smoke_on = self.jtac_smoke_on.isChecked() print(self.game.settings.map_coalition_visibility) diff --git a/plugin/base/dcs_liberation.lua b/resources/plugins/base/dcs_liberation.lua similarity index 100% rename from plugin/base/dcs_liberation.lua rename to resources/plugins/base/dcs_liberation.lua diff --git a/plugin/base/json.lua b/resources/plugins/base/json.lua similarity index 100% rename from plugin/base/json.lua rename to resources/plugins/base/json.lua diff --git a/plugin/base/mist_4_3_74.lua b/resources/plugins/base/mist_4_3_74.lua similarity index 100% rename from plugin/base/mist_4_3_74.lua rename to resources/plugins/base/mist_4_3_74.lua diff --git a/plugin/custom/__plugins.lst.sample b/resources/plugins/custom/__plugins.lst.sample similarity index 100% rename from plugin/custom/__plugins.lst.sample rename to resources/plugins/custom/__plugins.lst.sample diff --git a/resources/plugins/doc/0.png b/resources/plugins/doc/0.png new file mode 100644 index 00000000..3320b908 Binary files /dev/null and b/resources/plugins/doc/0.png differ diff --git a/resources/plugins/doc/1.png b/resources/plugins/doc/1.png new file mode 100644 index 00000000..069c45db Binary files /dev/null and b/resources/plugins/doc/1.png differ diff --git a/resources/plugins/doc/2.png b/resources/plugins/doc/2.png new file mode 100644 index 00000000..97952fde Binary files /dev/null and b/resources/plugins/doc/2.png differ diff --git a/plugin/jtacautolase/JTACAutoLase.lua b/resources/plugins/jtacautolase/JTACAutoLase.lua similarity index 100% rename from plugin/jtacautolase/JTACAutoLase.lua rename to resources/plugins/jtacautolase/JTACAutoLase.lua diff --git a/plugin/veaf b/resources/plugins/veaf similarity index 100% rename from plugin/veaf rename to resources/plugins/veaf