mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
Progress Dispatcher
This commit is contained in:
parent
6710bfba26
commit
32d6233cf1
@ -293,6 +293,9 @@ do -- DETECTION_BASE
|
|||||||
-- Inherits from BASE
|
-- Inherits from BASE
|
||||||
local self = BASE:Inherit( self, FSM:New() ) -- #DETECTION_BASE
|
local self = BASE:Inherit( self, FSM:New() ) -- #DETECTION_BASE
|
||||||
|
|
||||||
|
self.DetectedItemCount = 0
|
||||||
|
self.DetectedItems = {}
|
||||||
|
|
||||||
self.DetectionSetGroup = DetectionSetGroup
|
self.DetectionSetGroup = DetectionSetGroup
|
||||||
|
|
||||||
self.DetectionInterval = 30
|
self.DetectionInterval = 30
|
||||||
@ -918,8 +921,9 @@ do -- DETECTION_BASE
|
|||||||
local DetectedItem = {}
|
local DetectedItem = {}
|
||||||
DetectedItem.Set = Set or SET_UNIT:New()
|
DetectedItem.Set = Set or SET_UNIT:New()
|
||||||
DetectedItem.Zone = Zone
|
DetectedItem.Zone = Zone
|
||||||
|
|
||||||
table.insert( self.DetectedItems, DetectedItem )
|
self.DetectedItemCount = self.DetectedItemCount + 1
|
||||||
|
self.DetectedItems[self.DetectedItemCount] = DetectedItem
|
||||||
|
|
||||||
return DetectedItem
|
return DetectedItem
|
||||||
end
|
end
|
||||||
@ -930,7 +934,8 @@ do -- DETECTION_BASE
|
|||||||
-- @param #number DetectedItemIndex The index or position in the DetectedItems list where the item needs to be removed.
|
-- @param #number DetectedItemIndex The index or position in the DetectedItems list where the item needs to be removed.
|
||||||
function DETECTION_BASE:RemoveDetectedItem( DetectedItemIndex )
|
function DETECTION_BASE:RemoveDetectedItem( DetectedItemIndex )
|
||||||
|
|
||||||
table.remove( self.DetectedItems, DetectedItemIndex )
|
self.DetectedItemCount = self.DetectedItemCount + 1
|
||||||
|
self.DetectedItems[self.DetectedItemIndex] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -947,7 +952,7 @@ do -- DETECTION_BASE
|
|||||||
-- @return #number Count
|
-- @return #number Count
|
||||||
function DETECTION_BASE:GetDetectedItemsCount()
|
function DETECTION_BASE:GetDetectedItemsCount()
|
||||||
|
|
||||||
local DetectedCount = #self.DetectedItems
|
local DetectedCount = self.DetectedItemCount
|
||||||
return DetectedCount
|
return DetectedCount
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1392,6 +1397,7 @@ do -- DETECTION_AREAS
|
|||||||
end
|
end
|
||||||
|
|
||||||
--- Add a detected @{#DETECTION_AREAS.DetectedItem}.
|
--- Add a detected @{#DETECTION_AREAS.DetectedItem}.
|
||||||
|
-- @param #DETECTION_AREAS self
|
||||||
-- @param Core.Set#SET_UNIT Set -- The Set of Units in the detected area.
|
-- @param Core.Set#SET_UNIT Set -- The Set of Units in the detected area.
|
||||||
-- @param Core.Zone#ZONE_UNIT Zone -- The Zone of the detected area.
|
-- @param Core.Zone#ZONE_UNIT Zone -- The Zone of the detected area.
|
||||||
-- @return #DETECTION_AREAS.DetectedItem DetectedItem
|
-- @return #DETECTION_AREAS.DetectedItem DetectedItem
|
||||||
@ -1401,7 +1407,7 @@ do -- DETECTION_AREAS
|
|||||||
local DetectedItem = self:GetParent( self ).AddDetectedItem( self, Set, Zone )
|
local DetectedItem = self:GetParent( self ).AddDetectedItem( self, Set, Zone )
|
||||||
|
|
||||||
DetectedItem.Removed = false
|
DetectedItem.Removed = false
|
||||||
DetectedItem.AreaID = #self.DetectedItems+1
|
DetectedItem.AreaID = #self.DetectedItems + 1
|
||||||
|
|
||||||
self:T( { #self.DetectedItems, DetectedItem } )
|
self:T( { #self.DetectedItems, DetectedItem } )
|
||||||
|
|
||||||
|
|||||||
@ -68,22 +68,23 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName )
|
|||||||
|
|
||||||
self:HandleEvent( EVENTS.Birth,
|
self:HandleEvent( EVENTS.Birth,
|
||||||
--- @param #COMMANDCENTER self
|
--- @param #COMMANDCENTER self
|
||||||
--- @param Core.Event#EVENTDATA EventData
|
-- @param Core.Event#EVENTDATA EventData
|
||||||
function( self, EventData )
|
function( self, EventData )
|
||||||
self:E( { EventData } )
|
if EventData.IniObjectCategory == 1 then
|
||||||
local EventGroup = GROUP:Find( EventData.IniDCSGroup )
|
local EventGroup = GROUP:Find( EventData.IniDCSGroup )
|
||||||
if EventGroup and self:HasGroup( EventGroup ) then
|
if EventGroup and self:HasGroup( EventGroup ) then
|
||||||
local MenuReporting = MENU_GROUP:New( EventGroup, "Reporting", self.CommandCenterMenu )
|
local MenuReporting = MENU_GROUP:New( EventGroup, "Reporting", self.CommandCenterMenu )
|
||||||
local MenuMissionsSummary = MENU_GROUP_COMMAND:New( EventGroup, "Missions Summary Report", MenuReporting, self.ReportSummary, self, EventGroup )
|
local MenuMissionsSummary = MENU_GROUP_COMMAND:New( EventGroup, "Missions Summary Report", MenuReporting, self.ReportSummary, self, EventGroup )
|
||||||
local MenuMissionsDetails = MENU_GROUP_COMMAND:New( EventGroup, "Missions Details Report", MenuReporting, self.ReportDetails, self, EventGroup )
|
local MenuMissionsDetails = MENU_GROUP_COMMAND:New( EventGroup, "Missions Details Report", MenuReporting, self.ReportDetails, self, EventGroup )
|
||||||
self:ReportSummary( EventGroup )
|
self:ReportSummary( EventGroup )
|
||||||
end
|
end
|
||||||
local PlayerUnit = EventData.IniUnit
|
local PlayerUnit = EventData.IniUnit
|
||||||
for MissionID, Mission in pairs( self:GetMissions() ) do
|
for MissionID, Mission in pairs( self:GetMissions() ) do
|
||||||
local Mission = Mission -- Tasking.Mission#MISSION
|
local Mission = Mission -- Tasking.Mission#MISSION
|
||||||
local PlayerGroup = EventData.IniGroup -- The GROUP object should be filled!
|
local PlayerGroup = EventData.IniGroup -- The GROUP object should be filled!
|
||||||
Mission:JoinUnit( PlayerUnit, PlayerGroup )
|
Mission:JoinUnit( PlayerUnit, PlayerGroup )
|
||||||
Mission:ReportDetails()
|
Mission:ReportDetails()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@ -88,6 +88,8 @@ do -- DETECTION MANAGER
|
|||||||
self:SetReportInterval( 30 )
|
self:SetReportInterval( 30 )
|
||||||
self:SetReportDisplayTime( 25 )
|
self:SetReportDisplayTime( 25 )
|
||||||
|
|
||||||
|
Detection:__Start( 5 )
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -288,14 +290,14 @@ do -- DETECTION_DISPATCHER
|
|||||||
|
|
||||||
--- Creates a SEAD task when there are targets for it.
|
--- Creates a SEAD task when there are targets for it.
|
||||||
-- @param #DETECTION_DISPATCHER self
|
-- @param #DETECTION_DISPATCHER self
|
||||||
-- @param Functional.Detection#DETECTION_AREAS.DetectedArea DetectedArea
|
-- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem
|
||||||
-- @return Set#SET_UNIT TargetSetUnit: The target set of units.
|
-- @return Set#SET_UNIT TargetSetUnit: The target set of units.
|
||||||
-- @return #nil If there are no targets to be set.
|
-- @return #nil If there are no targets to be set.
|
||||||
function DETECTION_DISPATCHER:EvaluateSEAD( DetectedArea )
|
function DETECTION_DISPATCHER:EvaluateSEAD( DetectedItem )
|
||||||
self:F( { DetectedArea.AreaID } )
|
self:F( { DetectedItem.AreaID } )
|
||||||
|
|
||||||
local DetectedSet = DetectedArea.Set
|
local DetectedSet = DetectedItem.Set
|
||||||
local DetectedZone = DetectedArea.Zone
|
local DetectedZone = DetectedItem.Zone
|
||||||
|
|
||||||
-- Determine if the set has radar targets. If it does, construct a SEAD task.
|
-- Determine if the set has radar targets. If it does, construct a SEAD task.
|
||||||
local RadarCount = DetectedSet:HasSEAD()
|
local RadarCount = DetectedSet:HasSEAD()
|
||||||
@ -375,12 +377,12 @@ do -- DETECTION_DISPATCHER
|
|||||||
-- @param #DETECTION_DISPATCHER self
|
-- @param #DETECTION_DISPATCHER self
|
||||||
-- @param Tasking.Mission#MISSION Mission
|
-- @param Tasking.Mission#MISSION Mission
|
||||||
-- @param Tasking.Task#TASK Task
|
-- @param Tasking.Task#TASK Task
|
||||||
-- @param Functional.Detection#DETECTION_AREAS.DetectedArea DetectedArea
|
-- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem
|
||||||
-- @return Tasking.Task#TASK
|
-- @return Tasking.Task#TASK
|
||||||
function DETECTION_DISPATCHER:EvaluateRemoveTask( Mission, Task, DetectedArea )
|
function DETECTION_DISPATCHER:EvaluateRemoveTask( Mission, Task, DetectedItem )
|
||||||
|
|
||||||
if Task then
|
if Task then
|
||||||
if Task:IsStatePlanned() and DetectedArea.Changed == true then
|
if Task:IsStatePlanned() and DetectedItem.Changed == true then
|
||||||
self:E( "Removing Tasking: " .. Task:GetTaskName() )
|
self:E( "Removing Tasking: " .. Task:GetTaskName() )
|
||||||
Task = Mission:RemoveTask( Task )
|
Task = Mission:RemoveTask( Task )
|
||||||
end
|
end
|
||||||
@ -420,7 +422,10 @@ do -- DETECTION_DISPATCHER
|
|||||||
if not SEADTask then
|
if not SEADTask then
|
||||||
local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
|
local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
|
||||||
if TargetSetUnit then
|
if TargetSetUnit then
|
||||||
SEADTask = Mission:AddTask( TASK_SEAD:New( Mission, self.SetGroup, "SEAD." .. AreaID, TargetSetUnit , DetectedZone ) )
|
local Task = TASK_SEAD:New( Mission, self.SetGroup, "SEAD." .. AreaID, TargetSetUnit )
|
||||||
|
Task:SetTargetZone( DetectedZone )
|
||||||
|
SEADTask = Mission:AddTask( Task )
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if SEADTask and SEADTask:IsStatePlanned() then
|
if SEADTask and SEADTask:IsStatePlanned() then
|
||||||
@ -429,55 +434,55 @@ do -- DETECTION_DISPATCHER
|
|||||||
TaskMsg[#TaskMsg+1] = " - " .. SEADTask:GetStateString() .. " SEAD " .. AreaID .. " - " .. SEADTask.TargetSetUnit:GetUnitTypesText()
|
TaskMsg[#TaskMsg+1] = " - " .. SEADTask:GetStateString() .. " SEAD " .. AreaID .. " - " .. SEADTask.TargetSetUnit:GetUnitTypesText()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Evaluate CAS Tasking
|
-- -- Evaluate CAS Tasking
|
||||||
local CASTask = Mission:GetTask( "CAS." .. AreaID )
|
-- local CASTask = Mission:GetTask( "CAS." .. AreaID )
|
||||||
CASTask = self:EvaluateRemoveTask( Mission, CASTask, DetectedItem )
|
-- CASTask = self:EvaluateRemoveTask( Mission, CASTask, DetectedItem )
|
||||||
if not CASTask then
|
-- if not CASTask then
|
||||||
local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
|
-- local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
|
||||||
if TargetSetUnit then
|
-- if TargetSetUnit then
|
||||||
CASTask = Mission:AddTask( TASK_A2G:New( Mission, self.SetGroup, "CAS." .. AreaID, "CAS", TargetSetUnit , DetectedZone, DetectedItem.NearestFAC ) )
|
-- CASTask = Mission:AddTask( TASK_A2G:New( Mission, self.SetGroup, "CAS." .. AreaID, "CAS", TargetSetUnit , DetectedZone, DetectedItem.NearestFAC ) )
|
||||||
end
|
-- end
|
||||||
end
|
-- end
|
||||||
if CASTask and CASTask:IsStatePlanned() then
|
-- if CASTask and CASTask:IsStatePlanned() then
|
||||||
--CASTask:SetPlannedMenu()
|
-- --CASTask:SetPlannedMenu()
|
||||||
TaskMsg[#TaskMsg+1] = " - " .. CASTask:GetStateString() .. " CAS " .. AreaID .. " - " .. CASTask.TargetSetUnit:GetUnitTypesText()
|
-- TaskMsg[#TaskMsg+1] = " - " .. CASTask:GetStateString() .. " CAS " .. AreaID .. " - " .. CASTask.TargetSetUnit:GetUnitTypesText()
|
||||||
end
|
-- end
|
||||||
|
--
|
||||||
|
-- -- Evaluate BAI Tasking
|
||||||
|
-- local BAITask = Mission:GetTask( "BAI." .. AreaID )
|
||||||
|
-- BAITask = self:EvaluateRemoveTask( Mission, BAITask, DetectedItem )
|
||||||
|
-- if not BAITask then
|
||||||
|
-- local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.CommandCenter:GetCoalition() ) -- Returns a SetUnit if there are targets to be SEADed...
|
||||||
|
-- if TargetSetUnit then
|
||||||
|
-- BAITask = Mission:AddTask( TASK_A2G:New( Mission, self.SetGroup, "BAI." .. AreaID, "BAI", TargetSetUnit , DetectedZone, DetectedItem.NearestFAC ) )
|
||||||
|
-- end
|
||||||
|
-- end
|
||||||
|
-- if BAITask and BAITask:IsStatePlanned() then
|
||||||
|
-- --BAITask:SetPlannedMenu()
|
||||||
|
-- TaskMsg[#TaskMsg+1] = " - " .. BAITask:GetStateString() .. " BAI " .. AreaID .. " - " .. BAITask.TargetSetUnit:GetUnitTypesText()
|
||||||
|
-- end
|
||||||
|
|
||||||
-- Evaluate BAI Tasking
|
-- if #TaskMsg > 0 then
|
||||||
local BAITask = Mission:GetTask( "BAI." .. AreaID )
|
--
|
||||||
BAITask = self:EvaluateRemoveTask( Mission, BAITask, DetectedItem )
|
-- local ThreatLevel = Detection:GetTreatLevelA2G( DetectedItem )
|
||||||
if not BAITask then
|
--
|
||||||
local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.CommandCenter:GetCoalition() ) -- Returns a SetUnit if there are targets to be SEADed...
|
-- local DetectedAreaVec3 = DetectedZone:GetVec3()
|
||||||
if TargetSetUnit then
|
-- local DetectedAreaPointVec3 = POINT_VEC3:New( DetectedAreaVec3.x, DetectedAreaVec3.y, DetectedAreaVec3.z )
|
||||||
BAITask = Mission:AddTask( TASK_A2G:New( Mission, self.SetGroup, "BAI." .. AreaID, "BAI", TargetSetUnit , DetectedZone, DetectedItem.NearestFAC ) )
|
-- local DetectedAreaPointLL = DetectedAreaPointVec3:ToStringLL( 3, true )
|
||||||
end
|
-- AreaMsg[#AreaMsg+1] = string.format( " - Area #%d - %s - Threat Level [%s] (%2d)",
|
||||||
end
|
-- DetectedItemID,
|
||||||
if BAITask and BAITask:IsStatePlanned() then
|
-- DetectedAreaPointLL,
|
||||||
--BAITask:SetPlannedMenu()
|
-- string.rep( "■", ThreatLevel ),
|
||||||
TaskMsg[#TaskMsg+1] = " - " .. BAITask:GetStateString() .. " BAI " .. AreaID .. " - " .. BAITask.TargetSetUnit:GetUnitTypesText()
|
-- ThreatLevel
|
||||||
end
|
-- )
|
||||||
|
--
|
||||||
if #TaskMsg > 0 then
|
-- -- Loop through the changes ...
|
||||||
|
-- local ChangeText = Detection:GetChangeText( DetectedItem )
|
||||||
local ThreatLevel = Detection:GetTreatLevelA2G( DetectedItem )
|
--
|
||||||
|
-- if ChangeText ~= "" then
|
||||||
local DetectedAreaVec3 = DetectedZone:GetVec3()
|
-- ChangeMsg[#ChangeMsg+1] = string.gsub( string.gsub( ChangeText, "\n", "%1 - " ), "^.", " - %1" )
|
||||||
local DetectedAreaPointVec3 = POINT_VEC3:New( DetectedAreaVec3.x, DetectedAreaVec3.y, DetectedAreaVec3.z )
|
-- end
|
||||||
local DetectedAreaPointLL = DetectedAreaPointVec3:ToStringLL( 3, true )
|
-- end
|
||||||
AreaMsg[#AreaMsg+1] = string.format( " - Area #%d - %s - Threat Level [%s] (%2d)",
|
|
||||||
DetectedItemID,
|
|
||||||
DetectedAreaPointLL,
|
|
||||||
string.rep( "■", ThreatLevel ),
|
|
||||||
ThreatLevel
|
|
||||||
)
|
|
||||||
|
|
||||||
-- Loop through the changes ...
|
|
||||||
local ChangeText = Detection:GetChangeText( DetectedItem )
|
|
||||||
|
|
||||||
if ChangeText ~= "" then
|
|
||||||
ChangeMsg[#ChangeMsg+1] = string.gsub( string.gsub( ChangeText, "\n", "%1 - " ), "^.", " - %1" )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- OK, so the tasking has been done, now delete the changes reported for the area.
|
-- OK, so the tasking has been done, now delete the changes reported for the area.
|
||||||
Detection:AcceptChanges( DetectedItem )
|
Detection:AcceptChanges( DetectedItem )
|
||||||
@ -487,15 +492,13 @@ do -- DETECTION_DISPATCHER
|
|||||||
-- TODO set menus using the HQ coordinator
|
-- TODO set menus using the HQ coordinator
|
||||||
Mission:GetCommandCenter():SetMenu()
|
Mission:GetCommandCenter():SetMenu()
|
||||||
|
|
||||||
if #AreaMsg > 0 then
|
if #TaskMsg > 0 then
|
||||||
for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do
|
for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do
|
||||||
if not TaskGroup:GetState( TaskGroup, "Assigned" ) then
|
if not TaskGroup:GetState( TaskGroup, "Assigned" ) then
|
||||||
self.CommandCenter:MessageToGroup(
|
self.CommandCenter:MessageToGroup(
|
||||||
string.format( "HQ Reporting - Target areas for mission '%s':\nAreas:\n%s\n\nTasks:\n%s\n\nChanges:\n%s ",
|
string.format( "HQ Reporting - Target areas for mission '%s':\nTasks:\n%s ",
|
||||||
self.Mission:GetName(),
|
self.Mission:GetName(),
|
||||||
table.concat( AreaMsg, "\n" ),
|
table.concat( TaskMsg, "\n" )
|
||||||
table.concat( TaskMsg, "\n" ),
|
|
||||||
table.concat( ChangeMsg, "\n" )
|
|
||||||
), self:GetReportDisplayTime(), TaskGroup
|
), self:GetReportDisplayTime(), TaskGroup
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -56,7 +56,7 @@ function STATIC:FindByName( StaticName, RaiseError )
|
|||||||
self.StaticName = StaticName
|
self.StaticName = StaticName
|
||||||
|
|
||||||
if StaticFound then
|
if StaticFound then
|
||||||
StaticFound:F( { StaticName } )
|
StaticFound:F3( { StaticName } )
|
||||||
|
|
||||||
return StaticFound
|
return StaticFound
|
||||||
end
|
end
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -23,10 +23,12 @@ local HQ = GROUP:FindByName( "HQ" )
|
|||||||
|
|
||||||
local CC = COMMANDCENTER:New( HQ, "HQ" )
|
local CC = COMMANDCENTER:New( HQ, "HQ" )
|
||||||
|
|
||||||
local RecceDetection1 = DETECTION_UNITS:New( RecceSetGroup1 )
|
local RecceDetection1 = DETECTION_AREAS:New( RecceSetGroup1, 1000 )
|
||||||
|
RecceDetection1:BoundDetectedZones()
|
||||||
|
|
||||||
local RecceDetection2 = DETECTION_UNITS:New( RecceSetGroup2 )
|
local RecceDetection2 = DETECTION_AREAS:New( RecceSetGroup2, 1000 )
|
||||||
RecceDetection2:SetDistanceProbability( 0.2 ) -- Set a 20% probability that a vehicle can be detected at 4km distance.
|
RecceDetection2:SetDistanceProbability( 0.2 ) -- Set a 20% probability that a vehicle can be detected at 4km distance.
|
||||||
|
RecceDetection1:BoundDetectedZones()
|
||||||
|
|
||||||
RecceDetection1:Start()
|
RecceDetection1:Start()
|
||||||
RecceDetection2:Start()
|
RecceDetection2:Start()
|
||||||
|
|||||||
Binary file not shown.
@ -5,11 +5,14 @@ local CommandCenter = COMMANDCENTER:New( HQ, "Lima" )
|
|||||||
|
|
||||||
local Scoring = SCORING:New( "Detect Demo" )
|
local Scoring = SCORING:New( "Detect Demo" )
|
||||||
|
|
||||||
local Mission = MISSION:New( CommandCenter, "Overlord", "High", "Attack Detect Mission Briefing", coalition.side.RED ):AddScoring( Scoring )
|
local Mission = MISSION
|
||||||
|
:New( CommandCenter, "Overlord", "High", "Attack Detect Mission Briefing", coalition.side.RED )
|
||||||
|
:AddScoring( Scoring )
|
||||||
|
|
||||||
local FACSet = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterCoalitions("red"):FilterStart()
|
local FACSet = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterCoalitions("red"):FilterStart()
|
||||||
local FACDetection = DETECTION_AREAS:New( FACSet, 10000, 3000 )
|
local FACDetection = DETECTION_AREAS:New( FACSet, 500, 3000 )
|
||||||
|
FACDetection:BoundDetectedZones()
|
||||||
|
|
||||||
local AttackGroups = SET_GROUP:New():FilterCoalitions( "red" ):FilterPrefixes( "Attack" ):FilterStart()
|
local AttackGroups = SET_GROUP:New():FilterCoalitions( "red" ):FilterPrefixes( "Attack" ):FilterStart()
|
||||||
local TaskAssign = DETECTION_DISPATCHER:New( Mission, HQ, AttackGroups, FACDetection )
|
local TaskDispatcher = DETECTION_DISPATCHER:New( Mission, HQ, AttackGroups, FACDetection )
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user