diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index b808e6ab1..2d19364f5 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -1162,6 +1162,26 @@ do -- DETECTION_BASE return self end + --- This will allow during friendly search only units of the specified list of categories. + -- @param #DETECTION_BASE self + -- @param #string FriendlyCategories A list of unit categories. + -- @return #DETECTION_BASE + -- @usage + -- -- Only allow Ships and Vehicles to be part of the friendly team. + -- Detection:SetFriendlyCategories( { Unit.Category.SHIP, Unit.Category.GROUND_UNIT } ) + function DETECTION_BASE:FilterFriendlyCategories( FriendlyCategories ) + + self.FriendlyCategories = self.FriendlyCategories or {} + if type( FriendlyCategories ) ~= "table" then + FriendlyCategories = { FriendlyCategories } + end + for ID, FriendlyCategory in pairs( FriendlyCategories ) do + self:F( { FriendlyCategory = FriendlyCategory } ) + self.FriendlyCategories[FriendlyCategory] = FriendlyCategory + end + return self + end + --- Returns if there are friendlies nearby the FAC units ... -- @param #DETECTION_BASE self -- @return #boolean true if there are friendlies nearby @@ -1179,15 +1199,6 @@ do -- DETECTION_BASE return DetectedItem.FriendliesNearBy end - --- Filters friendly units by unit category. - -- @param #DETECTION_BASE self - -- @param FriendliesCategory - -- @return #DETECTION_BASE - function DETECTION_BASE:FilterFriendliesCategory( FriendliesCategory ) - self.FriendliesCategory = FriendliesCategory - return self - end - --- Returns if there are friendlies nearby the intercept ... -- @param #DETECTION_BASE self -- @return #boolean trhe if there are friendlies near the intercept. @@ -1269,6 +1280,7 @@ do -- DETECTION_BASE local EnemyCoalition = DetectedUnit:GetCoalition() local FoundUnitCoalition = FoundDCSUnit:getCoalition() + local FoundUnitCategory = FoundDCSUnit:getDesc().category local FoundUnitName = FoundDCSUnit:getName() local FoundUnitGroupName = FoundDCSUnit:getGroup():getName() local EnemyUnitName = DetectedUnit:GetName() @@ -1290,22 +1302,33 @@ do -- DETECTION_BASE end end end + + local FoundUnitOfOtherCategory = false + + if FoundUnitOfOtherCategory == false then + -- Now we check if the found unit is one of the allowed friendly categories. + for ID, FriendlyCategory in pairs( self.FriendlyCategories or {} ) do + self:F( { "Friendly Category:", FriendlyCategory = FriendlyCategory, FoundUnitCategory = FoundUnitCategory } ) + if FriendlyCategory ~= FoundUnitCategory then + FoundUnitOfOtherCategory = true + break + end + end + end self:F( { "Friendlies near Target:", FoundUnitName, FoundUnitCoalition, EnemyUnitName, EnemyCoalition, FoundUnitInReportSetGroup } ) - if FoundUnitCoalition ~= EnemyCoalition and FoundUnitInReportSetGroup == false then + if FoundUnitCoalition ~= EnemyCoalition and FoundUnitInReportSetGroup == false and FoundUnitOfOtherCategory == false then local FriendlyUnit = UNIT:Find( FoundDCSUnit ) local FriendlyUnitName = FriendlyUnit:GetName() local FriendlyUnitCategory = FriendlyUnit:GetDesc().category - --if ( not self.FriendliesCategory ) or ( self.FriendliesCategory and ( self.FriendliesCategory == FriendlyUnitCategory ) ) then - DetectedItem.FriendliesNearBy = DetectedItem.FriendliesNearBy or {} - DetectedItem.FriendliesNearBy[FriendlyUnitName] = FriendlyUnit - local Distance = DetectedUnitCoord:Get2DDistance( FriendlyUnit:GetCoordinate() ) - DetectedItem.FriendliesDistance = DetectedItem.FriendliesDistance or {} - DetectedItem.FriendliesDistance[Distance] = FriendlyUnit - self:T( { "Friendlies Found:", FriendlyUnitName = FriendlyUnitName, Distance = Distance, FriendlyUnitCategory = FriendlyUnitCategory, FriendliesCategory = self.FriendliesCategory } ) - --end + DetectedItem.FriendliesNearBy = DetectedItem.FriendliesNearBy or {} + DetectedItem.FriendliesNearBy[FriendlyUnitName] = FriendlyUnit + local Distance = DetectedUnitCoord:Get2DDistance( FriendlyUnit:GetCoordinate() ) + DetectedItem.FriendliesDistance = DetectedItem.FriendliesDistance or {} + DetectedItem.FriendliesDistance[Distance] = FriendlyUnit + self:T( { "Friendlies Found:", FriendlyUnitName = FriendlyUnitName, Distance = Distance, FriendlyUnitCategory = FriendlyUnitCategory, FriendliesCategory = self.FriendliesCategory } ) return true end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 613fdf591..c75498e87 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -753,7 +753,7 @@ function TASK:SetPlannedMenuForGroup( TaskGroup, MenuTime ) if not Mission:IsGroupAssigned( TaskGroup ) then --self:F( { "Replacing Join Task menu" } ) local JoinTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Join Task" ), TaskTypeMenu, self.MenuAssignToGroup, self, TaskGroup ):SetTime( MenuTime ):SetTag( "Tasking" ) - local MarkTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Mark Task on Map" ), TaskTypeMenu, self.MenuMarkToGroup, self, TaskGroup ):SetTime( MenuTime ):SetTag( "Tasking" ) + local MarkTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Mark Task Location on Map" ), TaskTypeMenu, self.MenuMarkToGroup, self, TaskGroup ):SetTime( MenuTime ):SetTag( "Tasking" ) end return self @@ -787,7 +787,8 @@ function TASK:SetAssignedMenuForGroup( TaskGroup, MenuTime ) self.MenuAssigned = self.MenuAssigned or {} self.MenuAssigned[TaskGroup] = MENU_GROUP:New( TaskGroup, string.format( "Assigned Task %s", TaskName ), MissionMenu ):SetTime( MenuTime ):SetTag( "Tasking" ) local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task Status" ), self.MenuAssigned[TaskGroup], self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetTag( "Tasking" ) - local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Abort Group from Task" ), self.MenuAssigned[TaskGroup], self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ):SetTag( "Tasking" ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Abort Task" ), self.MenuAssigned[TaskGroup], self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ):SetTag( "Tasking" ) + local MarkMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Mark Task Location on Map" ), self.MenuAssigned[TaskGroup], self.MenuMarkToGroup, self, TaskGroup ):SetTime( MenuTime ):SetTag( "Tasking" ) return self end diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index d6bece1fc..5200c7733 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -58,8 +58,8 @@ do -- TASK_A2G_DISPATCHER self.Detection = Detection self.Mission = Mission - self.Detection:FilterCategories( Unit.Category.GROUND_UNIT, Unit.Category.SHIP ) - self.Detection:FilterFriendliesCategory( Unit.Category.GROUND_UNIT ) + self.Detection:FilterCategories( { Unit.Category.GROUND_UNIT, Unit.Category.SHIP } ) + self.Detection:FilterFriendlyCategories( { Unit.Category.GROUND_UNIT } ) self:AddTransition( "Started", "Assign", "Started" )