From a9ac1850343588e62d1fefad40b1254c625abb44 Mon Sep 17 00:00:00 2001 From: FlightControl_Master Date: Sat, 12 Aug 2017 08:27:58 +0200 Subject: [PATCH] Fixes * Added a maximum markings per designated target group. So not all FACs are occupied. * Optimized the designation report. Move the horizontal line. * Ensured in DESIGNATE that when targets are ordered to be smoke or designated, that this also will happen. Was issue with the scheduler, which got garbage collected before actually being executed, resulting in an obsolete schedule. * Fixed the tasking, coordinates are now updated when enquiring a task report. --- Moose Development/Moose/Core/Scheduler.lua | 3 +- .../Moose/Functional/Designate.lua | 139 ++++++++++++------ Moose Development/Moose/Tasking/Task.lua | 3 + .../Moose/Wrapper/Positionable.lua | 11 +- 4 files changed, 108 insertions(+), 48 deletions(-) diff --git a/Moose Development/Moose/Core/Scheduler.lua b/Moose Development/Moose/Core/Scheduler.lua index a5609afad..4b712d215 100644 --- a/Moose Development/Moose/Core/Scheduler.lua +++ b/Moose Development/Moose/Core/Scheduler.lua @@ -210,7 +210,8 @@ SCHEDULER = { -- @return #SCHEDULER self. -- @return #number The ScheduleID of the planned schedule. function SCHEDULER:New( SchedulerObject, SchedulerFunction, SchedulerArguments, Start, Repeat, RandomizeFactor, Stop ) - local self = BASE:Inherit( self, BASE:New() ) + + local self = BASE:Inherit( self, BASE:New() ) -- #SCHEDULER self:F2( { Start, Repeat, RandomizeFactor, Stop } ) local ScheduleID = nil diff --git a/Moose Development/Moose/Functional/Designate.lua b/Moose Development/Moose/Functional/Designate.lua index 3e8201814..8e18a2ee0 100644 --- a/Moose Development/Moose/Functional/Designate.lua +++ b/Moose Development/Moose/Functional/Designate.lua @@ -390,6 +390,7 @@ do -- DESIGNATE self:SetThreatLevelPrioritization( false ) -- self.ThreatLevelPrioritization, default is threat level priorization off self:SetMaximumDesignations( 5 ) -- Sets the maximum designations. The default is 5 designations. self:SetMaximumDistanceDesignations( 12000 ) -- Sets the maximum distance on which designations can be accepted. The default is 8000 meters. + self:SetMaximumMarkings( 2 ) -- Per target group, a maximum of 2 markings will be made by default. self.LaserCodesUsed = {} @@ -397,6 +398,8 @@ do -- DESIGNATE self:__Detect( -15 ) + self.MarkScheduler = SCHEDULER:New( self ) + return self end @@ -460,6 +463,16 @@ do -- DESIGNATE end + --- Set the maximum amount of markings FACs will do, per designated target group. + -- @param #DESIGNATE self + -- @param #number MaximumMarkings Maximum markings FACs will do, per designated target group. + -- @return #DESIGNATE + function DESIGNATE:SetMaximumMarkings( MaximumMarkings ) + self.MaximumMarkings = MaximumMarkings + return self + end + + --- Set an array of possible laser codes. -- Each new lase will select a code from this table. -- @param #DESIGNATE self @@ -693,8 +706,8 @@ do -- DESIGNATE local DetectedItem = DetectedItems[DesignateIndex] if DetectedItem then local Report = self.Detection:DetectedItemReportSummary( DesignateIndex, AttackGroup ):Text( ", " ) - DetectedReport:Add( " - " .. Report ) DetectedReport:Add( string.rep( "-", 140 ) ) + DetectedReport:Add( " - " .. Report ) end end @@ -909,6 +922,8 @@ do -- DESIGNATE function DESIGNATE:onafterLasing( From, Event, To, Index, Duration ) local TargetSetUnit = self.Detection:GetDetectedSet( Index ) + + local MarkedCount = 0 TargetSetUnit:Flush() @@ -927,52 +942,76 @@ do -- DESIGNATE TargetSetUnit:ForEachUnitPerThreatLevel( 10, 0, --- @param Wrapper.Unit#UNIT SmokeUnit function( TargetUnit ) + self:F( { TargetUnit = TargetUnit:GetName() } ) - if TargetUnit:IsAlive() then - local Recce = self.Recces[TargetUnit] - if not Recce then - self.RecceSet:Flush() - for RecceGroupID, RecceGroup in pairs( self.RecceSet:GetSet() ) do - for UnitID, UnitData in pairs( RecceGroup:GetUnits() or {} ) do - local RecceUnit = UnitData -- Wrapper.Unit#UNIT - local RecceUnitDesc = RecceUnit:GetDesc() - --self:F( { RecceUnit = RecceUnit:GetName(), RecceDescription = RecceUnitDesc } ) - if RecceUnit:IsLasing() == false then - --self:F( { IsDetected = RecceUnit:IsDetected( TargetUnit ), IsLOS = RecceUnit:IsLOS( TargetUnit ) } ) - if RecceUnit:IsDetected( TargetUnit ) and RecceUnit:IsLOS( TargetUnit ) then - local LaserCodeIndex = math.random( 1, #self.LaserCodes ) - local LaserCode = self.LaserCodes[LaserCodeIndex] - --self:F( { LaserCode = LaserCode, LaserCodeUsed = self.LaserCodesUsed[LaserCode] } ) - if not self.LaserCodesUsed[LaserCode] then - self.LaserCodesUsed[LaserCode] = LaserCodeIndex - local Spot = RecceUnit:LaseUnit( TargetUnit, LaserCode, Duration ) - local AttackSet = self.AttackSet - function Spot:OnAfterDestroyed( From, Event, To ) - self:E( "Destroyed Message" ) - self.Recce:MessageToSetGroup( "Target " .. TargetUnit:GetTypeName() .. " destroyed. " .. TargetSetUnit:Count() .. " targets left.", 5, AttackSet ) + + if MarkedCount < self.MaximumMarkings then + + if TargetUnit:IsAlive() then + + local Recce = self.Recces[TargetUnit] + + if not Recce then + + self:E( "Lasing..." ) + self.RecceSet:Flush() + + for RecceGroupID, RecceGroup in pairs( self.RecceSet:GetSet() ) do + for UnitID, UnitData in pairs( RecceGroup:GetUnits() or {} ) do + + local RecceUnit = UnitData -- Wrapper.Unit#UNIT + local RecceUnitDesc = RecceUnit:GetDesc() + --self:F( { RecceUnit = RecceUnit:GetName(), RecceDescription = RecceUnitDesc } ) + + if RecceUnit:IsLasing() == false then + --self:F( { IsDetected = RecceUnit:IsDetected( TargetUnit ), IsLOS = RecceUnit:IsLOS( TargetUnit ) } ) + + if RecceUnit:IsDetected( TargetUnit ) and RecceUnit:IsLOS( TargetUnit ) then + + local LaserCodeIndex = math.random( 1, #self.LaserCodes ) + local LaserCode = self.LaserCodes[LaserCodeIndex] + --self:F( { LaserCode = LaserCode, LaserCodeUsed = self.LaserCodesUsed[LaserCode] } ) + + if not self.LaserCodesUsed[LaserCode] then + + self.LaserCodesUsed[LaserCode] = LaserCodeIndex + local Spot = RecceUnit:LaseUnit( TargetUnit, LaserCode, Duration ) + local AttackSet = self.AttackSet + + function Spot:OnAfterDestroyed( From, Event, To ) + self:E( "Destroyed Message" ) + self.Recce:MessageToSetGroup( "Target " .. TargetUnit:GetTypeName() .. " destroyed. " .. TargetSetUnit:Count() .. " targets left.", 5, AttackSet ) + end + + self.Recces[TargetUnit] = RecceUnit + RecceUnit:MessageToSetGroup( "Marking " .. TargetUnit:GetTypeName() .. " with laser " .. RecceUnit:GetSpot().LaserCode .. " for " .. Duration .. "s.", 5, self.AttackSet ) + -- OK. We have assigned for the Recce a TargetUnit. We can exit the function. + return end - self.Recces[TargetUnit] = RecceUnit - RecceUnit:MessageToSetGroup( "Marking " .. TargetUnit:GetTypeName() .. " with laser " .. RecceUnit:GetSpot().LaserCode .. " for " .. Duration .. "s.", 5, self.AttackSet ) - -- OK. We have assigned for the Recce a TargetUnit. We can exit the function. - return + else + --RecceUnit:MessageToSetGroup( "Can't mark " .. TargetUnit:GetTypeName(), 5, self.AttackSet ) end else - --RecceUnit:MessageToSetGroup( "Can't mark " .. TargetUnit:GetTypeName(), 5, self.AttackSet ) + -- The Recce is lasing, but the Target is not detected or within LOS. So stop lasing and send a report. + + if not RecceUnit:IsDetected( TargetUnit ) or not RecceUnit:IsLOS( TargetUnit ) then + + local Recce = self.Recces[TargetUnit] -- Wrapper.Unit#UNIT + + if Recce then + Recce:LaseOff() + Recce:MessageToSetGroup( "Target " .. TargetUnit:GetTypeName() "out of LOS. Cancelling lase!", 5, self.AttackSet ) + end + else + MarkedCount = MarkedCount + 1 + end end - else - -- The Recce is lasing, but the Target is not detected or within LOS. So stop lasing and send a report. - if not RecceUnit:IsDetected( TargetUnit ) or not RecceUnit:IsLOS( TargetUnit ) then - local Recce = self.Recces[TargetUnit] -- Wrapper.Unit#UNIT - if Recce then - Recce:LaseOff() - Recce:MessageToSetGroup( "Target " .. TargetUnit:GetTypeName() "out of LOS. Cancelling lase!", 5, self.AttackSet ) - end - end end end + else + MarkedCount = MarkedCount + 1 + Recce:MessageToSetGroup( "Marking " .. TargetUnit:GetTypeName() .. " with laser " .. Recce.LaserCode .. ".", 5, self.AttackSet ) end - else - Recce:MessageToSetGroup( "Marking " .. TargetUnit:GetTypeName() .. " with laser " .. Recce.LaserCode .. ".", 5, self.AttackSet ) end end end @@ -1021,19 +1060,29 @@ do -- DESIGNATE local TargetSetUnit = self.Detection:GetDetectedSet( Index ) local TargetSetUnitCount = TargetSetUnit:Count() - TargetSetUnit:ForEachUnit( + local MarkedCount = 0 + + TargetSetUnit:ForEachUnitPerThreatLevel( 10, 0, --- @param Wrapper.Unit#UNIT SmokeUnit function( SmokeUnit ) - self:E("In procedure") - if math.random( 1, TargetSetUnitCount ) == math.random( 1, TargetSetUnitCount ) then + + if MarkedCount < self.MaximumMarkings then + + MarkedCount = MarkedCount + 1 + + self:E( "Smoking ..." ) + local RecceGroup = self.RecceSet:FindNearestGroupFromPointVec2(SmokeUnit:GetPointVec2()) local RecceUnit = RecceGroup:GetUnit( 1 ) + if RecceUnit then + RecceUnit:MessageToSetGroup( "Smoking " .. SmokeUnit:GetTypeName() .. ".", 5, self.AttackSet ) - SCHEDULER:New( nil, + + self.MarkScheduler:Schedule( self, function() if SmokeUnit:IsAlive() then - SmokeUnit:Smoke( Color, 50 ) + SmokeUnit:Smoke( Color, 50, 2 ) end self:Done( Index ) end, {}, math.random( 5, 20 ) @@ -1059,7 +1108,7 @@ do -- DESIGNATE local RecceUnit = RecceGroup:GetUnit( 1 ) if RecceUnit then RecceUnit:MessageToSetGroup( "Illuminating " .. TargetUnit:GetTypeName() .. ".", 5, self.AttackSet ) - SCHEDULER:New( self, + self.MarkScheduler:Schedule( self, function() if TargetUnit:IsAlive() then TargetUnit:GetPointVec3():AddY(300):IlluminationBomb() diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 18627f6d0..b1da137fa 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -1382,6 +1382,7 @@ end -- @return #string function TASK:ReportOverview( ReportGroup ) --R2.1 fixed report. Now nicely formatted and contains the info required. + self:UpdateTaskInfo() -- List the name of the Task. local TaskName = self:GetName() @@ -1479,6 +1480,8 @@ end -- @return #string function TASK:ReportDetails( ReportGroup ) + self:UpdateTaskInfo() + local Report = REPORT:New():SetIndent( 3 ) -- List the name of the Task. diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index baf16d951..1005dde1b 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -765,11 +765,18 @@ end --- Smoke the POSITIONABLE. -- @param #POSITIONABLE self -function POSITIONABLE:Smoke( SmokeColor, Range ) +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The color to smoke to positionable. +-- @param #number Range The range in meters to randomize the smoking around the positionable. +-- @param #number AddHeight The height in meters to add to the altitude of the positionable. +function POSITIONABLE:Smoke( SmokeColor, Range, AddHeight ) self:F2() if Range then - trigger.action.smoke( self:GetRandomVec3( Range ), SmokeColor ) + local Vec3 = self:GetRandomVec3( Range ) + Vec3.y = Vec3.y + AddHeight or 0 + trigger.action.smoke( Vec3, SmokeColor ) else + local Vec3 = self:GetVec3() + Vec3.y = Vec3.y + AddHeight or 0 trigger.action.smoke( self:GetVec3(), SmokeColor ) end