From e7d75ecc4021f89464f46158d9fb50883c463c39 Mon Sep 17 00:00:00 2001 From: leka1986 Date: Wed, 26 Aug 2026 18:13:12 +0200 Subject: [PATCH] Fix option cache for reused controllable wrappers --- Moose Development/Moose/Core/Database.lua | 4 ++ .../Moose/Wrapper/Controllable.lua | 59 +++++++++++-------- Moose Development/Moose/Wrapper/Group.lua | 5 +- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index 0bdb67ce1..16ca7b838 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -186,6 +186,8 @@ function DATABASE:AddUnit( DCSUnitName, force ) -- Register unit self.UNITS[DCSunitName]=UNIT:Register(DCSunitName) + else + self.UNITS[DCSunitName]:ResetOptionCacheIfDCSObjectChanged() end return self.UNITS[DCSunitName] @@ -802,6 +804,8 @@ function DATABASE:AddGroup( GroupName, force ) if not self.GROUPS[GroupName] or force == true then self:T( { "Add GROUP:", GroupName } ) self.GROUPS[GroupName] = GROUP:Register( GroupName ) + else + self.GROUPS[GroupName]:ResetOptionCacheIfDCSObjectChanged() end return self.GROUPS[GroupName] diff --git a/Moose Development/Moose/Wrapper/Controllable.lua b/Moose Development/Moose/Wrapper/Controllable.lua index 27ebc28a4..823f17990 100644 --- a/Moose Development/Moose/Wrapper/Controllable.lua +++ b/Moose Development/Moose/Wrapper/Controllable.lua @@ -3283,34 +3283,22 @@ end -- @param #number OptionValue Value of the option -- @return #CONTROLLABLE self function CONTROLLABLE:SetOption( OptionID, OptionValue ) - - local setnewoption = false - - -- Check if option has changed against cached option local ID = tostring(OptionID) - if self.ControllableOptions then - if (self.ControllableOptions[ID] ~= OptionValue) or (self.ControllableOptions[ID]==nil) then - setnewoption = true - self.ControllableOptions[ID] = OptionValue - --self:I(string.format("CONTROLLABLE %s: Option CHANGE for option %d: New value: %s!",self.ControllableName, OptionID, tostring(OptionValue))) - end + if OptionValue ~= nil and self.ControllableOptions and self.ControllableOptions[ID] == OptionValue then + return self end - - -- change option if changed - if setnewoption == true then - local DCSControllable = self:GetDCSObject() - if DCSControllable then - local Controller = self:_GetController() - --self:I(string.format("CONTROLLABLE %s: Setting OPTION %d: to value: %s!",self.ControllableName, OptionID, tostring(OptionValue))) - Controller:setOption( OptionID, OptionValue ) - return self - end - --else - --self:I(string.format("CONTROLLABLE %s: Option NO CHANGE for option %d: Same value: %s!",self.ControllableName, OptionID, tostring(OptionValue))) - end - - return nil + local DCSControllable = self:GetDCSObject() + if DCSControllable then + local Controller = DCSControllable:getController() + Controller:setOption( OptionID, OptionValue ) + self.ControllableOptions = self.ControllableOptions or {} + self.ControllableOptions[ID] = OptionValue + self.ControllableOptionDCSObject = DCSControllable + return self + end + + return nil end --- Query a (cached) option. Requires the option has been set with Moose(!) before. @@ -3325,6 +3313,27 @@ function CONTROLLABLE:QueryCachedOption(OptionID) return nil end +--- Reset cached options for this controllable. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:ResetOptionCache() + self.ControllableOptions = {} + self.ControllableOptionDCSObject = self:GetDCSObject() + return self +end + +--- Reset cached options when the underlying DCS object has changed. +-- @param #CONTROLLABLE self +-- @return #CONTROLLABLE self +function CONTROLLABLE:ResetOptionCacheIfDCSObjectChanged() + local DCSControllable = self:GetDCSObject() + if self.ControllableOptionDCSObject ~= DCSControllable then + self.ControllableOptions = {} + self.ControllableOptionDCSObject = DCSControllable + end + return self +end + --- Set option for Rules of Engagement (ROE). -- @param #CONTROLLABLE self -- @param #number ROEvalue ROE value. See ENUMS.ROE. diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 875c3e0c6..307b1a874 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -2272,9 +2272,8 @@ function GROUP:Respawn( Template, Reset ) -- Reset events. self:ResetEvents() - -- Reset options - self.ControllableOptions = nil - self.ControllableOptions = {} + -- Reset options. + self:ResetOptionCache() return self end