From 39e3f8b646700c8c351889735945655dba2d4a16 Mon Sep 17 00:00:00 2001 From: smiki Date: Wed, 28 Jan 2026 11:56:09 +0100 Subject: [PATCH 1/7] [FIX] Memory leak caused by continuous F10 redrawing that for marker (add, remove) which creates new coordinate. --- Moose Development/Moose/Core/Event.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 87847f95a..23c1733e9 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -1519,7 +1519,6 @@ function EVENT:onEvent( Event ) if Event.idx then Event.MarkID=Event.idx Event.MarkVec3=Event.pos - Event.MarkCoordinate=COORDINATE:NewFromVec3(Event.pos) Event.MarkText=Event.text Event.MarkCoalition=Event.coalition Event.IniCoalition=Event.coalition From ae156259c047d9fdee7738f68a6488457797c761 Mon Sep 17 00:00:00 2001 From: smiki Date: Wed, 28 Jan 2026 12:01:53 +0100 Subject: [PATCH 2/7] [FIX] Memory leak caused by players bombing neighborhoods and creating hundreds of Dead events for scenery that registers their objects. --- Moose Development/Moose/Core/Event.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 23c1733e9..65ee73826 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -184,6 +184,7 @@ EVENT = { ClassName = "EVENT", ClassID = 0, MissionEnd = false, + RegisterSceneryOnEvent = true, } world.event.S_EVENT_NEW_CARGO = world.event.S_EVENT_MAX + 1000 @@ -1374,7 +1375,9 @@ function EVENT:onEvent( Event ) Event.IniDCSUnit = Event.initiator Event.IniDCSUnitName = ( Event.IniDCSUnit and Event.IniDCSUnit.getName ) and Event.IniDCSUnit:getName() or "Scenery no name "..math.random(1,20000) Event.IniUnitName = Event.IniDCSUnitName - Event.IniUnit = SCENERY:Register( Event.IniDCSUnitName, Event.initiator ) + if self.RegisterSceneryOnEvent then + Event.IniUnit = SCENERY:Register( Event.IniDCSUnitName, Event.initiator ) + end Event.IniCategory = (Event.IniDCSUnit and Event.IniDCSUnit.getDesc ) and Event.IniDCSUnit:getDesc().category Event.IniTypeName = (Event.initiator and Event.initiator.isExist and Event.initiator:isExist() and Event.IniDCSUnit and Event.IniDCSUnit.getTypeName) and Event.IniDCSUnit:getTypeName() or "SCENERY" @@ -1478,7 +1481,9 @@ function EVENT:onEvent( Event ) Event.TgtDCSUnitName = Event.TgtDCSUnit.getName and Event.TgtDCSUnit:getName() or nil if Event.TgtDCSUnitName~=nil then Event.TgtUnitName = Event.TgtDCSUnitName - Event.TgtUnit = SCENERY:Register( Event.TgtDCSUnitName, Event.target ) + if self.RegisterSceneryOnEvent then + Event.TgtUnit = SCENERY:Register( Event.TgtDCSUnitName, Event.target ) + end Event.TgtCategory = Event.TgtDCSUnit:getDesc().category Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() end From 80f2a0ef39fd9c6462080e21e8d68c355e9dba7a Mon Sep 17 00:00:00 2001 From: smiki Date: Wed, 28 Jan 2026 12:05:32 +0100 Subject: [PATCH 3/7] [FIX] Memory leak caused by continuous F10 redrawing that for marker (add, remove) which creates new coordinate. --- Moose Development/Moose/Core/Event.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 65ee73826..652360a2f 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -185,6 +185,7 @@ EVENT = { ClassID = 0, MissionEnd = false, RegisterSceneryOnEvent = true, + CreateMarkCoordinates = true, } world.event.S_EVENT_NEW_CARGO = world.event.S_EVENT_MAX + 1000 @@ -1524,6 +1525,9 @@ function EVENT:onEvent( Event ) if Event.idx then Event.MarkID=Event.idx Event.MarkVec3=Event.pos + if self.CreateMarkCoordinates then + Event.MarkCoordinate=COORDINATE:NewFromVec3(Event.pos) + end Event.MarkText=Event.text Event.MarkCoalition=Event.coalition Event.IniCoalition=Event.coalition From 1e200511cb8409e9da13540c162cda3371504427 Mon Sep 17 00:00:00 2001 From: smiki Date: Wed, 28 Jan 2026 12:06:11 +0100 Subject: [PATCH 4/7] [FIX] Memory leak caused by continuous F10 redrawing that for marker (add, remove) which creates new coordinate. --- Moose Development/Moose/Core/Event.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 652360a2f..003a7195e 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -185,7 +185,7 @@ EVENT = { ClassID = 0, MissionEnd = false, RegisterSceneryOnEvent = true, - CreateMarkCoordinates = true, + CreateMarkCoordinateOnEvent = true, } world.event.S_EVENT_NEW_CARGO = world.event.S_EVENT_MAX + 1000 @@ -1525,7 +1525,7 @@ function EVENT:onEvent( Event ) if Event.idx then Event.MarkID=Event.idx Event.MarkVec3=Event.pos - if self.CreateMarkCoordinates then + if self.CreateMarkCoordinateOnEvent then Event.MarkCoordinate=COORDINATE:NewFromVec3(Event.pos) end Event.MarkText=Event.text From c2c957b859cf344aa8e6335f9aa674a259cc7f7e Mon Sep 17 00:00:00 2001 From: smiki Date: Thu, 29 Jan 2026 18:32:04 +0100 Subject: [PATCH 5/7] [FIX] Added Alias to COMMANDER init from CHIEF --- Moose Development/Moose/Ops/Chief.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moose Development/Moose/Ops/Chief.lua b/Moose Development/Moose/Ops/Chief.lua index 9500ae313..fb5d15ed7 100644 --- a/Moose Development/Moose/Ops/Chief.lua +++ b/Moose Development/Moose/Ops/Chief.lua @@ -396,7 +396,7 @@ function CHIEF:New(Coalition, AgentSet, Alias) self.TransportCategories = {Group.Category.HELICOPTER} -- Create a new COMMANDER. - self.commander=COMMANDER:New(Coalition) + self.commander=COMMANDER:New(Coalition, Alias) -- Add FSM transitions. -- From State --> Event --> To State From 6e12c5c1d0836e6a7c70e45ae2bfbd42a96b13c8 Mon Sep 17 00:00:00 2001 From: smiki Date: Thu, 29 Jan 2026 18:34:37 +0100 Subject: [PATCH 6/7] [FIX] Added Alias to COMMANDER init from CHIEF --- Moose Development/Moose/Ops/Chief.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/Moose Development/Moose/Ops/Chief.lua b/Moose Development/Moose/Ops/Chief.lua index fb5d15ed7..a69ad4972 100644 --- a/Moose Development/Moose/Ops/Chief.lua +++ b/Moose Development/Moose/Ops/Chief.lua @@ -398,6 +398,7 @@ function CHIEF:New(Coalition, AgentSet, Alias) -- Create a new COMMANDER. self.commander=COMMANDER:New(Coalition, Alias) + -- Add FSM transitions. -- From State --> Event --> To State self:AddTransition("*", "MissionAssign", "*") -- Assign mission to a COMMANDER. From a699300f5f1413b3870a31fe37e9f77743a3f244 Mon Sep 17 00:00:00 2001 From: smiki Date: Thu, 29 Jan 2026 21:43:27 +0100 Subject: [PATCH 7/7] [ADDED] `COMMANDER:CanMission(Mission)` and `CHIEF:CanMission(Mission)` --- Moose Development/Moose/Ops/Chief.lua | 9 ++++ Moose Development/Moose/Ops/Commander.lua | 64 +++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/Moose Development/Moose/Ops/Chief.lua b/Moose Development/Moose/Ops/Chief.lua index a69ad4972..5f33d4a3d 100644 --- a/Moose Development/Moose/Ops/Chief.lua +++ b/Moose Development/Moose/Ops/Chief.lua @@ -3358,6 +3358,15 @@ function CHIEF._CheckAssetProperties(Asset, Properties) return false end + +--- Checks whether or not any of the legions con run a mission. +-- @param #CHIEF self +-- @param Ops.Auftrag#AUFTRAG Mission The mission. +-- @return #boolean If `true`, one of the cohorts can run the mission. +function CHIEF:CanMission(Mission) + return self.commander and self.commander:CanStartMission(Mission) +end + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/Moose Development/Moose/Ops/Commander.lua b/Moose Development/Moose/Ops/Commander.lua index 89a2f50c0..da7d6c9d8 100644 --- a/Moose Development/Moose/Ops/Commander.lua +++ b/Moose Development/Moose/Ops/Commander.lua @@ -1748,6 +1748,70 @@ function COMMANDER:_GetCohorts(Legions, Cohorts, Operation) return cohorts end +--- Checks whether or not any of the legions con run a mission. +-- @param #COMMANDER self +-- @param Ops.Auftrag#AUFTRAG Mission The mission. +-- @return #boolean If `true`, one of the cohorts can run the mission. +function COMMANDER:CanMission(Mission) + local commander = self + + -- Target position. + local TargetVec2 = Mission:GetTargetVec2() + + local MaxWeight = nil + + if Mission.NcarriersMin then + + local legions = commander.legions + local cohorts = nil + if Mission.transportLegions or Mission.transportCohorts then + legions = Mission.transportLegions + cohorts = Mission.transportCohorts + end + + -- Get transport cohorts. + local Cohorts = LEGION._GetCohorts(legions, cohorts) + + -- Filter cohorts that can actually perform transport missions. + local transportcohorts = {} + for _, _cohort in pairs(Cohorts) do + local cohort = _cohort --Ops.Cohort#COHORT + + -- Check if cohort can perform transport to target. + local can = LEGION._CohortCan(cohort, AUFTRAG.Type.OPSTRANSPORT, Mission.carrierCategories, Mission.carrierAttributes, Mission.carrierProperties, nil, TargetVec2) + + -- MaxWeight of cargo assets is limited by the largets available cargo bay. We don't want to select, e.g., tanks that cannot be transported by APCs or helos. + if can and (MaxWeight == nil or cohort.cargobayLimit > MaxWeight) then + MaxWeight = cohort.cargobayLimit + end + end + + end + + local legions = commander.legions + local cohorts = nil + if Mission.specialLegions or Mission.specialCohorts then + legions = Mission.specialLegions + cohorts = Mission.specialCohorts + end + + -- Get cohorts. + local Cohorts = LEGION._GetCohorts(legions, cohorts, Mission.operation, commander.opsqueue) + + for _, _cohort in pairs(Cohorts) do + local cohort = _cohort --Ops.Cohort#COHORT + + -- Check if cohort can do the mission. + local can = LEGION._CohortCan(cohort, Mission.type, nil, Mission.attributes, Mission.properties, { Mission.engageWeaponType }, TargetVec2, Mission.engageRange, Mission.refuelSystem, nil, MaxWeight) + if can then + return true + end + + end + + return false +end + --- Recruit assets for a given mission. -- @param #COMMANDER self -- @param Ops.Auftrag#AUFTRAG Mission The mission.