diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index 418767218..82819ae37 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -273,10 +273,16 @@ do -- DETECTION_BASE --- @type DETECTION_BASE.DetectedObject -- @field #string Name - -- @field #boolean Visible + -- @field #boolean IsVisible + -- @field #boolean KnowType + -- @field #boolean KnowDistance -- @field #string Type -- @field #number Distance -- @field #boolean Identified + -- @field #number LastTime + -- @field #boolean LastPos + -- @field #number LastVelocity + --- @type DETECTION_BASE.DetectedItems -- @list <#DETECTION_BASE.DetectedItem> @@ -309,12 +315,12 @@ do -- DETECTION_BASE self.DetectionInterval = 30 - self:InitDetectVisual( false ) - self:InitDetectOptical( false ) - self:InitDetectRadar( false ) - self:InitDetectRWR( false ) - self:InitDetectIRST( false ) - self:InitDetectDLINK( false ) + self:InitDetectVisual( nil ) + self:InitDetectOptical( nil ) + self:InitDetectRadar( nil ) + self:InitDetectRWR( nil ) + self:InitDetectIRST( nil ) + self:InitDetectDLINK( nil ) self:FilterCategories( { Unit.Category.AIRPLANE, @@ -531,6 +537,7 @@ do -- DETECTION_BASE self:T( { "DetectionGroup is Alive", DetectionGroup:GetName() } ) local DetectionGroupName = DetectionGroup:GetName() + local DetectionUnit = DetectionGroup:GetUnit(1) local DetectedUnits = {} @@ -550,6 +557,18 @@ do -- DETECTION_BASE if DetectedObject and DetectedObject:isExist() and DetectedObject.id_ < 50000000 then -- and ( DetectedObject:getCategory() == Object.Category.UNIT or DetectedObject:getCategory() == Object.Category.STATIC ) then + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity = DetectionUnit:IsTargetDetected( + DetectedObject, + self.DetectVisual, + self.DetectOptical, + self.DetectRadar, + self.DetectIRST, + self.DetectRWR, + self.DetectDLINK + ) + + self:T( { TargetIsDetected = TargetIsDetected, TargetIsVisible = TargetIsVisible, TargetLastTime = TargetLastTime, TargetKnowType = TargetKnowType, TargetKnowDistance = TargetKnowDistance, TargetLastPos = TargetLastPos, TargetLastVelocity = TargetLastVelocity } ) + local DetectionAccepted = true local DetectedObjectName = DetectedObject:getName() @@ -648,12 +667,14 @@ do -- DETECTION_BASE HasDetectedObjects = true - if not self.DetectedObjects[DetectedObjectName] then - self.DetectedObjects[DetectedObjectName] = {} - end + self.DetectedObjects[DetectedObjectName] = self.DetectedObjects[DetectedObjectName] or {} self.DetectedObjects[DetectedObjectName].Name = DetectedObjectName - self.DetectedObjects[DetectedObjectName].Visible = Detection.visible - self.DetectedObjects[DetectedObjectName].Type = Detection.type + self.DetectedObjects[DetectedObjectName].IsVisible = TargetIsVisible + self.DetectedObjects[DetectedObjectName].LastTime = TargetLastTime + self.DetectedObjects[DetectedObjectName].LastPos = TargetLastPos + self.DetectedObjects[DetectedObjectName].LastVelocity = TargetLastVelocity + self.DetectedObjects[DetectedObjectName].KnowType = TargetKnowType + self.DetectedObjects[DetectedObjectName].KnowDistance = Detection.distance -- TargetKnowDistance self.DetectedObjects[DetectedObjectName].Distance = Distance local DetectedUnit = UNIT:FindByName( DetectedObjectName ) @@ -1435,7 +1456,6 @@ do -- DETECTION_UNITS for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT - local DetectedTypeName = DetectedItem.Type for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT @@ -1450,6 +1470,17 @@ do -- DETECTION_UNITS -- Yes, the DetectedUnit is still detected or exists. Flag as identified. self:IdentifyDetectedObject( DetectedObject ) + + -- Update the detection with the new data provided. + DetectedItem.TypeName = DetectedUnit:GetTypeName() + DetectedItem.Name = DetectedObject.Name + DetectedItem.IsVisible = DetectedObject.IsVisible + DetectedItem.LastTime = DetectedObject.LastTime + DetectedItem.LastPos = DetectedObject.LastPos + DetectedItem.LastVelocity = DetectedObject.LastVelocity + DetectedItem.KnowType = DetectedObject.KnowType + DetectedItem.KnowDistance = DetectedObject.KnowDistance + DetectedItem.Distance = DetectedObject.Distance else -- There was no DetectedObject, remove DetectedUnit from the Set. self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName ) @@ -1474,10 +1505,15 @@ do -- DETECTION_UNITS if not DetectedItem then self:T( "Added new DetectedItem" ) DetectedItem = self:AddDetectedItem( "UNIT", DetectedUnitName ) - DetectedItem.Type = DetectedUnit:GetTypeName() - DetectedItem.Name = DetectedObjectData.Name - DetectedItem.Visible = DetectedObjectData.Visible - DetectedItem.Distance = DetectedObjectData.Distance + DetectedItem.TypeName = DetectedUnit:GetTypeName() + DetectedItem.Name = DetectedObject.Name + DetectedItem.IsVisible = DetectedObject.IsVisible + DetectedItem.LastTime = DetectedObject.LastTime + DetectedItem.LastPos = DetectedObject.LastPos + DetectedItem.LastVelocity = DetectedObject.LastVelocity + DetectedItem.KnowType = DetectedObject.KnowType + DetectedItem.KnowDistance = DetectedObject.KnowDistance + DetectedItem.Distance = DetectedObject.Distance end DetectedItem.Set:AddUnit( DetectedUnit ) @@ -1557,19 +1593,27 @@ do -- DETECTION_UNITS if DetectedItemUnit and DetectedItemUnit:IsAlive() then self:T(DetectedItemUnit) - local UnitCategoryName = DetectedItemUnit:GetCategoryName() or "" - local UnitCategoryType = DetectedItemUnit:GetTypeName() or "" - if DetectedItem.Type and UnitCategoryName and UnitCategoryType then - UnitCategoryText = UnitCategoryName .. " (" .. UnitCategoryType .. ") at " + if DetectedItem.KnowType then + local UnitCategoryName = DetectedItemUnit:GetCategoryName() + if UnitCategoryName then + UnitCategoryText = UnitCategoryName + end + if DetectedItem.TypeName then + UnitCategoryText = UnitCategoryText .. " (" .. DetectedItem.TypeName .. ")" + end else - UnitCategoryText = "Unknown target at " + UnitCategoryText = "Unknown" end - if DetectedItem.Visible == false then - UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, estimated" + if DetectedItem.KnowDistance then + if DetectedItem.IsVisible then + UnitDistanceText = " at " .. string.format( "%.2f", DetectedItem.Distance ) .. " km" + end else - UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, visual" + if DetectedItem.IsVisible then + UnitDistanceText = " at +/- " .. string.format( "%.0f", DetectedItem.Distance ) .. " km" + end end local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate() @@ -1699,7 +1743,7 @@ do -- DETECTION_TYPES for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT - local DetectedTypeName = DetectedItem.Type + local DetectedTypeName = DetectedItem.TypeName for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT @@ -1736,7 +1780,7 @@ do -- DETECTION_TYPES local DetectedItem = self:GetDetectedItem( DetectedTypeName ) if not DetectedItem then DetectedItem = self:AddDetectedItem( "TYPE", DetectedTypeName ) - DetectedItem.Type = DetectedUnit:GetTypeName() + DetectedItem.TypeName = DetectedUnit:GetTypeName() end DetectedItem.Set:AddUnit( DetectedUnit ) @@ -1808,7 +1852,7 @@ do -- DETECTION_TYPES local ThreatLevelA2G = DetectedSet:CalculateThreatLevelA2G() local DetectedItemsCount = DetectedSet:Count() - local DetectedItemType = DetectedItem.Type + local DetectedItemType = DetectedItem.TypeName local DetectedItemUnit = DetectedSet:GetFirst() @@ -1967,7 +2011,7 @@ do -- DETECTION_AREAS local ThreatLevelA2G = self:GetTreatLevelA2G( DetectedItem ) local DetectedItemsCount = DetectedSet:Count() local DetectedItemsTypes = DetectedSet:GetTypeNames() - + local ReportSummary = string.format( "%s - %s - Threat:[%s](%2d)\n %2d of %s", DetectedItemID, @@ -1983,6 +2027,25 @@ do -- DETECTION_AREAS return nil end + + --- Report detailed of a detection result. + -- @param #DETECTION_AREAS self + -- @return #string + function DETECTION_AREAS:DetectedReportDetailed() --R2.1 Fixed missing report + self:F() + + local Report = REPORT:New( "Detected areas:" ) + for DetectedItemIndex, DetectedItem in pairs( self.DetectedItems ) do + local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem + local ReportSummary = self:DetectedItemReportSummary( DetectedItemIndex ) + Report:Add( ReportSummary ) + end + + local ReportText = Report:Text() + + return ReportText + end + --- Returns if there are friendlies nearby the FAC units ... diff --git a/Moose Development/Moose/Wrapper/Controllable.lua b/Moose Development/Moose/Wrapper/Controllable.lua index 21a67981b..ec62872f1 100644 --- a/Moose Development/Moose/Wrapper/Controllable.lua +++ b/Moose Development/Moose/Wrapper/Controllable.lua @@ -1782,7 +1782,7 @@ function CONTROLLABLE:GetDetectedTargets( DetectVisual, DetectOptical, DetectRad return nil end -function CONTROLLABLE:IsTargetDetected( DCSObject ) +function CONTROLLABLE:IsTargetDetected( DCSObject, DetectVisual, DetectOptical, DetectRadar, DetectIRST, DetectRWR, DetectDLINK ) self:F2( self.ControllableName ) local DCSControllable = self:GetDCSObject()