Merge branch 'master' into funkyfranky

This commit is contained in:
funkyfranky 2017-08-30 08:51:53 +02:00
commit 8bcb47a8ee
38 changed files with 1944 additions and 827 deletions

View File

@ -440,7 +440,7 @@ function AI_A2A:onafterStatus()
end
end
if self:Is( "Damaged" ) or self:Is( "LostControl" ) then
if self:Is( "Fuel" ) or self:Is( "Damaged" ) or self:Is( "LostControl" ) then
if DistanceFromHomeBase < 5000 then
self:E( self.Controllable:GetName() .. " is too far from home base, RTB!" )
self:Home( "Destroy" )
@ -448,25 +448,27 @@ function AI_A2A:onafterStatus()
end
local Fuel = self.Controllable:GetFuel()
self:F({Fuel=Fuel})
if Fuel < self.PatrolFuelThresholdPercentage then
if self.TankerName then
self:E( self.Controllable:GetName() .. " is out of fuel: " .. Fuel .. " ... Refuelling at Tanker!" )
self:Refuel()
if not self:Is( "Fuel" ) and not self:Is( "Home" ) then
local Fuel = self.Controllable:GetFuel()
self:F({Fuel=Fuel})
if Fuel < self.PatrolFuelThresholdPercentage then
if self.TankerName then
self:E( self.Controllable:GetName() .. " is out of fuel: " .. Fuel .. " ... Refuelling at Tanker!" )
self:Refuel()
else
self:E( self.Controllable:GetName() .. " is out of fuel: " .. Fuel .. " ... RTB!" )
local OldAIControllable = self.Controllable
local AIControllableTemplate = self.Controllable:GetTemplate()
local OrbitTask = OldAIControllable:TaskOrbitCircle( math.random( self.PatrolFloorAltitude, self.PatrolCeilingAltitude ), self.PatrolMinSpeed )
local TimedOrbitTask = OldAIControllable:TaskControlled( OrbitTask, OldAIControllable:TaskCondition(nil,nil,nil,nil,self.PatrolOutOfFuelOrbitTime,nil ) )
OldAIControllable:SetTask( TimedOrbitTask, 10 )
self:Fuel()
RTB = true
end
else
self:E( self.Controllable:GetName() .. " is out of fuel: " .. Fuel .. " ... RTB!" )
local OldAIControllable = self.Controllable
local AIControllableTemplate = self.Controllable:GetTemplate()
local OrbitTask = OldAIControllable:TaskOrbitCircle( math.random( self.PatrolFloorAltitude, self.PatrolCeilingAltitude ), self.PatrolMinSpeed )
local TimedOrbitTask = OldAIControllable:TaskControlled( OrbitTask, OldAIControllable:TaskCondition(nil,nil,nil,nil,self.PatrolOutOfFuelOrbitTime,nil ) )
OldAIControllable:SetTask( TimedOrbitTask, 10 )
self:Fuel()
RTB = true
end
else
end
-- TODO: Check GROUP damage function.
@ -477,6 +479,7 @@ function AI_A2A:onafterStatus()
self:E( self.Controllable:GetName() .. " is damaged: " .. Damage .. " ... RTB!" )
self:Damaged()
RTB = true
self:SetStatusOff()
end
-- Check if planes went RTB and are out of control.

View File

@ -1000,7 +1000,7 @@ do -- AI_A2A_DISPATCHER
--- @param #AI_A2A_DISPATCHER self
-- @param Core.Event#EVENTDATA EventData
function AI_A2A_DISPATCHER:OnEventLand( EventData )
self:F( "Landed" )
self:E( "Landed" )
local DefenderUnit = EventData.IniUnit
local Defender = EventData.IniGroup
local Squadron = self:GetSquadronFromDefender( Defender )
@ -1019,7 +1019,11 @@ do -- AI_A2A_DISPATCHER
-- Damaged units cannot be repaired anymore.
DefenderUnit:Destroy()
return
end
end
if DefenderUnit:GetFuel() <= self.DefenderDefault.FuelThreshold then
DefenderUnit:Destroy()
return
end
end
end
@ -1348,11 +1352,12 @@ do -- AI_A2A_DISPATCHER
---
-- @param #AI_A2A_DISPATCHER self
function AI_A2A_DISPATCHER:SetDefenderTask( Defender, Type, Fsm, Target )
function AI_A2A_DISPATCHER:SetDefenderTask( SquadronName, Defender, Type, Fsm, Target )
self.DefenderTasks[Defender] = self.DefenderTasks[Defender] or {}
self.DefenderTasks[Defender].Type = Type
self.DefenderTasks[Defender].Fsm = Fsm
self.DefenderTasks[Defender].SquadronName = SquadronName
if Target then
self:SetDefenderTaskTarget( Defender, Target )
@ -1449,7 +1454,6 @@ do -- AI_A2A_DISPATCHER
-- @return #AI_A2A_DISPATCHER
function AI_A2A_DISPATCHER:SetSquadron( SquadronName, AirbaseName, SpawnTemplates, Resources )
self:E( { SquadronName = SquadronName, AirbaseName = AirbaseName, SpawnTemplates = SpawnTemplates, Resources = Resources } )
self.DefenderSquadrons[SquadronName] = self.DefenderSquadrons[SquadronName] or {}
@ -1473,6 +1477,8 @@ do -- AI_A2A_DISPATCHER
end
end
DefenderSquadron.Resources = Resources
self:E( { Squadron = {SquadronName, AirbaseName, SpawnTemplates, Resources } } )
return self
end
@ -1537,6 +1543,8 @@ do -- AI_A2A_DISPATCHER
Cap.AltType = AltType
self:SetSquadronCapInterval( SquadronName, self.DefenderDefault.CapLimit, self.DefenderDefault.CapMinSeconds, self.DefenderDefault.CapMaxSeconds, 1 )
self:E( { CAP = { SquadronName, Zone, FloorAltitude, CeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, EngageMinSpeed, EngageMaxSpeed, AltType } } )
return self
end
@ -1577,14 +1585,15 @@ do -- AI_A2A_DISPATCHER
local Scheduler = Cap.Scheduler -- Core.Scheduler#SCHEDULER
local ScheduleID = Cap.ScheduleID
local Variance = ( Cap.HighInterval - Cap.LowInterval ) / 2
local Median = Cap.LowInterval + Variance
local Randomization = Variance / Median
local Repeat = Cap.LowInterval + Variance
local Randomization = Variance / Repeat
local Start = math.random( 1, Cap.HighInterval )
if ScheduleID then
Scheduler:Stop( ScheduleID )
end
Cap.ScheduleID = Scheduler:Schedule( self, self.SchedulerCAP, { SquadronName }, Median, Median, Randomization )
Cap.ScheduleID = Scheduler:Schedule( self, self.SchedulerCAP, { SquadronName }, Start, Repeat, Randomization )
else
error( "This squadron does not exist:" .. SquadronName )
end
@ -1627,6 +1636,7 @@ do -- AI_A2A_DISPATCHER
local Cap = DefenderSquadron.Cap
if Cap then
local CapCount = self:CountCapAirborne( SquadronName )
self:E( { CapCount = CapCount } )
if CapCount < Cap.CapLimit then
local Probability = math.random()
if Probability <= Cap.Probability then
@ -1683,6 +1693,8 @@ do -- AI_A2A_DISPATCHER
Intercept.Name = SquadronName
Intercept.EngageMinSpeed = EngageMinSpeed
Intercept.EngageMaxSpeed = EngageMaxSpeed
self:E( { GCI = { SquadronName, EngageMinSpeed, EngageMaxSpeed } } )
end
--- Defines the default amount of extra planes that will take-off as part of the defense system.
@ -2465,12 +2477,14 @@ do -- AI_A2A_DISPATCHER
local DefenderSquadron = self.DefenderSquadrons[SquadronName]
if DefenderSquadron then
for AIGroup, DefenderTask in pairs( self:GetDefenderTasks() ) do
if DefenderTask.Type == "CAP" then
if AIGroup:IsAlive() then
-- Check if the CAP is patrolling or engaging. If not, this is not a valid CAP, even if it is alive!
-- The CAP could be damaged, lost control, or out of fuel!
if DefenderTask.Fsm:Is( "Patrolling" ) or DefenderTask.Fsm:Is( "Engaging" ) or DefenderTask.Fsm:Is( "Refuelling" )then
CapCount = CapCount + 1
if DefenderTask.SquadronName == SquadronName then
if DefenderTask.Type == "CAP" then
if AIGroup:IsAlive() then
-- Check if the CAP is patrolling or engaging. If not, this is not a valid CAP, even if it is alive!
-- The CAP could be damaged, lost control, or out of fuel!
if DefenderTask.Fsm:Is( "Patrolling" ) or DefenderTask.Fsm:Is( "Engaging" ) or DefenderTask.Fsm:Is( "Refuelling" )then
CapCount = CapCount + 1
end
end
end
end
@ -2488,12 +2502,17 @@ do -- AI_A2A_DISPATCHER
-- First, count the active AIGroups Units, targetting the DetectedSet
local AIUnitCount = 0
self:E( "Counting Defenders Engaged for Attacker:" )
local DetectedSet = Target.Set
DetectedSet:Flush()
local DefenderTasks = self:GetDefenderTasks()
for AIGroup, DefenderTask in pairs( DefenderTasks ) do
local AIGroup = AIGroup -- Wrapper.Group#GROUP
local DefenderTask = self:GetDefenderTaskTarget( AIGroup )
if DefenderTask and DefenderTask.Index == Target.Index then
AIUnitCount = AIUnitCount + AIGroup:GetSize()
self:E( "Defender Group Name: " .. AIGroup:GetName() .. ", Size: " .. AIGroup:GetSize() )
end
end
@ -2581,7 +2600,34 @@ do -- AI_A2A_DISPATCHER
Fsm:Start()
Fsm:__Patrol( 2 )
self:SetDefenderTask( DefenderCAP, "CAP", Fsm )
self:SetDefenderTask( SquadronName, DefenderCAP, "CAP", Fsm )
function Fsm:onafterRTB( Defender, From, Event, To )
self:F({"CAP RTB", Defender:GetName()})
self:GetParent(self).onafterRTB( self, Defender, From, Event, To )
local Dispatcher = self:GetDispatcher() -- #AI_A2A_DISPATCHER
Dispatcher:ClearDefenderTaskTarget( Defender )
end
--- @param #AI_A2A_DISPATCHER self
function Fsm:onafterHome( Defender, From, Event, To, Action )
self:E({"CAP Home", Defender:GetName()})
self:GetParent(self).onafterHome( self, Defender, From, Event, To )
local Dispatcher = self:GetDispatcher() -- #AI_A2A_DISPATCHER
local Squadron = Dispatcher:GetSquadronFromDefender( Defender )
if Action and Action == "Destroy" then
Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender )
Defender:Destroy()
end
if Dispatcher:GetSquadronLanding( Squadron.Name ) == AI_A2A_DISPATCHER.Landing.NearAirbase then
Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender )
Defender:Destroy()
end
end
end
end
end
@ -2602,32 +2648,6 @@ do -- AI_A2A_DISPATCHER
self:SetDefenderTaskTarget( Defender, Target )
function Fsm:onafterRTB( Defender, From, Event, To )
self:F({"CAP RTB", Defender:GetName()})
self:GetParent(self).onafterRTB( self, Defender, From, Event, To )
local Dispatcher = self:GetDispatcher() -- #AI_A2A_DISPATCHER
Dispatcher:ClearDefenderTaskTarget( Defender )
end
--- @param #AI_A2A_DISPATCHER self
function Fsm:onafterHome( Defender, From, Event, To, Action )
self:F({"CAP Home", Defender:GetName()})
self:GetParent(self).onafterHome( self, Defender, From, Event, To )
local Dispatcher = self:GetDispatcher() -- #AI_A2A_DISPATCHER
local Squadron = Dispatcher:GetSquadronFromDefender( Defender )
if Action and Action == "Destroy" then
Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender )
Defender:Destroy()
end
if Dispatcher:GetSquadronLanding( Squadron.Name ) == AI_A2A_DISPATCHER.Landing.NearAirbase then
Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender )
Defender:Destroy()
end
end
end
end
end
@ -2636,6 +2656,8 @@ do -- AI_A2A_DISPATCHER
-- @param #AI_A2A_DISPATCHER self
function AI_A2A_DISPATCHER:onafterGCI( From, Event, To, DetectedItem, DefendersMissing, Friendlies )
self:F( { From, Event, To, DetectedItem.Index, DefendersMissing, Friendlies } )
local AttackerSet = DetectedItem.Set
local AttackerCount = AttackerSet:Count()
local DefendersCount = 0
@ -2658,17 +2680,19 @@ do -- AI_A2A_DISPATCHER
local BreakLoop = false
while( DefendersCount > 0 and not BreakLoop ) do
self:F( { DefenderSquadrons = self.DefenderSquadrons } )
for SquadronName, DefenderSquadron in pairs( self.DefenderSquadrons or {} ) do
self:F( { GCI = DefenderSquadron.Gci } )
for InterceptID, Intercept in pairs( DefenderSquadron.Gci or {} ) do
--self:E( { DefenderSquadron } )
self:F( { DefenderSquadron } )
local SpawnCoord = DefenderSquadron.Airbase:GetCoordinate() -- Core.Point#COORDINATE
--local TargetCoord = AttackerSet:GetFirst():GetCoordinate()
local TargetCoord = DetectedItem.InterceptCoord
if TargetCoord then
local Distance = SpawnCoord:Get2DDistance( TargetCoord )
self:F( { Distance = Distance, TargetCoord = TargetCoord } )
local InterceptCoord = DetectedItem.InterceptCoord
self:F({InterceptCoord = InterceptCoord})
if InterceptCoord then
local Distance = SpawnCoord:Get2DDistance( InterceptCoord )
self:F( { Distance = Distance, InterceptCoord = InterceptCoord } )
if ClosestDistance == 0 or Distance < ClosestDistance then
@ -2732,7 +2756,7 @@ do -- AI_A2A_DISPATCHER
Fsm:__Engage( 2, DetectedItem.Set ) -- Engage on the TargetSetUnit
self:SetDefenderTask( DefenderGCI, "GCI", Fsm, DetectedItem )
self:SetDefenderTask( ClosestDefenderSquadronName, DefenderGCI, "GCI", Fsm, DetectedItem )
function Fsm:onafterRTB( Defender, From, Event, To )
@ -2865,14 +2889,14 @@ do -- AI_A2A_DISPATCHER
self:ClearDefenderTask( AIGroup )
else
if DefenderTask.Target then
local Target = Detection:GetDetectedItem( DefenderTask.Target.Index )
if not Target then
local AttackerItem = Detection:GetDetectedItem( DefenderTask.Target.Index )
if not AttackerItem then
self:F( { "Removing obsolete Target:", DefenderTask.Target.Index } )
self:ClearDefenderTaskTarget( AIGroup )
else
if DefenderTask.Target.Set then
if DefenderTask.Target.Set:Count() == 0 then
local AttackerCount = DefenderTask.Target.Set:Count()
if AttackerCount == 0 then
self:F( { "All Targets destroyed in Target, removing:", DefenderTask.Target.Index } )
self:ClearDefenderTaskTarget( AIGroup )
end
@ -2958,7 +2982,7 @@ do -- AI_A2A_DISPATCHER
end
Report:Add( string.format( "\n - %d Tasks", TaskCount ) )
self:T( Report:Text( "\n" ) )
self:E( Report:Text( "\n" ) )
trigger.action.outText( Report:Text( "\n" ), 25 )
end
@ -3454,6 +3478,7 @@ do
-- Setup squadrons
self:F( { Airbases = AirbaseNames } )
self.Templates:Flush()
for AirbaseID, AirbaseName in pairs( AirbaseNames ) do
local Airbase = _DATABASE:FindAirbase( AirbaseName ) -- Wrapper.Airbase#AIRBASE

View File

@ -871,9 +871,9 @@ function EVENT:onEvent( Event )
-- Okay, we got the event from DCS. Now loop the SORTED self.EventSorted[] table for the received Event.id, and for each EventData registered, check if a function needs to be called.
for EventClass, EventData in pairs( self.Events[Event.id][EventPriority] ) do
if Event.IniObjectCategory ~= Object.Category.STATIC then
self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } )
end
--if Event.IniObjectCategory ~= Object.Category.STATIC then
-- self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } )
--end
Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName )
Event.TgtGroup = GROUP:FindByName( Event.TgtDCSGroupName )

View File

@ -838,8 +838,12 @@ do -- COORDINATE
if ModeA2A then
if Settings:IsA2A_BRAA() then
local Coordinate = Controllable:GetCoordinate()
return self:ToStringBRA( Coordinate, Settings )
if Controllable then
local Coordinate = Controllable:GetCoordinate()
return self:ToStringBRA( Coordinate, Settings )
else
return self:ToStringMGRS( Settings )
end
end
if Settings:IsA2A_BULLS() then
local Coalition = Controllable:GetCoalition()
@ -856,8 +860,13 @@ do -- COORDINATE
end
else
if Settings:IsA2G_BR() then
local Coordinate = Controllable:GetCoordinate()
return Controllable and self:ToStringBR( Coordinate, Settings ) or self:ToStringMGRS( Settings )
-- If no Controllable is given to calculate the BR from, then MGRS will be used!!!
if Controllable then
local Coordinate = Controllable:GetCoordinate()
return Controllable and self:ToStringBR( Coordinate, Settings ) or self:ToStringMGRS( Settings )
else
return self:ToStringMGRS( Settings )
end
end
if Settings:IsA2G_LL_DMS() then
return self:ToStringLLDMS( Settings )

View File

@ -1784,6 +1784,7 @@ end
--- Calculate the maxium A2G threat level of the SET_UNIT.
-- @param #SET_UNIT self
-- @return #number The maximum threatlevel
function SET_UNIT:CalculateThreatLevelA2G()
local MaxThreatLevelA2G = 0

View File

@ -834,6 +834,20 @@ function ZONE_GROUP:GetRandomVec2()
return Point
end
--- Returns a @{Point#POINT_VEC2} object reflecting a random 2D location within the zone.
-- @param #ZONE_GROUP self
-- @param #number inner (optional) Minimal distance from the center of the zone. Default is 0.
-- @param #number outer (optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone.
-- @return Core.Point#POINT_VEC2 The @{Point#POINT_VEC2} object reflecting the random 3D location within the zone.
function ZONE_GROUP:GetRandomPointVec2( inner, outer )
self:F( self.ZoneName, inner, outer )
local PointVec2 = POINT_VEC2:NewFromVec2( self:GetRandomVec2() )
self:T3( { PointVec2 } )
return PointVec2
end
--- @type ZONE_POLYGON_BASE

View File

@ -133,7 +133,7 @@ do -- DESIGNATE
--
-- ## 4. Laser codes
--
-- ### 4.1 Set possible laser codes
-- ### 4.1. Set possible laser codes
--
-- An array of laser codes can be provided, that will be used by the DESIGNATE when lasing.
-- The laser code is communicated by the Recce when it is lasing a larget.
@ -151,10 +151,19 @@ do -- DESIGNATE
--
-- The above sets a collection of possible laser codes that can be assigned. **Note the { } notation!**
--
-- ### 4.2 Auto generate laser codes
-- ### 4.2. Auto generate laser codes
--
-- Use the method @{#DESIGNATE.GenerateLaserCodes}() to generate all possible laser codes. Logic implemented and advised by Ciribob!
--
-- ### 4.3. Add specific lase codes to the lase menu
--
-- Certain plane types can only drop laser guided ordonnance when targets are lased with specific laser codes.
-- The SU-25T needs targets to be lased using laser code 1113.
-- The A-10A needs targets to be lased using laser code 1680.
--
-- The method @{#DESIGNATE.AddMenuLaserCode}() to allow a player to lase a target using a specific laser code.
-- Remove such a lase menu option using @{#DESIGNATE.RemoveMenuLaserCode}().
--
-- ## 5. Autolase to automatically lase detected targets.
--
-- DetectionItems can be auto lased once detected by Recces. As such, there is almost no action required from the Players using the Designate Menu.
@ -396,6 +405,8 @@ do -- DESIGNATE
self.LaserCodesUsed = {}
self.MenuLaserCodes = {} -- This map contains the laser codes that will be shown in the designate menu to lase with specific laser codes.
self.Detection:__Start( 2 )
self:__Detect( -15 )
@ -491,6 +502,43 @@ do -- DESIGNATE
end
--- Add a specific lase code to the designate lase menu to lase targets with a specific laser code.
-- The MenuText will appear in the lase menu.
-- @param #DESIGNATE self
-- @param #number LaserCode The specific laser code to be added to the lase menu.
-- @param #string MenuText The text to be shown to the player. If you specify a %d in the MenuText, the %d will be replaced with the LaserCode specified.
-- @return #DESIGNATE
-- @usage
-- RecceDesignation:AddMenuLaserCode( 1113, "Lase with %d for Su-25T" )
-- RecceDesignation:AddMenuLaserCode( 1680, "Lase with %d for A-10A" )
--
function DESIGNATE:AddMenuLaserCode( LaserCode, MenuText )
self.MenuLaserCodes[LaserCode] = MenuText
self:SetDesignateMenu()
return self
end
--- Removes a specific lase code from the designate lase menu.
-- @param #DESIGNATE self
-- @param #number LaserCode The specific laser code that was set to be added to the lase menu.
-- @return #DESIGNATE
-- @usage
-- RecceDesignation:RemoveMenuLaserCode( 1113 )
--
function DESIGNATE:RemoveMenuLaserCode( LaserCode )
self.MenuLaserCodes[LaserCode] = nil
self:SetDesignateMenu()
return self
end
--- Set the name of the designation. The name will appear in the menu.
-- This method can be used to control different designations for different plane types.
-- @param #DESIGNATE self
@ -797,11 +845,9 @@ do -- DESIGNATE
MENU_GROUP_COMMAND:New( AttackGroup, "Flash Status Report On", StatusMenu, self.MenuFlashStatus, self, AttackGroup, true ):SetTime( MenuTime ):SetTag( self.DesignateName )
end
local DetectedItems = self.Detection:GetDetectedItems()
for DesignateIndex, Designating in pairs( self.Designating ) do
local DetectedItem = DetectedItems[DesignateIndex]
local DetectedItem = self.Detection:GetDetectedItem( DesignateIndex )
if DetectedItem then
@ -813,8 +859,10 @@ do -- DESIGNATE
MenuText = "(-) " .. MenuText
local DetectedMenu = MENU_GROUP:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( self.DesignateName )
MENU_GROUP_COMMAND:New( AttackGroup, "Search other target", DetectedMenu, self.MenuForget, self, DesignateIndex ):SetTime( MenuTime ):SetTag( self.DesignateName )
MENU_GROUP_COMMAND:New( AttackGroup, "Lase target 60 secs", DetectedMenu, self.MenuLaseOn, self, DesignateIndex, 60 ):SetTime( MenuTime ):SetTag( self.DesignateName )
MENU_GROUP_COMMAND:New( AttackGroup, "Lase target 120 secs", DetectedMenu, self.MenuLaseOn, self, DesignateIndex, 120 ):SetTime( MenuTime ):SetTag( self.DesignateName )
for LaserCode, MenuText in pairs( self.MenuLaserCodes ) do
MENU_GROUP_COMMAND:New( AttackGroup, string.format( MenuText, LaserCode ), DetectedMenu, self.MenuLaseCode, self, DesignateIndex, 60, LaserCode ):SetTime( MenuTime ):SetTag( self.DesignateName )
end
MENU_GROUP_COMMAND:New( AttackGroup, "Lase targets", DetectedMenu, self.MenuLaseOn, self, DesignateIndex, 60 ):SetTime( MenuTime ):SetTag( self.DesignateName )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke red", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Red ):SetTime( MenuTime ):SetTag( self.DesignateName )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke blue", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Blue ):SetTime( MenuTime ):SetTag( self.DesignateName )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke green", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Green ):SetTime( MenuTime ):SetTag( self.DesignateName )
@ -914,6 +962,18 @@ do -- DESIGNATE
self:SetDesignateMenu()
end
---
-- @param #DESIGNATE self
function DESIGNATE:MenuLaseCode( Index, Duration, LaserCode )
self:E( "Designate through Lase using " .. LaserCode )
self:__LaseOn( 1, Index, Duration, LaserCode )
self:SetDesignateMenu()
end
---
-- @param #DESIGNATE self
function DESIGNATE:MenuLaseOff( Index, Duration )
@ -927,21 +987,22 @@ do -- DESIGNATE
---
-- @param #DESIGNATE self
function DESIGNATE:onafterLaseOn( From, Event, To, Index, Duration )
function DESIGNATE:onafterLaseOn( From, Event, To, Index, Duration, LaserCode )
self.Designating[Index] = "Laser"
self:__Lasing( -1, Index, Duration )
self:__Lasing( -1, Index, Duration, LaserCode )
end
---
-- @param #DESIGNATE self
-- @return #DESIGNATE
function DESIGNATE:onafterLasing( From, Event, To, Index, Duration )
function DESIGNATE:onafterLasing( From, Event, To, Index, Duration, LaserCodeRequested )
local TargetSetUnit = self.Detection:GetDetectedSet( Index )
local MarkedCount = 0
local MarkingCount = 0
local MarkedTypes = {}
local ReportTypes = REPORT:New()
local ReportLaserCodes = REPORT:New()
@ -953,12 +1014,30 @@ do -- DESIGNATE
local Recce = RecceData -- Wrapper.Unit#UNIT
self:F( { TargetUnit = TargetUnit, Recce = Recce:GetName() } )
if not Recce:IsLasing() then
local LaserCode = Recce:GetLaserCode() --(Not deleted when stopping with lasing).
local LaserCode = Recce:GetLaserCode() -- (Not deleted when stopping with lasing).
self:F( { ClearingLaserCode = LaserCode } )
self.LaserCodesUsed[LaserCode] = nil
self.Recces[TargetUnit] = nil
end
end
-- If a specific lasercode is requested, we disable one active lase!
if LaserCodeRequested then
for TargetUnit, RecceData in pairs( self.Recces ) do -- We break after the first has been processed.
local Recce = RecceData -- Wrapper.Unit#UNIT
self:F( { TargetUnit = TargetUnit, Recce = Recce:GetName() } )
if Recce:IsLasing() then
-- When a Recce is lasing, we switch the lasing off, and clear the references to the lasing in the DESIGNATE class.
Recce:LaseOff() -- Switch off the lasing.
local LaserCode = Recce:GetLaserCode() -- (Not deleted when stopping with lasing).
self:F( { ClearingLaserCode = LaserCode } )
self.LaserCodesUsed[LaserCode] = nil
self.Recces[TargetUnit] = nil
break
end
end
end
TargetSetUnit:ForEachUnitPerThreatLevel( 10, 0,
--- @param Wrapper.Unit#UNIT SmokeUnit
@ -966,7 +1045,7 @@ do -- DESIGNATE
self:F( { TargetUnit = TargetUnit:GetName() } )
if MarkedCount < self.MaximumMarkings then
if MarkingCount < self.MaximumMarkings then
if TargetUnit:IsAlive() then
@ -993,6 +1072,11 @@ do -- DESIGNATE
local LaserCode = self.LaserCodes[LaserCodeIndex]
--self:F( { LaserCode = LaserCode, LaserCodeUsed = self.LaserCodesUsed[LaserCode] } )
if LaserCodeRequested and LaserCodeRequested ~= LaserCode then
LaserCode = LaserCodeRequested
LaserCodeRequested = nil
end
if not self.LaserCodesUsed[LaserCode] then
self.LaserCodesUsed[LaserCode] = LaserCodeIndex
@ -1007,7 +1091,7 @@ do -- DESIGNATE
self.Recces[TargetUnit] = RecceUnit
RecceUnit:MessageToSetGroup( "Marking " .. TargetUnit:GetTypeName() .. " with laser " .. RecceUnit:GetSpot().LaserCode .. " for " .. Duration .. "s.", 5, self.AttackSet, self.DesignateName )
-- OK. We have assigned for the Recce a TargetUnit. We can exit the function.
MarkedCount = MarkedCount + 1
MarkingCount = MarkingCount + 1
local TargetUnitType = TargetUnit:GetTypeName()
if not MarkedTypes[TargetUnitType] then
MarkedTypes[TargetUnitType] = true
@ -1031,7 +1115,7 @@ do -- DESIGNATE
Recce:MessageToSetGroup( "Target " .. TargetUnit:GetTypeName() "out of LOS. Cancelling lase!", 5, self.AttackSet, self.DesignateName )
end
else
MarkedCount = MarkedCount + 1
MarkingCount = MarkingCount + 1
local TargetUnitType = TargetUnit:GetTypeName()
if not MarkedTypes[TargetUnitType] then
MarkedTypes[TargetUnitType] = true
@ -1043,7 +1127,7 @@ do -- DESIGNATE
end
end
else
MarkedCount = MarkedCount + 1
MarkingCount = MarkingCount + 1
local TargetUnitType = TargetUnit:GetTypeName()
if not MarkedTypes[TargetUnitType] then
MarkedTypes[TargetUnitType] = true
@ -1060,7 +1144,7 @@ do -- DESIGNATE
local MarkedTypesText = ReportTypes:Text(', ')
local MarkedLaserCodesText = ReportLaserCodes:Text(', ')
for MarkedType, MarketCount in pairs( MarkedTypes ) do
self.CC:GetPositionable():MessageToSetGroup( "Marking " .. MarkedCount .. " x " .. MarkedTypesText .. " with lasers " .. MarkedLaserCodesText .. ".", 5, self.AttackSet, self.DesignateName )
self.CC:GetPositionable():MessageToSetGroup( "Marking " .. MarkingCount .. " x " .. MarkedTypesText .. " with lasers " .. MarkedLaserCodesText .. ".", 5, self.AttackSet, self.DesignateName )
end
self:__Lasing( -30, Index, Duration )

View File

@ -305,7 +305,7 @@ do -- DETECTION_BASE
-- @field #number ID -- The identifier of the detected area.
-- @field #boolean FriendliesNearBy Indicates if there are friendlies within the detected area.
-- @field Wrapper.Unit#UNIT NearestFAC The nearest FAC near the Area.
-- @field Core.Point#COORDINATE Coordinate The last known coordinate of the DetectedItem.
--- DETECTION constructor.
-- @param #DETECTION_BASE self
@ -604,6 +604,14 @@ do -- DETECTION_BASE
DetectionAccepted = self._.FilterCategories[DetectedUnitCategory] ~= nil and DetectionAccepted or false
-- if Distance > 15000 then
-- if DetectedUnitCategory == Unit.Category.GROUND_UNIT or DetectedUnitCategory == Unit.Category.SHIP then
-- if DetectedObject:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) == false then
-- DetectionAccepted = false
-- end
-- end
-- end
if self.AcceptRange and Distance > self.AcceptRange then
DetectionAccepted = false
end
@ -1101,8 +1109,8 @@ do -- DETECTION_BASE
DetectedItem.Changes[ChangeCode].ID = ID
DetectedItem.Changes[ChangeCode].ItemUnitType = ItemUnitType
self:T( { "Change on Detection Item:", DetectedItem.ID, ChangeCode, ItemUnitType } )
self:E( { "Change on Detection Item:", DetectedItem.ID, ChangeCode, ItemUnitType } )
return self
end
@ -1124,7 +1132,7 @@ do -- DETECTION_BASE
DetectedItem.Changes[ChangeCode][ChangeUnitType] = DetectedItem.Changes[ChangeCode][ChangeUnitType] + 1
DetectedItem.Changes[ChangeCode].ID = ID
self:T( { "Change on Detection Item:", DetectedItem.ID, ChangeCode, ChangeUnitType } )
self:E( { "Change on Detection Item:", DetectedItem.ID, ChangeCode, ChangeUnitType } )
return self
end
@ -1353,6 +1361,32 @@ do -- DETECTION_BASE
return nil
end
--- Gets a detected unit type name, taking into account the detection results.
-- @param #DETECTION_BASE self
-- @param Wrapper.Unit#UNIT DetectedUnit
-- @return #string The type name
function DETECTION_BASE:GetDetectedUnitTypeName( DetectedUnit )
--self:F2( ObjectName )
if DetectedUnit and DetectedUnit:IsAlive() then
local DetectedUnitName = DetectedUnit:GetName()
local DetectedObject = self.DetectedObjects[DetectedUnitName]
if DetectedObject then
if DetectedObject.KnowType then
return DetectedUnit:GetTypeName()
else
return "Unknown"
end
end
else
return "Dead:" .. DetectedUnit:GetName()
end
return "Undetected:" .. DetectedUnit:GetName()
end
--- Adds a new DetectedItem to the DetectedItems list.
-- The DetectedItem is a table and contains a SET_UNIT in the field Set.
@ -1538,15 +1572,78 @@ do -- DETECTION_BASE
end
--- Set the detected item coordinate.
-- @param #DETECTION_BASE self
-- @param #DETECTION_BASE.DetectedItem The DetectedItem to set the coordinate at.
-- @param Core.Point#COORDINATE Coordinate The coordinate to set the last know detected position at.
-- @param Wrapper.Unit#UNIT DetectedItemUnit The unit to set the heading and altitude from.
-- @return #DETECTION_BASE
function DETECTION_BASE:SetDetectedItemCoordinate( DetectedItem, Coordinate, DetectedItemUnit )
self:F( { Coordinate = Coordinate } )
if DetectedItem then
if DetectedItemUnit then
DetectedItem.Coordinate = Coordinate
DetectedItem.Coordinate:SetHeading( DetectedItemUnit:GetHeading() )
DetectedItem.Coordinate.y = DetectedItemUnit:GetAltitude()
DetectedItem.Coordinate.Speed = DetectedItemUnit:GetVelocityMPS()
end
end
end
--- Get the detected item coordinate.
-- @param #DETECTION_BASE self
-- @param Index
-- @param #number Index
-- @return Core.Point#COORDINATE
function DETECTION_BASE:GetDetectedItemCoordinate( Index )
self:F( { Index = Index } )
local DetectedItem = self:GetDetectedItem( Index )
if DetectedItem then
return DetectedItem.Coordinate
end
return nil
end
--- Set the detected item threatlevel.
-- @param #DETECTION_BASE self
-- @param #DETECTION_BASE.DetectedItem The DetectedItem to calculate the threatlevel for.
-- @return #DETECTION_BASE
function DETECTION_BASE:SetDetectedItemThreatLevel( DetectedItem )
local DetectedSet = DetectedItem.Set
if DetectedItem then
DetectedItem.ThreatLevel = DetectedSet:CalculateThreatLevelA2G()
end
end
--- Get the detected item coordinate.
-- @param #DETECTION_BASE self
-- @param #number Index
-- @return #number ThreatLevel
function DETECTION_BASE:GetDetectedItemThreatLevel( Index )
self:F( { Index = Index } )
local DetectedItem = self:GetDetectedItem( Index )
if DetectedItem then
return DetectedItem.ThreatLevel or 0
end
return nil
end
--- Menu of a detected item using a given numeric index.
-- @param #DETECTION_BASE self
@ -1639,27 +1736,6 @@ do -- DETECTION_UNITS
return self
end
--- Get the detected item coordinate.
-- @param #DETECTION_UNITS self
-- @param Index
-- @return Core.Point#COORDINATE
function DETECTION_UNITS:GetDetectedItemCoordinate( Index )
self:F( { Index = Index } )
local DetectedItem = self:GetDetectedItem( Index )
local DetectedSet = self:GetDetectedSet( Index )
if DetectedSet then
local DetectedItemUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT
if DetectedItemUnit and DetectedItemUnit:IsAlive() then
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
DetectedItemCoordinate:SetHeading( DetectedItemUnit:GetHeading() )
return DetectedItemCoordinate
end
end
end
--- Make text documenting the changes of the detected zone.
-- @param #DETECTION_UNITS self
-- @param #DETECTION_UNITS.DetectedItem DetectedItem
@ -1727,6 +1803,7 @@ do -- DETECTION_UNITS
-- Update the detection with the new data provided.
DetectedItem.TypeName = DetectedUnit:GetTypeName()
DetectedItem.CategoryName = DetectedUnit:GetCategoryName()
DetectedItem.Name = DetectedObject.Name
DetectedItem.IsVisible = DetectedObject.IsVisible
DetectedItem.LastTime = DetectedObject.LastTime
@ -1781,8 +1858,14 @@ do -- DETECTION_UNITS
local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem
local DetectedSet = DetectedItem.Set
-- Set the last known coordinate.
local DetectedFirstUnit = DetectedSet:GetFirst()
local DetectedFirstUnitCoord = DetectedFirstUnit:GetCoordinate()
self:SetDetectedItemCoordinate( DetectedItem, DetectedFirstUnitCoord, DetectedFirstUnit )
self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table
--self:NearestFAC( DetectedItem )
end
end
@ -1804,21 +1887,14 @@ do -- DETECTION_UNITS
local UnitDistanceText = ""
local UnitCategoryText = ""
local DetectedItemUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT
if DetectedItemUnit and DetectedItemUnit:IsAlive() then
self:T(DetectedItemUnit)
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup )
ReportSummary = string.format(
"%s - %s",
DetectedItemID,
DetectedItemCoordText
)
end
local DetectedItemCoordinate = self:GetDetectedItemCoordinate( Index )
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup )
ReportSummary = string.format(
"%s - %s",
DetectedItemID,
DetectedItemCoordText
)
self:T( ReportSummary )
return ReportSummary
@ -1835,54 +1911,46 @@ do -- DETECTION_UNITS
self:F( { Index, self.DetectedItems } )
local DetectedItem = self:GetDetectedItem( Index )
local DetectedSet = self:GetDetectedSet( Index )
local DetectedItemID = self:GetDetectedItemID( Index )
self:T( DetectedSet )
if DetectedSet then
if DetectedItem then
local ReportSummary = ""
local UnitDistanceText = ""
local UnitCategoryText = ""
local DetectedItemUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT
if DetectedItemUnit and DetectedItemUnit:IsAlive() then
self:T(DetectedItemUnit)
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"
if DetectedItem.KnowType then
local UnitCategoryName = DetectedItem.CategoryName
if UnitCategoryName then
UnitCategoryText = UnitCategoryName
end
if DetectedItem.KnowDistance then
if DetectedItem.IsVisible then
UnitDistanceText = " at " .. string.format( "%.2f", DetectedItem.Distance ) .. " km"
end
else
if DetectedItem.IsVisible then
UnitDistanceText = " at +/- " .. string.format( "%.0f", DetectedItem.Distance ) .. " km"
end
if DetectedItem.TypeName then
UnitCategoryText = UnitCategoryText .. " (" .. DetectedItem.TypeName .. ")"
end
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup, Settings )
local ThreatLevelA2G = DetectedItemUnit:GetThreatLevel( DetectedItem )
local Report = REPORT:New()
Report:Add(DetectedItemID .. ", " .. DetectedItemCoordText)
Report:Add( string.format( "Threat: [%s]", string.rep( "", ThreatLevelA2G ) ) )
Report:Add( string.format("Type: %s%s", UnitCategoryText, UnitDistanceText ) )
return Report
else
UnitCategoryText = "Unknown"
end
if DetectedItem.KnowDistance then
if DetectedItem.IsVisible then
UnitDistanceText = " at " .. string.format( "%.2f", DetectedItem.Distance ) .. " km"
end
else
if DetectedItem.IsVisible then
UnitDistanceText = " at +/- " .. string.format( "%.0f", DetectedItem.Distance ) .. " km"
end
end
--TODO: solve Index reference
local DetectedItemCoordinate = self:GetDetectedItemCoordinate( Index )
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup, Settings )
local ThreatLevelA2G = self:GetDetectedItemThreatLevel( Index )
local Report = REPORT:New()
Report:Add(DetectedItemID .. ", " .. DetectedItemCoordText)
Report:Add( string.format( "Threat: [%s]", string.rep( "", ThreatLevelA2G ) ) )
Report:Add( string.format("Type: %s%s", UnitCategoryText, UnitDistanceText ) )
return Report
end
return nil
end
@ -1900,7 +1968,7 @@ do -- DETECTION_UNITS
local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem
local ReportSummary = self:DetectedItemReportSummary( DetectedItemID, AttackGroup )
Report:SetTitle( "Detected units:" )
Report:Add( ReportSummary )
Report:Add( ReportSummary:Text() )
end
local ReportText = Report:Text()
@ -1944,25 +2012,6 @@ do -- DETECTION_TYPES
return self
end
--- Get the detected item coordinate.
-- @param #DETECTION_TYPES self
-- @param DetectedTypeName
-- @return #Core.Point#COORDINATE
function DETECTION_TYPES:GetDetectedItemCoordinate( DetectedTypeName )
self:F( { DetectedTypeName = DetectedTypeName } )
local DetectedItem = self:GetDetectedItem( DetectedTypeName )
local DetectedSet = self:GetDetectedSet( DetectedTypeName )
if DetectedItem then
local DetectedItemUnit = DetectedSet:GetFirst()
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
DetectedItemCoordinate:SetHeading( DetectedItemUnit:GetHeading() )
return DetectedItemCoordinate
end
end
--- Make text documenting the changes of the detected zone.
-- @param #DETECTION_TYPES self
-- @param #DETECTION_TYPES.DetectedItem DetectedItem
@ -2067,10 +2116,16 @@ do -- DETECTION_TYPES
local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem
local DetectedSet = DetectedItem.Set
-- Set the last known coordinate.
local DetectedFirstUnit = DetectedSet:GetFirst()
local DetectedUnitCoord = DetectedFirstUnit:GetCoordinate()
self:SetDetectedItemCoordinate( DetectedItem, DetectedUnitCoord, DetectedFirstUnit )
self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table
--self:NearestFAC( DetectedItem )
end
end
@ -2082,20 +2137,13 @@ do -- DETECTION_TYPES
self:F( DetectedTypeName )
local DetectedItem = self:GetDetectedItem( DetectedTypeName )
local DetectedSet = self:GetDetectedSet( DetectedTypeName )
local DetectedItemID = self:GetDetectedItemID( DetectedTypeName )
self:T( DetectedItem )
if DetectedItem then
local DetectedItemUnit = DetectedSet:GetFirst()
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
local DetectedItemCoordinate = self:GetDetectedItemCoordinate( DetectedTypeName )
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup )
--self:E( { DetectedItemID,
-- DetectedItemCoordText } )
local ReportSummary = string.format(
"%s - %s",
DetectedItemID,
@ -2123,13 +2171,11 @@ do -- DETECTION_TYPES
self:T( DetectedItem )
if DetectedItem then
local ThreatLevelA2G = DetectedSet:CalculateThreatLevelA2G()
local ThreatLevelA2G = self:GetDetectedItemThreatLevel( DetectedTypeName )
local DetectedItemsCount = DetectedSet:Count()
local DetectedItemType = DetectedItem.TypeName
local DetectedItemUnit = DetectedSet:GetFirst()
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
local DetectedItemCoordinate = self:GetDetectedItemCoordinate( DetectedTypeName )
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup, Settings )
local Report = REPORT:New()
@ -2152,7 +2198,7 @@ do -- DETECTION_TYPES
local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem
local ReportSummary = self:DetectedItemReportSummary( DetectedItemTypeName, AttackGroup )
Report:SetTitle( "Detected types:" )
Report:Add( ReportSummary )
Report:Add( ReportSummary:Text() )
end
local ReportText = Report:Text()
@ -2228,32 +2274,6 @@ do -- DETECTION_AREAS
return self
end
--- Get the detected item coordinate.
-- In this case, the coordinate is the center of the zone of the area, not the center unit!
-- So if units move, the retrieved coordinate can be different from the units positions.
-- @param #DETECTION_AREAS self
-- @param Index
-- @return Core.Point#COORDINATE The coordinate.
function DETECTION_AREAS:GetDetectedItemCoordinate( Index )
self:F( { Index = Index } )
local DetectedItem = self:GetDetectedItem( Index )
local DetectedItemSet = self:GetDetectedSet( Index )
local FirstUnit = DetectedItemSet:GetFirst()
if DetectedItem then
local DetectedZone = self:GetDetectedItemZone( Index )
-- TODO: Rework to COORDINATE. Problem with SetAlt.
local DetectedItemCoordinate = DetectedZone:GetPointVec2()
-- These need to be done to understand the heading and altitude of the first unit in the zone.
DetectedItemCoordinate:SetHeading( FirstUnit:GetHeading() )
DetectedItemCoordinate:SetAlt( FirstUnit:GetAltitude() )
return DetectedItemCoordinate
end
return nil
end
--- Menu of a detected item using a given numeric index.
-- @param #DETECTION_AREAS self
@ -2305,7 +2325,7 @@ do -- DETECTION_AREAS
local DetectedItemCoordinate = DetectedZone:GetCoordinate()
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup, Settings )
local ThreatLevelA2G = self:GetTreatLevelA2G( DetectedItem )
local ThreatLevelA2G = self:GetDetectedItemThreatLevel( Index )
local DetectedItemsCount = DetectedSet:Count()
local DetectedItemsTypes = DetectedSet:GetTypeNames()
@ -2332,7 +2352,7 @@ do -- DETECTION_AREAS
local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem
local ReportSummary = self:DetectedItemReportSummary( DetectedItemIndex, AttackGroup )
Report:SetTitle( "Detected areas:" )
Report:Add( ReportSummary )
Report:Add( ReportSummary:Text() )
end
local ReportText = Report:Text()
@ -2341,48 +2361,26 @@ do -- DETECTION_AREAS
end
--- Calculate the maxium A2G threat level of the DetectedItem.
-- @param #DETECTION_AREAS self
-- @param #DETECTION_BASE.DetectedItem DetectedItem
function DETECTION_AREAS:CalculateThreatLevelA2G( DetectedItem )
local MaxThreatLevelA2G = 0
for UnitName, UnitData in pairs( DetectedItem.Set:GetSet() ) do
local ThreatUnit = UnitData -- Wrapper.Unit#UNIT
local ThreatLevelA2G = ThreatUnit:GetThreatLevel()
if ThreatLevelA2G > MaxThreatLevelA2G then
MaxThreatLevelA2G = ThreatLevelA2G
end
end
self:T3( MaxThreatLevelA2G )
DetectedItem.MaxThreatLevelA2G = MaxThreatLevelA2G
end
--- Calculate the optimal intercept point of the DetectedItem.
-- @param #DETECTION_AREAS self
-- @param #DETECTION_BASE.DetectedItem DetectedItem
function DETECTION_AREAS:CalculateIntercept( DetectedItem )
local DetectedSpeed = DetectedItem.Coordinate.Speed
local DetectedHeading = DetectedItem.Coordinate.Heading
local DetectedCoord = DetectedItem.Coordinate
if self.Intercept then
local DetectedSet = DetectedItem.Set
local DetectedUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT
if DetectedUnit then
local UnitSpeed = DetectedUnit:GetVelocityMPS()
local UnitHeading = DetectedUnit:GetHeading()
local UnitCoord = DetectedUnit:GetCoordinate()
local TranslateDistance = UnitSpeed * self.InterceptDelay
local InterceptCoord = UnitCoord:Translate( TranslateDistance, UnitHeading )
DetectedItem.InterceptCoord = InterceptCoord
else
DetectedItem.InterceptCoord = nil
end
-- todo: speed
local TranslateDistance = DetectedSpeed * self.InterceptDelay
local InterceptCoord = DetectedCoord:Translate( TranslateDistance, DetectedHeading )
DetectedItem.InterceptCoord = InterceptCoord
else
DetectedItem.InterceptCoord = nil
DetectedItem.InterceptCoord = DetectedCoord
end
end
@ -2415,18 +2413,6 @@ do -- DETECTION_AREAS
end
--- Returns the A2G threat level of the units in the DetectedItem
-- @param #DETECTION_AREAS self
-- @param #DETECTION_BASE.DetectedItem DetectedItem
-- @return #number a scale from 0 to 10.
function DETECTION_AREAS:GetTreatLevelA2G( DetectedItem )
self:T3( DetectedItem.MaxThreatLevelA2G )
return DetectedItem.MaxThreatLevelA2G
end
--- Smoke the detected units
-- @param #DETECTION_AREAS self
-- @return #DETECTION_AREAS self
@ -2571,13 +2557,14 @@ do -- DETECTION_AREAS
-- First remove the center unit from the set.
DetectedSet:RemoveUnitsByName( DetectedItem.Zone.ZoneUNIT.UnitName )
self:AddChangeItem( DetectedItem, 'RAU', "Dummy" )
self:AddChangeItem( DetectedItem, 'RAU', self:GetDetectedUnitTypeName( DetectedItem.Zone.ZoneUNIT ) )
-- Then search for a new center area unit within the set. Note that the new area unit candidate must be within the area range.
for DetectedUnitName, DetectedUnitData in pairs( DetectedSet:GetSet() ) do
local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT
local DetectedObject = self:GetDetectedObject( DetectedUnit.UnitName )
local DetectedUnitTypeName = self:GetDetectedUnitTypeName( DetectedUnit )
-- The DetectedObject can be nil when the DetectedUnit is not alive anymore or it is not in the DetectedObjects map.
-- If the DetectedUnit was already identified, DetectedObject will be nil.
@ -2590,13 +2577,13 @@ do -- DETECTION_AREAS
-- Assign the Unit as the new center unit of the detected area.
DetectedItem.Zone = ZONE_UNIT:New( DetectedUnit:GetName(), DetectedUnit, self.DetectionZoneRange )
self:AddChangeItem( DetectedItem, "AAU", DetectedItem.Zone.ZoneUNIT:GetTypeName() )
self:AddChangeItem( DetectedItem, "AAU", DetectedUnitTypeName )
-- We don't need to add the DetectedObject to the area set, because it is already there ...
break
else
DetectedSet:Remove( DetectedUnitName )
self:AddChangeUnit( DetectedItem, "RU", DetectedUnit:GetTypeName() )
self:AddChangeUnit( DetectedItem, "RU", DetectedUnitTypeName )
end
end
end
@ -2612,13 +2599,15 @@ do -- DETECTION_AREAS
for DetectedUnitName, DetectedUnitData in pairs( DetectedSet:GetSet() ) do
local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT
local DetectedUnitTypeName = self:GetDetectedUnitTypeName( DetectedUnit )
local DetectedObject = nil
if DetectedUnit:IsAlive() then
--self:E(DetectedUnit:GetName())
DetectedObject = self:GetDetectedObject( DetectedUnit:GetName() )
end
if DetectedObject then
-- Check if the DetectedUnit is within the DetectedItem.Zone
if DetectedUnit:IsInZone( DetectedItem.Zone ) then
@ -2628,7 +2617,7 @@ do -- DETECTION_AREAS
else
-- No, the DetectedUnit is not within the DetectedItem.Zone, remove DetectedUnit from the Set.
DetectedSet:Remove( DetectedUnitName )
self:AddChangeUnit( DetectedItem, "RU", DetectedUnit:GetTypeName() )
self:AddChangeUnit( DetectedItem, "RU", DetectedUnitTypeName )
end
else
@ -2665,6 +2654,7 @@ do -- DETECTION_AREAS
-- We found an unidentified unit outside of any existing detection area.
local DetectedUnit = UNIT:FindByName( DetectedUnitName ) -- Wrapper.Unit#UNIT
local DetectedUnitTypeName = self:GetDetectedUnitTypeName( DetectedUnit )
local AddedToDetectionArea = false
@ -2678,7 +2668,7 @@ do -- DETECTION_AREAS
self:IdentifyDetectedObject( DetectedObject )
DetectedSet:AddUnit( DetectedUnit )
AddedToDetectionArea = true
self:AddChangeUnit( DetectedItem, "AU", DetectedUnit:GetTypeName() )
self:AddChangeUnit( DetectedItem, "AU", DetectedUnitTypeName )
end
end
end
@ -2692,7 +2682,7 @@ do -- DETECTION_AREAS
)
--self:E( DetectedItem.Zone.ZoneUNIT.UnitName )
DetectedItem.Set:AddUnit( DetectedUnit )
self:AddChangeItem( DetectedItem, "AA", DetectedUnit:GetTypeName() )
self:AddChangeItem( DetectedItem, "AA", DetectedUnitTypeName )
end
end
end
@ -2704,13 +2694,19 @@ do -- DETECTION_AREAS
local DetectedItem = DetectedItemData -- #DETECTION_BASE.DetectedItem
local DetectedSet = DetectedItem.Set
local DetectedFirstUnit = DetectedSet:GetFirst()
local DetectedZone = DetectedItem.Zone
-- Set the last known coordinate to the detection item.
local DetectedZoneCoord = DetectedZone:GetCoordinate()
self:SetDetectedItemCoordinate( DetectedItem, DetectedZoneCoord, DetectedFirstUnit )
self:CalculateIntercept( DetectedItem )
self:ReportFriendliesNearBy( { DetectedItem = DetectedItem, ReportSetGroup = self.DetectionSetGroup } ) -- Fill the Friendlies table
self:CalculateThreatLevelA2G( DetectedItem ) -- Calculate A2G threat level
self:SetDetectedItemThreatLevel( DetectedItem ) -- Calculate A2G threat level
self:NearestFAC( DetectedItem )
if DETECTION_AREAS._SmokeDetectedUnits or self._SmokeDetectedUnits then
DetectedZone.ZoneUNIT:SmokeRed()

View File

@ -1163,7 +1163,7 @@ function ESCORT:_ReportTargetsScheduler()
local ClientEscortTargets = EscortGroupData.Detection
--local EscortUnit = EscortGroupData:GetUnit( 1 )
for DetectedItemID, DetectedItem in ipairs( DetectedItems ) do
for DetectedItemID, DetectedItem in pairs( DetectedItems ) do
self:E( { DetectedItemID, DetectedItem } )
-- Remove the sub menus of the Attack menu of the Escort for the EscortGroup.
@ -1171,10 +1171,13 @@ function ESCORT:_ReportTargetsScheduler()
if ClientEscortGroupName == EscortGroupName then
DetectedMsgs[#DetectedMsgs+1] = DetectedItemReportSummary:Text("\n")
local DetectedMsg = DetectedItemReportSummary:Text("\n")
DetectedMsgs[#DetectedMsgs+1] = DetectedMsg
self:T( DetectedMsg )
MENU_CLIENT_COMMAND:New( self.EscortClient,
DetectedItemReportSummary,
DetectedMsg,
self.EscortMenuAttackNearbyTargets,
ESCORT._AttackTarget,
self,
@ -1183,10 +1186,12 @@ function ESCORT:_ReportTargetsScheduler()
else
if self.EscortMenuTargetAssistance then
self:T( DetectedItemReportSummary )
local DetectedMsg = DetectedItemReportSummary:Text("\n")
self:T( DetectedMsg )
local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance )
MENU_CLIENT_COMMAND:New( self.EscortClient,
DetectedItemReportSummary,
DetectedMsg,
MenuTargetAssistance,
ESCORT._AssistTarget,
self,

View File

@ -860,8 +860,9 @@ end
--- Create a summary report of the Mission (one line).
-- @param #MISSION self
-- @param Wrapper.Group#GROUP ReportGroup
-- @return #string
function MISSION:ReportSummary()
function MISSION:ReportSummary( ReportGroup )
local Report = REPORT:New()
@ -874,9 +875,9 @@ function MISSION:ReportSummary()
Report:Add( string.format( '%s - %s - Task Overview Report', Name, Status ) )
-- Determine how many tasks are remaining.
for TaskID, Task in pairs( self:GetTasks() ) do
for TaskID, Task in UTILS.spairs( self:GetTasks(), function( t, a, b ) return t[a]:ReportOrder( ReportGroup ) < t[b]:ReportOrder( ReportGroup ) end ) do
local Task = Task -- Tasking.Task#TASK
Report:Add( "- " .. Task:ReportSummary() )
Report:Add( "- " .. Task:ReportSummary( ReportGroup ) )
end
return Report:Text()
@ -898,13 +899,17 @@ function MISSION:ReportOverview( ReportGroup, TaskStatus )
Report:Add( string.format( '%s - %s - %s Tasks Report', Name, Status, TaskStatus ) )
-- Determine how many tasks are remaining.
local TasksRemaining = 0
local Tasks = 0
for TaskID, Task in UTILS.spairs( self:GetTasks(), function( t, a, b ) return t[a]:ReportOrder( ReportGroup ) < t[b]:ReportOrder( ReportGroup ) end ) do
local Task = Task -- Tasking.Task#TASK
if Task:Is( TaskStatus ) then
Report:Add( string.rep( "-", 140 ) )
Report:Add( " - " .. Task:ReportOverview( ReportGroup ) )
end
Tasks = Tasks + 1
if Tasks >= 8 then
break
end
end
return Report:Text()
@ -963,7 +968,7 @@ end
-- @param Wrapper.Group#GROUP ReportGroup
function MISSION:MenuReportTasksSummary( ReportGroup )
local Report = self:ReportSummary()
local Report = self:ReportSummary( ReportGroup )
self:GetCommandCenter():MessageToGroup( Report, ReportGroup )
end

View File

@ -1343,7 +1343,7 @@ function TASK:onbeforeTimeOut( From, Event, To )
return false
end
do -- Dispatcher
do -- Links
--- Set dispatcher of a task
-- @param #TASK self
@ -1353,6 +1353,19 @@ do -- Dispatcher
self.Dispatcher = Dispatcher
end
--- Set detection of a task
-- @param #TASK self
-- @param Function.Detection#DETECTION_BASE Detection
-- @param #number DetectedItemIndex
-- @return #TASK
function TASK:SetDetection( Detection, DetectedItemIndex )
self:E({DetectedItemIndex,Detection})
self.Detection = Detection
self.DetectedItemIndex = DetectedItemIndex
end
end
do -- Reporting
@ -1360,36 +1373,38 @@ do -- Reporting
--- Create a summary report of the Task.
-- List the Task Name and Status
-- @param #TASK self
-- @param Wrapper.Group#GROUP ReportGroup
-- @return #string
function TASK:ReportSummary() --R2.1 fixed report. Now nicely formatted and contains the info required.
function TASK:ReportSummary( ReportGroup )
local Report = REPORT:New()
-- List the name of the Task.
local Name = self:GetName()
Report:Add( self:GetName() )
-- Determine the status of the Task.
local Status = "<" .. self:GetState() .. ">"
Report:Add( "State: <" .. self:GetState() .. ">" )
Report:Add( 'Task ' .. Name .. ' - State ' .. Status )
return Report:Text()
if self.TaskInfo["Coordinates"] then
local TaskInfoIDText = string.format( "%s: ", "Coordinate" )
local TaskCoord = self.TaskInfo["Coordinates"].TaskInfoText -- Core.Point#COORDINATE
Report:Add( TaskInfoIDText .. TaskCoord:ToString( ReportGroup, nil, self ) )
end
return Report:Text( ', ' )
end
--- Create an overiew report of the Task.
-- List the Task Name and Status
-- @param #TASK self
-- @return #string
function TASK:ReportOverview( ReportGroup ) --R2.1 fixed report. Now nicely formatted and contains the info required.
function TASK:ReportOverview( ReportGroup )
self:UpdateTaskInfo()
-- List the name of the Task.
local TaskName = self:GetName()
local Report = REPORT:New()
-- Determine the status of the Task.
local Status = "<" .. self:GetState() .. ">"
local Line = 0
local LineReport = REPORT:New()
@ -1402,7 +1417,7 @@ function TASK:ReportOverview( ReportGroup ) --R2.1 fixed report. Now nicely form
if Line ~= 0 then
Report:AddIndent( LineReport:Text( ", " ) )
else
Report:Add( TaskName .. " - " .. LineReport:Text( ", " ) )
Report:Add( TaskName .. ", " .. LineReport:Text( ", " ) )
end
LineReport = REPORT:New()
Line = math.floor( TaskInfo.TaskInfoOrder / 10 )
@ -1414,7 +1429,6 @@ function TASK:ReportOverview( ReportGroup ) --R2.1 fixed report. Now nicely form
LineReport:Add( TaskInfoIDText .. TaskInfo.TaskInfoText )
elseif type(TaskInfo) == "table" then
if TaskInfoID == "Coordinates" then
local FromCoordinate = ReportGroup:GetUnit(1):GetCoordinate()
local ToCoordinate = TaskInfo.TaskInfoText -- Core.Point#COORDINATE
--Report:Add( TaskInfoIDText )
LineReport:Add( TaskInfoIDText .. ToCoordinate:ToString( ReportGroup, nil, self ) )
@ -1422,8 +1436,6 @@ function TASK:ReportOverview( ReportGroup ) --R2.1 fixed report. Now nicely form
else
end
end
end
Report:AddIndent( LineReport:Text( ", " ) )

View File

@ -328,17 +328,39 @@ do -- TASK_A2A_INTERCEPT
"Intercept incoming intruders.\n"
)
local TargetCoordinate = TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 10 )
self:SetInfo( "Threat", "[" .. string.rep( "", TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
local DetectedItemsCount = TargetSetUnit:Count()
local DetectedItemsTypes = TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 0 )
self:UpdateTaskInfo()
return self
end
function TASK_A2A_INTERCEPT:UpdateTaskInfo()
local TargetCoordinate = self.Detection and self.Detection:GetDetectedItemCoordinate( self.DetectedItemIndex ) or self.TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 0 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
if self.Detection then
local DetectedItemsCount = self.TargetSetUnit:Count()
local ReportTypes = REPORT:New()
local TargetTypes = {}
for TargetUnitName, TargetUnit in pairs( self.TargetSetUnit:GetSet() ) do
local TargetType = self.Detection:GetDetectedUnitTypeName( TargetUnit )
if not TargetTypes[TargetType] then
TargetTypes[TargetType] = TargetType
ReportTypes:Add( TargetType )
end
end
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, ReportTypes:Text( ", " ) ), 10 )
else
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
end
end
--- @param #TASK_A2A_INTERCEPT self
-- @param Wrapper.Group#GROUP ReportGroup
function TASK_A2A_INTERCEPT:ReportOrder( ReportGroup )
@ -461,17 +483,40 @@ do -- TASK_A2A_SWEEP
"Perform a fighter sweep. Incoming intruders were detected and could be hiding at the location.\n"
)
local TargetCoordinate = TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 10 )
self:SetInfo( "Assumed Threat", "[" .. string.rep( "", TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
local DetectedItemsCount = TargetSetUnit:Count()
local DetectedItemsTypes = TargetSetUnit:GetTypeNames()
self:SetInfo( "Lost Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 0 )
self:UpdateTaskInfo()
return self
end
function TASK_A2A_SWEEP:UpdateTaskInfo()
local TargetCoordinate = self.Detection and self.Detection:GetDetectedItemCoordinate( self.DetectedItemIndex ) or self.TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 0 )
self:SetInfo( "Assumed Threat", "[" .. string.rep( "", self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
if self.Detection then
local DetectedItemsCount = self.TargetSetUnit:Count()
local ReportTypes = REPORT:New()
local TargetTypes = {}
for TargetUnitName, TargetUnit in pairs( self.TargetSetUnit:GetSet() ) do
local TargetType = self.Detection:GetDetectedUnitTypeName( TargetUnit )
if not TargetTypes[TargetType] then
TargetTypes[TargetType] = TargetType
ReportTypes:Add( TargetType )
end
end
self:SetInfo( "Lost Targets", string.format( "%d of %s", DetectedItemsCount, ReportTypes:Text( ", " ) ), 10 )
else
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Lost Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
end
end
function TASK_A2A_SWEEP:ReportOrder( ReportGroup )
local Coordinate = self.TaskInfo.Coordinates.TaskInfoText
local Distance = ReportGroup:GetCoordinate():Get2DDistance( Coordinate )
@ -587,17 +632,39 @@ do -- TASK_A2A_ENGAGE
"Bogeys are nearby! Players close by are ordered to ENGAGE the intruders!\n"
)
local TargetCoordinate = TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 10 )
self:SetInfo( "Threat", "[" .. string.rep( "", TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
local DetectedItemsCount = TargetSetUnit:Count()
local DetectedItemsTypes = TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 0 )
self:UpdateTaskInfo()
return self
end
function TASK_A2A_ENGAGE:UpdateTaskInfo()
local TargetCoordinate = self.Detection and self.Detection:GetDetectedItemCoordinate( self.DetectedItemIndex ) or self.TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 0 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
if self.Detection then
local DetectedItemsCount = self.TargetSetUnit:Count()
local ReportTypes = REPORT:New()
local TargetTypes = {}
for TargetUnitName, TargetUnit in pairs( self.TargetSetUnit:GetSet() ) do
local TargetType = self.Detection:GetDetectedUnitTypeName( TargetUnit )
if not TargetTypes[TargetType] then
TargetTypes[TargetType] = TargetType
ReportTypes:Add( TargetType )
end
end
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, ReportTypes:Text( ", " ) ), 10 )
else
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
end
end
function TASK_A2A_ENGAGE:ReportOrder( ReportGroup )
local Coordinate = self.TaskInfo.Coordinates.TaskInfoText
local Distance = ReportGroup:GetCoordinate():Get2DDistance( Coordinate )

View File

@ -382,9 +382,7 @@ do -- TASK_A2A_DISPATCHER
end
if DetectedItemChanged == true or Remove then
--self:E( "Removing Tasking: " .. Task:GetTaskName() )
Mission:RemoveTask( Task )
self.Tasks[DetectedItemIndex] = nil
Task = self:RemoveTask( DetectedItemIndex )
end
end
end
@ -482,6 +480,11 @@ do -- TASK_A2A_DISPATCHER
return PlayersCount, PlayerTypesReport
end
function TASK_A2A_DISPATCHER:RemoveTask( TaskIndex )
self.Mission:RemoveTask( self.Tasks[TaskIndex] )
self.Tasks[TaskIndex] = nil
end
--- Assigns tasks in relation to the detected items to the @{Set#SET_GROUP}.
-- @param #TASK_A2A_DISPATCHER self
@ -510,8 +513,7 @@ do -- TASK_A2A_DISPATCHER
for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do
Mission:GetCommandCenter():MessageToGroup( string.format( "Obsolete A2A task %s for %s removed.", TaskText, Mission:GetName() ), TaskGroup )
end
Mission:RemoveTask( Task )
self.Tasks[TaskIndex] = nil
Task = self:RemoveTask( TaskIndex )
end
end
end
@ -538,21 +540,24 @@ do -- TASK_A2A_DISPATCHER
local TargetSetUnit = self:EvaluateENGAGE( DetectedItem ) -- Returns a SetUnit if there are targets to be INTERCEPTed...
if TargetSetUnit then
Task = TASK_A2A_ENGAGE:New( Mission, self.SetGroup, string.format( "ENGAGE.%03d", DetectedID ), TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
else
local TargetSetUnit = self:EvaluateINTERCEPT( DetectedItem ) -- Returns a SetUnit if there are targets to be INTERCEPTed...
if TargetSetUnit then
Task = TASK_A2A_INTERCEPT:New( Mission, self.SetGroup, string.format( "INTERCEPT.%03d", DetectedID ), TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
else
local TargetSetUnit = self:EvaluateSWEEP( DetectedItem ) -- Returns a SetUnit
if TargetSetUnit then
Task = TASK_A2A_SWEEP:New( Mission, self.SetGroup, string.format( "SWEEP.%03d", DetectedID ), TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
end
end
end
if Task then
self.Tasks[TaskIndex] = Task
Task:SetTargetZone( DetectedZone, DetectedSet:GetFirst():GetAltitude(), DetectedSet:GetFirst():GetHeading() )
Task:SetTargetZone( DetectedZone, DetectedItem.Coordinate.y, DetectedItem.Coordinate.Heading )
Task:SetDispatcher( self )
Mission:AddTask( Task )

View File

@ -317,7 +317,7 @@ do -- TASK_A2G_SEAD
-- @param Core.Set#SET_UNIT TargetSetUnit
-- @param #string TaskBriefing The briefing of the task.
-- @return #TASK_A2G_SEAD self
function TASK_A2G_SEAD:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskBriefing )
function TASK_A2G_SEAD:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskBriefing)
local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "SEAD", TaskBriefing ) ) -- #TASK_A2G_SEAD
self:F()
@ -335,13 +335,29 @@ do -- TASK_A2G_SEAD
function TASK_A2G_SEAD:UpdateTaskInfo()
local TargetCoordinate = self.TargetSetUnit:GetFirst():GetCoordinate()
local TargetCoordinate = self.Detection and self.Detection:GetDetectedItemCoordinate( self.DetectedItemIndex ) or self.TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 0 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
if self.Detection then
local DetectedItemsCount = self.TargetSetUnit:Count()
local ReportTypes = REPORT:New()
local TargetTypes = {}
for TargetUnitName, TargetUnit in pairs( self.TargetSetUnit:GetSet() ) do
local TargetType = self.Detection:GetDetectedUnitTypeName( TargetUnit )
if not TargetTypes[TargetType] then
TargetTypes[TargetType] = TargetType
ReportTypes:Add( TargetType )
end
end
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, ReportTypes:Text( ", " ) ), 10 )
else
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
end
end
@ -462,13 +478,30 @@ do -- TASK_A2G_BAI
function TASK_A2G_BAI:UpdateTaskInfo()
local TargetCoordinate = self.TargetSetUnit:GetFirst():GetCoordinate()
self:E({self.Detection, self.DetectedItemIndex})
local TargetCoordinate = self.Detection and self.Detection:GetDetectedItemCoordinate( self.DetectedItemIndex ) or self.TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 0 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
if self.Detection then
local DetectedItemsCount = self.TargetSetUnit:Count()
local ReportTypes = REPORT:New()
local TargetTypes = {}
for TargetUnitName, TargetUnit in pairs( self.TargetSetUnit:GetSet() ) do
local TargetType = self.Detection:GetDetectedUnitTypeName( TargetUnit )
if not TargetTypes[TargetType] then
TargetTypes[TargetType] = TargetType
ReportTypes:Add( TargetType )
end
end
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, ReportTypes:Text( ", " ) ), 10 )
else
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
end
end
@ -590,13 +623,28 @@ do -- TASK_A2G_CAS
function TASK_A2G_CAS:UpdateTaskInfo()
local TargetCoordinate = self.TargetSetUnit:GetFirst():GetCoordinate()
local TargetCoordinate = self.Detection and self.Detection:GetDetectedItemCoordinate( self.DetectedItemIndex ) or self.TargetSetUnit:GetFirst():GetCoordinate()
self:SetInfo( "Coordinates", TargetCoordinate, 0 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
self:SetInfo( "Threat", "[" .. string.rep( "", self.Detection and self.Detection:GetDetectedItemThreatLevel( self.DetectedItemIndex ) or self.TargetSetUnit:CalculateThreatLevelA2G() ) .. "]", 11 )
if self.Detection then
local DetectedItemsCount = self.TargetSetUnit:Count()
local ReportTypes = REPORT:New()
local TargetTypes = {}
for TargetUnitName, TargetUnit in pairs( self.TargetSetUnit:GetSet() ) do
local TargetType = self.Detection:GetDetectedUnitTypeName( TargetUnit )
if not TargetTypes[TargetType] then
TargetTypes[TargetType] = TargetType
ReportTypes:Add( TargetType )
end
end
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, ReportTypes:Text( ", " ) ), 10 )
else
local DetectedItemsCount = self.TargetSetUnit:Count()
local DetectedItemsTypes = self.TargetSetUnit:GetTypeNames()
self:SetInfo( "Targets", string.format( "%d of %s", DetectedItemsCount, DetectedItemsTypes ), 10 )
end
end

View File

@ -121,8 +121,9 @@ do -- TASK_A2G_DISPATCHER
-- Determine if the set has radar targets. If it does, construct a SEAD task.
local GroundUnitCount = DetectedSet:HasGroundUnits()
local FriendliesNearBy = self.Detection:IsFriendliesNearBy( DetectedItem )
local RadarCount = DetectedSet:HasSEAD()
if GroundUnitCount > 0 and FriendliesNearBy == true then
if RadarCount == 0 and GroundUnitCount > 0 and FriendliesNearBy == true then
-- Copy the Set
local TargetSetUnit = SET_UNIT:New()
@ -150,8 +151,9 @@ do -- TASK_A2G_DISPATCHER
-- Determine if the set has radar targets. If it does, construct a SEAD task.
local GroundUnitCount = DetectedSet:HasGroundUnits()
local FriendliesNearBy = self.Detection:IsFriendliesNearBy( DetectedItem )
local RadarCount = DetectedSet:HasSEAD()
if GroundUnitCount > 0 and FriendliesNearBy == false then
if RadarCount == 0 and GroundUnitCount > 0 and FriendliesNearBy == false then
-- Copy the Set
local TargetSetUnit = SET_UNIT:New()
@ -164,6 +166,12 @@ do -- TASK_A2G_DISPATCHER
return nil
end
function TASK_A2G_DISPATCHER:RemoveTask( TaskIndex )
self.Mission:RemoveTask( self.Tasks[TaskIndex] )
self.Tasks[TaskIndex] = nil
end
--- Evaluates the removal of the Task from the Mission.
-- Can only occur when the DetectedItem is Changed AND the state of the Task is "Planned".
-- @param #TASK_A2G_DISPATCHER self
@ -177,8 +185,7 @@ do -- TASK_A2G_DISPATCHER
if Task then
if ( Task:IsStatePlanned() and DetectedItemChanged == true ) or Task:IsStateCancelled() then
--self:E( "Removing Tasking: " .. Task:GetTaskName() )
Mission:RemoveTask( Task )
self.Tasks[TaskIndex] = nil
self:RemoveTask( TaskIndex )
end
end
@ -213,6 +220,7 @@ do -- TASK_A2G_DISPATCHER
for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do
Mission:GetCommandCenter():MessageToGroup( string.format( "Obsolete A2G task %s for %s removed.", TaskText, Mission:GetName() ), TaskGroup )
end
Task = self:RemoveTask( TaskIndex )
Mission:RemoveTask( Task )
self.Tasks[TaskIndex] = nil
end
@ -232,10 +240,11 @@ do -- TASK_A2G_DISPATCHER
local TaskIndex = DetectedItem.Index
local DetectedItemChanged = DetectedItem.Changed
self:E( { DetectedItemChanged = DetectedItemChanged, DetectedItemID = DetectedItemID, TaskIndex = TaskIndex } )
local Task = self.Tasks[TaskIndex] -- Tasking.Task_A2G#TASK_A2G
if Task then
-- If there is a Task and the task was assigned, then we check if the task was changed ... If it was, we need to reevaluate the targets.
if Task:IsStateAssigned() then
if DetectedItemChanged == true then -- The detection has changed, thus a new TargetSet is to be evaluated and set
@ -254,24 +263,24 @@ do -- TASK_A2G_DISPATCHER
if TargetSetUnit then
if Task:IsInstanceOf( TASK_A2G_CAS ) then
Task:SetTargetSetUnit( TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
Task:UpdateTaskInfo()
TargetsReport:Add( Detection:GetChangeText( DetectedItem ) )
else
Task:Cancel()
Task = nil
self.Tasks[TaskIndex] = nil
Task = self:RemoveTask( TaskIndex )
end
else
local TargetSetUnit = self:EvaluateBAI( DetectedItem ) -- Returns a SetUnit if there are targets to be BAIed...
if TargetSetUnit then
if Task:IsInstanceOf( TASK_A2G_BAI ) then
Task:SetTargetSetUnit( TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
Task:UpdateTaskInfo()
TargetsReport:Add( Detection:GetChangeText( DetectedItem ) )
else
Task:Cancel()
Task = nil
self.Tasks[TaskIndex] = nil
Task = self:RemoveTask( TaskIndex )
end
end
end
@ -288,14 +297,56 @@ do -- TASK_A2G_DISPATCHER
end
end
Task = self:EvaluateRemoveTask( Mission, Task, TaskIndex, DetectedItemChanged ) -- Task will be removed if it is planned and changed.
if Task then
if Task:IsStatePlanned() then
if DetectedItemChanged == true then -- The detection has changed, thus a new TargetSet is to be evaluated and set
if Task:IsInstanceOf( TASK_A2G_SEAD ) then
local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
if TargetSetUnit then
Task:SetTargetSetUnit( TargetSetUnit )
Task:UpdateTaskInfo()
else
Task:Cancel()
Task = self:RemoveTask( TaskIndex )
end
else
if Task:IsInstanceOf( TASK_A2G_CAS ) then
local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be CASed...
if TargetSetUnit then
Task:SetTargetSetUnit( TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
Task:UpdateTaskInfo()
else
Task:Cancel()
Task = self:RemoveTask( TaskIndex )
end
else
if Task:IsInstanceOf( TASK_A2G_BAI ) then
local TargetSetUnit = self:EvaluateBAI( DetectedItem ) -- Returns a SetUnit if there are targets to be BAIed...
if TargetSetUnit then
Task:SetTargetSetUnit( TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
Task:UpdateTaskInfo()
else
Task:Cancel()
Task = self:RemoveTask( TaskIndex )
end
else
Task:Cancel()
Task = self:RemoveTask( TaskIndex )
end
end
end
end
end
end
-- Evaluate SEAD
if not Task then
local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed...
if TargetSetUnit then
Task = TASK_A2G_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", DetectedItemID ), TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
end
-- Evaluate CAS
@ -303,6 +354,7 @@ do -- TASK_A2G_DISPATCHER
local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be CASed...
if TargetSetUnit then
Task = TASK_A2G_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", DetectedItemID ), TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
end
-- Evaluate BAI
@ -310,6 +362,7 @@ do -- TASK_A2G_DISPATCHER
local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be BAIed...
if TargetSetUnit then
Task = TASK_A2G_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", DetectedItemID ), TargetSetUnit )
Task:SetDetection( Detection, TaskIndex )
end
end
end

View File

@ -379,7 +379,7 @@ function CONTROLLABLE:SetTask( DCSTask, WaitTime )
end
if not WaitTime or WaitTime == 0 then
self:SetTask( DCSTask )
SetTask( DCSTask )
else
self.TaskScheduler:Schedule( self, SetTask, { DCSTask }, WaitTime )
end

View File

@ -83,15 +83,8 @@ end
function IDENTIFIABLE:GetName()
self:F2( self.IdentifiableName )
local DCSIdentifiable = self:GetDCSObject()
if DCSIdentifiable then
local IdentifiableName = self.IdentifiableName
return IdentifiableName
end
self:E( self.ClassName .. " " .. self.IdentifiableName .. " not found!" )
return nil
local IdentifiableName = self.IdentifiableName
return IdentifiableName
end

View File

@ -713,7 +713,7 @@ Per one, two, three, four?</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AI_A2A_DISPATCHER).SetDefenderTask">AI_A2A_DISPATCHER:SetDefenderTask(Defender, Type, Fsm, Target)</a></td>
<td class="name" nowrap="nowrap"><a href="##(AI_A2A_DISPATCHER).SetDefenderTask">AI_A2A_DISPATCHER:SetDefenderTask(SquadronName, Defender, Type, Fsm, Target)</a></td>
<td class="summary">
</td>
@ -3895,7 +3895,7 @@ A string defining the group name of the Tanker as defined within the Mission Edi
<dt>
<a id="#(AI_A2A_DISPATCHER).SetDefenderTask" >
<strong>AI_A2A_DISPATCHER:SetDefenderTask(Defender, Type, Fsm, Target)</strong>
<strong>AI_A2A_DISPATCHER:SetDefenderTask(SquadronName, Defender, Type, Fsm, Target)</strong>
</a>
</dt>
<dd>
@ -3906,6 +3906,11 @@ A string defining the group name of the Tanker as defined within the Mission Edi
<ul>
<li>
<p><code><em> SquadronName </em></code>: </p>
</li>
<li>
<p><code><em> Defender </em></code>: </p>
</li>

View File

@ -926,9 +926,6 @@ Use the method <a href="##(AI_PATROL_ZONE).ManageDamage">AI<em>PATROL</em>ZONE.M
<p> This table contains the targets detected during patrol.</p>
</dd>
</dl>
<dl class="function">

View File

@ -164,6 +164,12 @@ each detected set of potential targets can be lased or smoked...</p>
<h2><a id="#(DESIGNATE)">Type <code>DESIGNATE</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).AddMenuLaserCode">DESIGNATE:AddMenuLaserCode(LaserCode, MenuText)</a></td>
<td class="summary">
<p>Add a specific lase code to the designate lase menu to lase targets with a specific laser code.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).AttackSet">DESIGNATE.AttackSet</a></td>
<td class="summary">
@ -185,6 +191,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).CoordinateLase">DESIGNATE:CoordinateLase()</a></td>
<td class="summary">
<p>Coordinates the Auto Lase.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).DesignateName">DESIGNATE.DesignateName</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -257,12 +269,42 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).LaserCodesUsed">DESIGNATE.LaserCodesUsed</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MarkScheduler">DESIGNATE.MarkScheduler</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MaximumDesignations">DESIGNATE.MaximumDesignations</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MaximumDistanceAirDesignation">DESIGNATE.MaximumDistanceAirDesignation</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MaximumDistanceDesignations">DESIGNATE.MaximumDistanceDesignations</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MaximumDistanceGroundDesignation">DESIGNATE.MaximumDistanceGroundDesignation</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MaximumMarkings">DESIGNATE.MaximumMarkings</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -293,6 +335,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MenuIlluminate">DESIGNATE:MenuIlluminate(Index)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MenuLaseCode">DESIGNATE:MenuLaseCode(Index, Duration, LaserCode)</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -305,6 +353,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MenuLaseOn">DESIGNATE:MenuLaseOn(Index, Duration)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MenuLaserCodes">DESIGNATE.MenuLaserCodes</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -413,6 +467,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).Recces">DESIGNATE.Recces</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).RemoveMenuLaserCode">DESIGNATE:RemoveMenuLaserCode(LaserCode)</a></td>
<td class="summary">
<p>Removes a specific lase code from the designate lase menu.</p>
</td>
</tr>
<tr>
@ -422,7 +482,7 @@ each detected set of potential targets can be lased or smoked...</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetAutoLase">DESIGNATE:SetAutoLase(AutoLase)</a></td>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetAutoLase">DESIGNATE:SetAutoLase(AutoLase, Message)</a></td>
<td class="summary">
<p>Set auto lase.</p>
</td>
@ -431,6 +491,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetDesignateMenu">DESIGNATE:SetDesignateMenu()</a></td>
<td class="summary">
<p>Sets the Designate Menu.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetDesignateName">DESIGNATE:SetDesignateName(DesignateName)</a></td>
<td class="summary">
<p>Set the name of the designation.</p>
</td>
</tr>
<tr>
@ -449,6 +515,30 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetMaximumDesignations">DESIGNATE:SetMaximumDesignations(MaximumDesignations)</a></td>
<td class="summary">
<p>Set the maximum amount of designations.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetMaximumDistanceAirDesignation">DESIGNATE:SetMaximumDistanceAirDesignation(MaximumDistanceAirDesignation)</a></td>
<td class="summary">
<p>Set the maximum air designation distance.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetMaximumDistanceDesignations">DESIGNATE:SetMaximumDistanceDesignations(MaximumDistanceDesignations)</a></td>
<td class="summary">
<p>Set the overall maximum distance when designations can be accepted.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetMaximumDistanceGroundDesignation">DESIGNATE:SetMaximumDistanceGroundDesignation(MaximumDistanceGroundDesignation)</a></td>
<td class="summary">
<p>Set the maximum ground designation distance.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetMaximumMarkings">DESIGNATE:SetMaximumMarkings(MaximumMarkings)</a></td>
<td class="summary">
<p>Set the maximum amount of markings FACs will do, per designated target group.</p>
</td>
</tr>
<tr>
@ -542,13 +632,13 @@ each detected set of potential targets can be lased or smoked...</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).onafterLaseOn">DESIGNATE:onafterLaseOn(From, Event, To, Index, Duration)</a></td>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).onafterLaseOn">DESIGNATE:onafterLaseOn(From, Event, To, Index, Duration, LaserCode)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).onafterLasing">DESIGNATE:onafterLasing(From, Event, To, Index, Duration)</a></td>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).onafterLasing">DESIGNATE:onafterLasing(From, Event, To, Index, Duration, LaserCodeRequested)</a></td>
<td class="summary">
</td>
@ -685,7 +775,7 @@ Using the menu system, the player can "forget" a designation, so that gradually
<h2>4. Laser codes</h2>
<h3>4.1 Set possible laser codes</h3>
<h3>4.1. Set possible laser codes</h3>
<p>An array of laser codes can be provided, that will be used by the DESIGNATE when lasing.
The laser code is communicated by the Recce when it is lasing a larget.
@ -705,10 +795,19 @@ One laser code can be given or an sequence of laser codes through an table...</p
<p>The above sets a collection of possible laser codes that can be assigned. <strong>Note the { } notation!</strong></p>
<h3>4.2 Auto generate laser codes</h3>
<h3>4.2. Auto generate laser codes</h3>
<p>Use the method <a href="##(DESIGNATE).GenerateLaserCodes">DESIGNATE.GenerateLaserCodes</a>() to generate all possible laser codes. Logic implemented and advised by Ciribob!</p>
<h3>4.3. Add specific lase codes to the lase menu</h3>
<p>Certain plane types can only drop laser guided ordonnance when targets are lased with specific laser codes.
The SU-25T needs targets to be lased using laser code 1113.
The A-10A needs targets to be lased using laser code 1680.</p>
<p>The method <a href="##(DESIGNATE).AddMenuLaserCode">DESIGNATE.AddMenuLaserCode</a>() to allow a player to lase a target using a specific laser code.
Remove such a lase menu option using <a href="##(DESIGNATE).RemoveMenuLaserCode">DESIGNATE.RemoveMenuLaserCode</a>().</p>
<h2>5. Autolase to automatically lase detected targets.</h2>
<p>DetectionItems can be auto lased once detected by Recces. As such, there is almost no action required from the Players using the Designate Menu.
@ -766,6 +865,47 @@ Use the method <a href="##(DESIGNATE).SetMission">DESIGNATE.SetMission</a>() to
<dl class="function">
<dt>
<a id="#(DESIGNATE).AddMenuLaserCode" >
<strong>DESIGNATE:AddMenuLaserCode(LaserCode, MenuText)</strong>
</a>
</dt>
<dd>
<p>Add a specific lase code to the designate lase menu to lase targets with a specific laser code.</p>
<p>The MenuText will appear in the lase menu.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em>#number LaserCode </em></code>:
The specific laser code to be added to the lase menu.</p>
</li>
<li>
<p><code><em>#string MenuText </em></code>:
The text to be shown to the player. If you specify a %d in the MenuText, the %d will be replaced with the LaserCode specified.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
<h3>Usage:</h3>
<pre class="example"><code> RecceDesignation:AddMenuLaserCode( 1113, "Lase with %d for Su-25T" )
RecceDesignation:AddMenuLaserCode( 1680, "Lase with %d for A-10A" )
</code></pre>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).AttackSet" >
<strong>DESIGNATE.AttackSet</strong>
@ -780,7 +920,6 @@ Use the method <a href="##(DESIGNATE).SetMission">DESIGNATE.SetMission</a>() to
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).AutoLase" >
<strong>DESIGNATE.AutoLase</strong>
</a>
@ -821,6 +960,19 @@ Use the method <a href="##(DESIGNATE).SetMission">DESIGNATE.SetMission</a>() to
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).DesignateName" >
<strong>DESIGNATE.DesignateName</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -1000,6 +1152,20 @@ function below will use the range 1-7 just in case</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).MarkScheduler" >
<strong>DESIGNATE.MarkScheduler</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -1014,6 +1180,62 @@ function below will use the range 1-7 just in case</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).MaximumDistanceAirDesignation" >
<strong>DESIGNATE.MaximumDistanceAirDesignation</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).MaximumDistanceDesignations" >
<strong>DESIGNATE.MaximumDistanceDesignations</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).MaximumDistanceGroundDesignation" >
<strong>DESIGNATE.MaximumDistanceGroundDesignation</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).MaximumMarkings" >
<strong>DESIGNATE.MaximumMarkings</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -1121,6 +1343,37 @@ function below will use the range 1-7 just in case</p>
<dl class="function">
<dt>
<a id="#(DESIGNATE).MenuLaseCode" >
<strong>DESIGNATE:MenuLaseCode(Index, Duration, LaserCode)</strong>
</a>
</dt>
<dd>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
<li>
<p><code><em> Duration </em></code>: </p>
</li>
<li>
<p><code><em> LaserCode </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).MenuLaseOff" >
<strong>DESIGNATE:MenuLaseOff(Index, Duration)</strong>
</a>
@ -1168,6 +1421,23 @@ function below will use the range 1-7 just in case</p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).MenuLaserCodes" >
<strong>DESIGNATE.MenuLaserCodes</strong>
</a>
</dt>
<dd>
<p> This map contains the laser codes that will be shown in the designate menu to lase with specific laser codes.</p>
</dd>
</dl>
<dl class="function">
@ -1710,6 +1980,37 @@ The Attack collection of GROUP objects to designate and report for.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).RemoveMenuLaserCode" >
<strong>DESIGNATE:RemoveMenuLaserCode(LaserCode)</strong>
</a>
</dt>
<dd>
<p>Removes a specific lase code from the designate lase menu.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number LaserCode </em></code>:
The specific laser code that was set to be added to the lase menu.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
<h3>Usage:</h3>
<pre class="example"><code> RecceDesignation:RemoveMenuLaserCode( 1113 )
</code></pre>
</dd>
</dl>
<dl class="function">
@ -1753,7 +2054,7 @@ The time in seconds the report should be visible.</p>
<dt>
<a id="#(DESIGNATE).SetAutoLase" >
<strong>DESIGNATE:SetAutoLase(AutoLase)</strong>
<strong>DESIGNATE:SetAutoLase(AutoLase, Message)</strong>
</a>
</dt>
<dd>
@ -1763,11 +2064,18 @@ The time in seconds the report should be visible.</p>
<p>Auto lase will start lasing targets immediately when these are in range.</p>
<h3>Parameter</h3>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em>#boolean AutoLase </em></code>: </p>
<p><code><em>#boolean AutoLase </em></code>:
(optional) true sets autolase on, false off. Default is off.</p>
</li>
<li>
<p><code><em>#boolean Message </em></code>:
(optional) true is send message, false or nil won't send a message. Default is no message sent.</p>
</li>
</ul>
@ -1794,6 +2102,36 @@ The time in seconds the report should be visible.</p>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).SetDesignateName" >
<strong>DESIGNATE:SetDesignateName(DesignateName)</strong>
</a>
</dt>
<dd>
<p>Set the name of the designation.</p>
<p>The name will appear in the menu.
This method can be used to control different designations for different plane types.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string DesignateName </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
@ -1882,6 +2220,114 @@ number> LaserCodes</p>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).SetMaximumDistanceAirDesignation" >
<strong>DESIGNATE:SetMaximumDistanceAirDesignation(MaximumDistanceAirDesignation)</strong>
</a>
</dt>
<dd>
<p>Set the maximum air designation distance.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number MaximumDistanceAirDesignation </em></code>:
Maximum air designation distance in meters.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).SetMaximumDistanceDesignations" >
<strong>DESIGNATE:SetMaximumDistanceDesignations(MaximumDistanceDesignations)</strong>
</a>
</dt>
<dd>
<p>Set the overall maximum distance when designations can be accepted.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number MaximumDistanceDesignations </em></code>:
Maximum distance in meters to accept designations.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).SetMaximumDistanceGroundDesignation" >
<strong>DESIGNATE:SetMaximumDistanceGroundDesignation(MaximumDistanceGroundDesignation)</strong>
</a>
</dt>
<dd>
<p>Set the maximum ground designation distance.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number MaximumDistanceGroundDesignation </em></code>:
Maximum ground designation distance in meters.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).SetMaximumMarkings" >
<strong>DESIGNATE:SetMaximumMarkings(MaximumMarkings)</strong>
</a>
</dt>
<dd>
<p>Set the maximum amount of markings FACs will do, per designated target group.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number MaximumMarkings </em></code>:
Maximum markings FACs will do, per designated target group.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
@ -2251,7 +2697,7 @@ The MISSION object.</p>
<dt>
<a id="#(DESIGNATE).onafterLaseOn" >
<strong>DESIGNATE:onafterLaseOn(From, Event, To, Index, Duration)</strong>
<strong>DESIGNATE:onafterLaseOn(From, Event, To, Index, Duration, LaserCode)</strong>
</a>
</dt>
<dd>
@ -2284,6 +2730,11 @@ The MISSION object.</p>
<p><code><em> Duration </em></code>: </p>
</li>
<li>
<p><code><em> LaserCode </em></code>: </p>
</li>
</ul>
</dd>
@ -2292,7 +2743,7 @@ The MISSION object.</p>
<dt>
<a id="#(DESIGNATE).onafterLasing" >
<strong>DESIGNATE:onafterLasing(From, Event, To, Index, Duration)</strong>
<strong>DESIGNATE:onafterLasing(From, Event, To, Index, Duration, LaserCodeRequested)</strong>
</a>
</dt>
<dd>
@ -2325,6 +2776,11 @@ The MISSION object.</p>
<p><code><em> Duration </em></code>: </p>
</li>
<li>
<p><code><em> LaserCodeRequested </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>

View File

@ -190,12 +190,6 @@ DETECTION uses the in-built detection capabilities of DCS World, but adds new fu
<td class="name" nowrap="nowrap"><a href="##(DETECTION_AREAS).CalculateIntercept">DETECTION_AREAS:CalculateIntercept(DetectedItem)</a></td>
<td class="summary">
<p>Calculate the optimal intercept point of the DetectedItem.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_AREAS).CalculateThreatLevelA2G">DETECTION_AREAS:CalculateThreatLevelA2G(DetectedItem)</a></td>
<td class="summary">
<p>Calculate the maxium A2G threat level of the DetectedItem.</p>
</td>
</tr>
<tr>
@ -262,18 +256,6 @@ DETECTION uses the in-built detection capabilities of DCS World, but adds new fu
<td class="name" nowrap="nowrap"><a href="##(DETECTION_AREAS).GetChangeText">DETECTION_AREAS:GetChangeText(DetectedItem)</a></td>
<td class="summary">
<p>Make text documenting the changes of the detected zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_AREAS).GetDetectedItemCoordinate">DETECTION_AREAS:GetDetectedItemCoordinate(Index)</a></td>
<td class="summary">
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_AREAS).GetTreatLevelA2G">DETECTION_AREAS:GetTreatLevelA2G(DetectedItem)</a></td>
<td class="summary">
<p>Returns the A2G threat level of the units in the DetectedItem</p>
</td>
</tr>
<tr>
@ -583,6 +565,12 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).GetDetectedItemID">DETECTION_BASE:GetDetectedItemID(Index)</a></td>
<td class="summary">
<p>Get a detected ItemID using a given numeric index.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).GetDetectedItemThreatLevel">DETECTION_BASE:GetDetectedItemThreatLevel(Index)</a></td>
<td class="summary">
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
@ -613,6 +601,12 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).GetDetectedSet">DETECTION_BASE:GetDetectedSet(Index)</a></td>
<td class="summary">
<p>Get the <a href="Set.html##(SET_UNIT)">Set#SET_UNIT</a> of a detecttion area using a given numeric index.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).GetDetectedUnitTypeName">DETECTION_BASE:GetDetectedUnitTypeName(DetectedUnit)</a></td>
<td class="summary">
<p>Gets a detected unit type name, taking into account the detection results.</p>
</td>
</tr>
<tr>
@ -643,12 +637,6 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).GetPlayersNearBy">DETECTION_BASE:GetPlayersNearBy(DetectedItem)</a></td>
<td class="summary">
<p>Returns friendly units nearby the FAC units ...</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).HasDetectedItemLOS">DETECTION_BASE:HasDetectedItemLOS(Index)</a></td>
<td class="summary">
<p>Has the detected item LOS (Line Of Sight) with one of the Recce?</p>
</td>
</tr>
<tr>
@ -865,6 +853,18 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).SetAlphaAngleProbability">DETECTION_BASE:SetAlphaAngleProbability(AlphaAngleProbability)</a></td>
<td class="summary">
<p>Upon a <strong>visual</strong> detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).SetDetectedItemCoordinate">DETECTION_BASE:SetDetectedItemCoordinate(The, Coordinate, DetectedItemUnit, DetectedItem)</a></td>
<td class="summary">
<p>Set the detected item coordinate.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).SetDetectedItemThreatLevel">DETECTION_BASE:SetDetectedItemThreatLevel(The, DetectedItem)</a></td>
<td class="summary">
<p>Set the detected item threatlevel.</p>
</td>
</tr>
<tr>
@ -995,6 +995,18 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE.DetectedItem).Changes">DETECTION_BASE.DetectedItem.Changes</a></td>
<td class="summary">
<p>A list of the changes reported on the detected area. (It is up to the user of the detected area to consume those changes).</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE.DetectedItem).Coordinate">DETECTION_BASE.DetectedItem.Coordinate</a></td>
<td class="summary">
<p>The last known coordinate of the DetectedItem.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE.DetectedItem).DistanceRecce">DETECTION_BASE.DetectedItem.DistanceRecce</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -1013,12 +1025,6 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE.DetectedItem).InterceptCoord">DETECTION_BASE.DetectedItem.InterceptCoord</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE.DetectedItem).MaxThreatLevelA2G">DETECTION_BASE.DetectedItem.MaxThreatLevelA2G</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -1031,6 +1037,12 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE.DetectedItem).Set">DETECTION_BASE.DetectedItem.Set</a></td>
<td class="summary">
<p>-- The Set of Units in the detected area.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE.DetectedItem).ThreatLevel">DETECTION_BASE.DetectedItem.ThreatLevel</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -1147,12 +1159,6 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_TYPES).GetChangeText">DETECTION_TYPES:GetChangeText(DetectedItem)</a></td>
<td class="summary">
<p>Make text documenting the changes of the detected zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_TYPES).GetDetectedItemCoordinate">DETECTION_TYPES:GetDetectedItemCoordinate(DetectedTypeName)</a></td>
<td class="summary">
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
@ -1235,12 +1241,6 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_UNITS).GetChangeText">DETECTION_UNITS:GetChangeText(DetectedItem)</a></td>
<td class="summary">
<p>Make text documenting the changes of the detected zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_UNITS).GetDetectedItemCoordinate">DETECTION_UNITS:GetDetectedItemCoordinate(Index)</a></td>
<td class="summary">
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
@ -1571,8 +1571,6 @@ a DetectedItem. The default range is 6000 meters. For air detections, it is advi
</dl>
<h2><a id="#(Detection)" >Type <code>Detection</code></a></h2>
<h2><a id="#(Core.Point)" >Type <code>Core.Point</code></a></h2>
<h2><a id="#(DETECTION_AREAS)" >Type <code>DETECTION_AREAS</code></a></h2>
<p> # 4) DETECTION_AREAS class, extends <a href="Detection.html##(DETECTION_BASE)">Detection#DETECTION_BASE</a></p>
@ -1646,27 +1644,6 @@ self</p>
<ul>
<li>
<p><code><em><a href="##(DETECTION_BASE.DetectedItem)">#DETECTION_BASE.DetectedItem</a> DetectedItem </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_AREAS).CalculateThreatLevelA2G" >
<strong>DETECTION_AREAS:CalculateThreatLevelA2G(DetectedItem)</strong>
</a>
</dt>
<dd>
<p>Calculate the maxium A2G threat level of the DetectedItem.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="##(DETECTION_BASE.DetectedItem)">#DETECTION_BASE.DetectedItem</a> DetectedItem </em></code>: </p>
</li>
@ -1911,62 +1888,6 @@ The Changes text</p>
<dl class="function">
<dt>
<a id="#(DETECTION_AREAS).GetDetectedItemCoordinate" >
<strong>DETECTION_AREAS:GetDetectedItemCoordinate(Index)</strong>
</a>
</dt>
<dd>
<p>Get the detected item coordinate.</p>
<p>In this case, the coordinate is the center of the zone of the area, not the center unit!
So if units move, the retrieved coordinate can be different from the units positions.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="Core.Point.html##(COORDINATE)">Core.Point#COORDINATE</a>:</em>
The coordinate.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_AREAS).GetTreatLevelA2G" >
<strong>DETECTION_AREAS:GetTreatLevelA2G(DetectedItem)</strong>
</a>
</dt>
<dd>
<p>Returns the A2G threat level of the units in the DetectedItem</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="##(DETECTION_BASE.DetectedItem)">#DETECTION_BASE.DetectedItem</a> DetectedItem </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#number:</em>
a scale from 0 to 10. </p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_AREAS).NearestFAC" >
<strong>DETECTION_AREAS:NearestFAC(DetectedItem)</strong>
</a>
@ -2943,7 +2864,7 @@ DetectedItemID</p>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
<p><code><em>#number Index </em></code>: </p>
</li>
</ul>
@ -2983,6 +2904,32 @@ DetectedItemID</p>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).GetDetectedItemThreatLevel" >
<strong>DETECTION_BASE:GetDetectedItemThreatLevel(Index)</strong>
</a>
</dt>
<dd>
<p>Get the detected item coordinate.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number Index </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#number:</em>
ThreatLevel</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).GetDetectedItemZone" >
<strong>DETECTION_BASE:GetDetectedItemZone(Index)</strong>
</a>
@ -3097,6 +3044,32 @@ DetectedSet</p>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).GetDetectedUnitTypeName" >
<strong>DETECTION_BASE:GetDetectedUnitTypeName(DetectedUnit)</strong>
</a>
</dt>
<dd>
<p>Gets a detected unit type name, taking into account the detection results.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> DetectedUnit </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#string:</em>
The type name</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).GetDetectionSetGroup" >
<strong>DETECTION_BASE:GetDetectionSetGroup()</strong>
</a>
@ -3219,32 +3192,6 @@ The distance. </p>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).HasDetectedItemLOS" >
<strong>DETECTION_BASE:HasDetectedItemLOS(Index)</strong>
</a>
</dt>
<dd>
<p>Has the detected item LOS (Line Of Sight) with one of the Recce?</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#boolean:</em>
true is LOS, false if no LOS.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).IdentifyDetectedObject" >
<strong>DETECTION_BASE:IdentifyDetectedObject(DetectedObject)</strong>
</a>
@ -4250,6 +4197,82 @@ The probability factor.</p>
<p><em><a href="##(DETECTION_BASE)">#DETECTION_BASE</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).SetDetectedItemCoordinate" >
<strong>DETECTION_BASE:SetDetectedItemCoordinate(The, Coordinate, DetectedItemUnit, DetectedItem)</strong>
</a>
</dt>
<dd>
<p>Set the detected item coordinate.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em><a href="##(DETECTION_BASE.DetectedItem)">#DETECTION_BASE.DetectedItem</a> The </em></code>:
DetectedItem to set the coordinate at.</p>
</li>
<li>
<p><code><em><a href="Core.Point.html##(COORDINATE)">Core.Point#COORDINATE</a> Coordinate </em></code>:
The coordinate to set the last know detected position at.</p>
</li>
<li>
<p><code><em><a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> DetectedItemUnit </em></code>:
The unit to set the heading and altitude from.</p>
</li>
<li>
<p><code><em> DetectedItem </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DETECTION_BASE)">#DETECTION_BASE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).SetDetectedItemThreatLevel" >
<strong>DETECTION_BASE:SetDetectedItemThreatLevel(The, DetectedItem)</strong>
</a>
</dt>
<dd>
<p>Set the detected item threatlevel.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em><a href="##(DETECTION_BASE.DetectedItem)">#DETECTION_BASE.DetectedItem</a> The </em></code>:
DetectedItem to calculate the threatlevel for.</p>
</li>
<li>
<p><code><em> DetectedItem </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DETECTION_BASE)">#DETECTION_BASE</a>:</em></p>
</dd>
</dl>
<dl class="function">
@ -4775,6 +4798,34 @@ The To State string.</p>
<p>A list of the changes reported on the detected area. (It is up to the user of the detected area to consume those changes).</p>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="Core.Point.html##(COORDINATE)">Core.Point#COORDINATE</a></em>
<a id="#(DETECTION_BASE.DetectedItem).Coordinate" >
<strong>DETECTION_BASE.DetectedItem.Coordinate</strong>
</a>
</dt>
<dd>
<p>The last known coordinate of the DetectedItem.</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DETECTION_BASE.DetectedItem).DistanceRecce" >
<strong>DETECTION_BASE.DetectedItem.DistanceRecce</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -4817,20 +4868,6 @@ The To State string.</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DETECTION_BASE.DetectedItem).MaxThreatLevelA2G" >
<strong>DETECTION_BASE.DetectedItem.MaxThreatLevelA2G</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -4859,6 +4896,20 @@ The To State string.</p>
<p>-- The Set of Units in the detected area.</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DETECTION_BASE.DetectedItem).ThreatLevel" >
<strong>DETECTION_BASE.DetectedItem.ThreatLevel</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -5219,32 +5270,6 @@ The Changes text</p>
<dl class="function">
<dt>
<a id="#(DETECTION_TYPES).GetDetectedItemCoordinate" >
<strong>DETECTION_TYPES:GetDetectedItemCoordinate(DetectedTypeName)</strong>
</a>
</dt>
<dd>
<p>Get the detected item coordinate.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> DetectedTypeName </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(Core.Point)">#Core.Point</a>:</em>
COORDINATE</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_TYPES).New" >
<strong>DETECTION_TYPES:New(DetectionSetGroup)</strong>
</a>
@ -5523,32 +5548,6 @@ The group to generate the report for.</p>
<p><em>#string:</em>
The Changes text</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_UNITS).GetDetectedItemCoordinate" >
<strong>DETECTION_UNITS:GetDetectedItemCoordinate(Index)</strong>
</a>
</dt>
<dd>
<p>Get the detected item coordinate.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="Core.Point.html##(COORDINATE)">Core.Point#COORDINATE</a>:</em></p>
</dd>
</dl>
<dl class="function">

View File

@ -1598,7 +1598,7 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em></em>
<em>#string</em>
<a id="#(FSM)._StartState" >
<strong>FSM._StartState</strong>
</a>
@ -1897,7 +1897,6 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em></em>
<a id="#(FSM).current" >
<strong>FSM.current</strong>
</a>

View File

@ -194,6 +194,7 @@ On top, MOOSE implements <strong>variable parameter</strong> passing for command
<hr/>
<p>The MENU<em>COMMAND</em>BASE class defines the main MENU class where other MENU COMMAND_
classes are derived from, in order to set commands.</p>
</td>
</tr>
<tr>
@ -369,6 +370,24 @@ classes are derived from, in order to set commands.</p>
<td class="name" nowrap="nowrap"><a href="##(MENU_COMMAND_BASE).New">MENU_COMMAND_BASE.New(#, self, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArguments)</a></td>
<td class="summary">
<p>Constructor</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(MENU_COMMAND_BASE).SetCommandMenuArguments">MENU_COMMAND_BASE.SetCommandMenuArguments(#, self, CommandMenuArguments)</a></td>
<td class="summary">
<p>This sets the new command arguments of a menu,
so that if a menu is regenerated, or if command arguments change,
that the arguments set for the menu are loosely coupled with the menu itself!!!
If the arguments change, no new menu needs to be generated if the menu text is the same!!!</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(MENU_COMMAND_BASE).SetCommandMenuFunction">MENU_COMMAND_BASE.SetCommandMenuFunction(#, self, CommandMenuFunction)</a></td>
<td class="summary">
<p>This sets the new command function of a menu,
so that if a menu is regenerated, or if command function changes,
that the function set for the menu is loosely coupled with the menu itself!!!
If the function changes, no new menu needs to be generated if the menu text is the same!!!</p>
</td>
</tr>
</table>
@ -729,6 +748,7 @@ Using this object reference, you can then remove ALL the menus and submenus unde
<p>The MENU<em>COMMAND</em>BASE class defines the main MENU class where other MENU COMMAND_
classes are derived from, in order to set commands.</p>
</dd>
</dl>
<dl class="function">
@ -1452,6 +1472,86 @@ ENU<em>COMMAND</em>BASE</p>
<p><em><a href="##(MENU_COMMAND_BASE)">#MENU<em>COMMAND</em>BASE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(MENU_COMMAND_BASE).SetCommandMenuArguments" >
<strong>MENU_COMMAND_BASE.SetCommandMenuArguments(#, self, CommandMenuArguments)</strong>
</a>
</dt>
<dd>
<p>This sets the new command arguments of a menu,
so that if a menu is regenerated, or if command arguments change,
that the arguments set for the menu are loosely coupled with the menu itself!!!
If the arguments change, no new menu needs to be generated if the menu text is the same!!!</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em> # </em></code>:
ENU<em>COMMAND</em>BASE</p>
</li>
<li>
<p><code><em> self </em></code>: </p>
</li>
<li>
<p><code><em> CommandMenuArguments </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(MENU_COMMAND_BASE)">#MENU<em>COMMAND</em>BASE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(MENU_COMMAND_BASE).SetCommandMenuFunction" >
<strong>MENU_COMMAND_BASE.SetCommandMenuFunction(#, self, CommandMenuFunction)</strong>
</a>
</dt>
<dd>
<p>This sets the new command function of a menu,
so that if a menu is regenerated, or if command function changes,
that the function set for the menu is loosely coupled with the menu itself!!!
If the function changes, no new menu needs to be generated if the menu text is the same!!!</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em> # </em></code>:
ENU<em>COMMAND</em>BASE</p>
</li>
<li>
<p><code><em> self </em></code>: </p>
</li>
<li>
<p><code><em> CommandMenuFunction </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(MENU_COMMAND_BASE)">#MENU<em>COMMAND</em>BASE</a>:</em></p>
</dd>
</dl>

View File

@ -544,7 +544,7 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(MISSION).ReportSummary">MISSION:ReportSummary()</a></td>
<td class="name" nowrap="nowrap"><a href="##(MISSION).ReportSummary">MISSION:ReportSummary(ReportGroup)</a></td>
<td class="summary">
<p>Create a summary report of the Mission (one line).</p>
</td>
@ -2489,13 +2489,21 @@ self</p>
<dt>
<a id="#(MISSION).ReportSummary" >
<strong>MISSION:ReportSummary()</strong>
<strong>MISSION:ReportSummary(ReportGroup)</strong>
</a>
</dt>
<dd>
<p>Create a summary report of the Mission (one line).</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a> ReportGroup </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#string:</em></p>

View File

@ -416,9 +416,15 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(COORDINATE).ToStringLL">COORDINATE:ToStringLL(Settings)</a></td>
<td class="name" nowrap="nowrap"><a href="##(COORDINATE).ToStringLLDDM">COORDINATE:ToStringLLDDM(Settings)</a></td>
<td class="summary">
<p>Provides a Lat Lon string</p>
<p>Provides a Lat Lon string in Degree Decimal Minute format.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(COORDINATE).ToStringLLDMS">COORDINATE:ToStringLLDMS(Settings)</a></td>
<td class="summary">
<p>Provides a Lat Lon string in Degree Minute Second format.</p>
</td>
</tr>
<tr>
@ -2111,13 +2117,13 @@ The coordinate Text in the configured coordinate system.</p>
<dl class="function">
<dt>
<a id="#(COORDINATE).ToStringLL" >
<strong>COORDINATE:ToStringLL(Settings)</strong>
<a id="#(COORDINATE).ToStringLLDDM" >
<strong>COORDINATE:ToStringLLDDM(Settings)</strong>
</a>
</dt>
<dd>
<p>Provides a Lat Lon string</p>
<p>Provides a Lat Lon string in Degree Decimal Minute format.</p>
<h3>Parameter</h3>
<ul>
@ -2131,7 +2137,34 @@ The coordinate Text in the configured coordinate system.</p>
<h3>Return value</h3>
<p><em>#string:</em>
The LL Text</p>
The LL DDM Text</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(COORDINATE).ToStringLLDMS" >
<strong>COORDINATE:ToStringLLDMS(Settings)</strong>
</a>
</dt>
<dd>
<p>Provides a Lat Lon string in Degree Minute Second format.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Core.Settings.html##(SETTINGS)">Core.Settings#SETTINGS</a> Settings </em></code>:
(optional) Settings</p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#string:</em>
The LL DMS Text</p>
</dd>
</dl>
@ -2829,7 +2862,6 @@ The y coordinate.</p>
<dl class="function">
<dt>
<em></em>
<a id="#(POINT_VEC2).z" >
<strong>POINT_VEC2.z</strong>
</a>

View File

@ -416,7 +416,7 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(POSITIONABLE).Smoke">POSITIONABLE:Smoke(SmokeColor, Range)</a></td>
<td class="name" nowrap="nowrap"><a href="##(POSITIONABLE).Smoke">POSITIONABLE:Smoke(SmokeColor, Range, AddHeight)</a></td>
<td class="summary">
<p>Smoke the POSITIONABLE.</p>
</td>
@ -1738,7 +1738,7 @@ self</p>
<dt>
<a id="#(POSITIONABLE).Smoke" >
<strong>POSITIONABLE:Smoke(SmokeColor, Range)</strong>
<strong>POSITIONABLE:Smoke(SmokeColor, Range, AddHeight)</strong>
</a>
</dt>
<dd>
@ -1749,12 +1749,20 @@ self</p>
<ul>
<li>
<p><code><em> SmokeColor </em></code>: </p>
<p><code><em><a href="Utilities.Utils.html##(SMOKECOLOR)">Utilities.Utils#SMOKECOLOR</a> SmokeColor </em></code>:
The color to smoke to positionable.</p>
</li>
<li>
<p><code><em> Range </em></code>: </p>
<p><code><em>#number Range </em></code>:
The range in meters to randomize the smoking around the positionable.</p>
</li>
<li>
<p><code><em>#number AddHeight </em></code>:
The height in meters to add to the altitude of the positionable.</p>
</li>
</ul>
@ -1828,6 +1836,7 @@ self</p>
<dl class="function">
<dt>
<em><a href="Core.Spot.html##(SPOT)">Core.Spot#SPOT</a></em>
<a id="#(POSITIONABLE).Spot" >
<strong>POSITIONABLE.Spot</strong>
</a>

View File

@ -172,6 +172,12 @@
<td class="name" nowrap="nowrap"><a href="##(SCHEDULER).Clear">SCHEDULER:Clear()</a></td>
<td class="summary">
<p>Clears all pending schedules.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SCHEDULER).MasterObject">SCHEDULER.MasterObject</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -414,6 +420,20 @@ The schedule will stop after <strong>300</strong> seconds.</p>
<p>Clears all pending schedules.</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(SCHEDULER).MasterObject" >
<strong>SCHEDULER.MasterObject</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">

View File

@ -4567,6 +4567,11 @@ self</p>
<p>Calculate the maxium A2G threat level of the SET_UNIT.</p>
<h3>Return value</h3>
<p><em>#number:</em>
The maximum threatlevel</p>
</dd>
</dl>
<dl class="function">

View File

@ -172,15 +172,9 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).GetLL_Accuracy">SETTINGS:GetLL_Accuracy()</a></td>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).GetLL_DDM_Accuracy">SETTINGS:GetLL_DDM_Accuracy()</a></td>
<td class="summary">
<p>Gets the SETTINGS LL accuracy.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).GetLL_DMS">SETTINGS:GetLL_DMS()</a></td>
<td class="summary">
<p>Gets the SETTINGS LL DMS.</p>
</td>
</tr>
<tr>
@ -202,9 +196,15 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).IsA2A_LL">SETTINGS:IsA2A_LL()</a></td>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).IsA2A_LL_DDM">SETTINGS:IsA2A_LL_DDM()</a></td>
<td class="summary">
<p>Is LL</p>
<p>Is LL DDM</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).IsA2A_LL_DMS">SETTINGS:IsA2A_LL_DMS()</a></td>
<td class="summary">
<p>Is LL DMS</p>
</td>
</tr>
<tr>
@ -220,9 +220,15 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).IsA2G_LL">SETTINGS:IsA2G_LL()</a></td>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).IsA2G_LL_DDM">SETTINGS:IsA2G_LL_DDM()</a></td>
<td class="summary">
<p>Is LL</p>
<p>Is LL DDM</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).IsA2G_LL_DMS">SETTINGS:IsA2G_LL_DMS()</a></td>
<td class="summary">
<p>Is LL DMS</p>
</td>
</tr>
<tr>
@ -274,13 +280,7 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).MenuGroupLL_AccuracySystem">SETTINGS:MenuGroupLL_AccuracySystem(PlayerUnit, PlayerGroup, PlayerName, LL_Accuracy)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).MenuGroupLL_DMSSystem">SETTINGS:MenuGroupLL_DMSSystem(PlayerUnit, PlayerGroup, PlayerName, LL_DMS)</a></td>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).MenuGroupLL_DDM_AccuracySystem">SETTINGS:MenuGroupLL_DDM_AccuracySystem(PlayerUnit, PlayerGroup, PlayerName, LL_Accuracy)</a></td>
<td class="summary">
</td>
@ -298,13 +298,7 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).MenuLL_Accuracy">SETTINGS:MenuLL_Accuracy(MenuGroup, RootMenu, LL_Accuracy)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).MenuLL_DMS">SETTINGS:MenuLL_DMS(MenuGroup, RootMenu, LL_DMS)</a></td>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).MenuLL_DDM_Accuracy">SETTINGS:MenuLL_DDM_Accuracy(MenuGroup, RootMenu, LL_Accuracy)</a></td>
<td class="summary">
</td>
@ -358,9 +352,15 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetA2A_LL">SETTINGS:SetA2A_LL()</a></td>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetA2A_LL_DDM">SETTINGS:SetA2A_LL_DDM()</a></td>
<td class="summary">
<p>Sets A2A LL</p>
<p>Sets A2A LL DDM</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetA2A_LL_DMS">SETTINGS:SetA2A_LL_DMS()</a></td>
<td class="summary">
<p>Sets A2A LL DMS</p>
</td>
</tr>
<tr>
@ -376,9 +376,15 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetA2G_LL">SETTINGS:SetA2G_LL()</a></td>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetA2G_LL_DDM">SETTINGS:SetA2G_LL_DDM()</a></td>
<td class="summary">
<p>Sets A2G LL</p>
<p>Sets A2G LL DDM</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetA2G_LL_DMS">SETTINGS:SetA2G_LL_DMS()</a></td>
<td class="summary">
<p>Sets A2G LL DMS</p>
</td>
</tr>
<tr>
@ -397,12 +403,6 @@
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetLL_Accuracy">SETTINGS:SetLL_Accuracy(LL_Accuracy)</a></td>
<td class="summary">
<p>Sets the SETTINGS LL accuracy.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SETTINGS).SetLL_DMS">SETTINGS:SetLL_DMS(LL_DMS)</a></td>
<td class="summary">
<p>Sets the SETTINGS LL DMS.</p>
</td>
</tr>
<tr>
@ -544,8 +544,8 @@
<dl class="function">
<dt>
<a id="#(SETTINGS).GetLL_Accuracy" >
<strong>SETTINGS:GetLL_Accuracy()</strong>
<a id="#(SETTINGS).GetLL_DDM_Accuracy" >
<strong>SETTINGS:GetLL_DDM_Accuracy()</strong>
</a>
</dt>
<dd>
@ -557,24 +557,6 @@
<p><em>#number:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).GetLL_DMS" >
<strong>SETTINGS:GetLL_DMS()</strong>
</a>
</dt>
<dd>
<p>Gets the SETTINGS LL DMS.</p>
<h3>Return value</h3>
<p><em>#number:</em></p>
</dd>
</dl>
<dl class="function">
@ -634,18 +616,36 @@ true if BULLS</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).IsA2A_LL" >
<strong>SETTINGS:IsA2A_LL()</strong>
<a id="#(SETTINGS).IsA2A_LL_DDM" >
<strong>SETTINGS:IsA2A_LL_DDM()</strong>
</a>
</dt>
<dd>
<p>Is LL</p>
<p>Is LL DDM</p>
<h3>Return value</h3>
<p><em>#boolean:</em>
true if LL</p>
true if LL DDM</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).IsA2A_LL_DMS" >
<strong>SETTINGS:IsA2A_LL_DMS()</strong>
</a>
</dt>
<dd>
<p>Is LL DMS</p>
<h3>Return value</h3>
<p><em>#boolean:</em>
true if LL DMS</p>
</dd>
</dl>
@ -688,18 +688,36 @@ true if BRA</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).IsA2G_LL" >
<strong>SETTINGS:IsA2G_LL()</strong>
<a id="#(SETTINGS).IsA2G_LL_DDM" >
<strong>SETTINGS:IsA2G_LL_DDM()</strong>
</a>
</dt>
<dd>
<p>Is LL</p>
<p>Is LL DDM</p>
<h3>Return value</h3>
<p><em>#boolean:</em>
true if LL</p>
true if LL DDM</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).IsA2G_LL_DMS" >
<strong>SETTINGS:IsA2G_LL_DMS()</strong>
</a>
</dt>
<dd>
<p>Is LL DMS</p>
<h3>Return value</h3>
<p><em>#boolean:</em>
true if LL DMS</p>
</dd>
</dl>
@ -874,8 +892,8 @@ true if metric.</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).MenuGroupLL_AccuracySystem" >
<strong>SETTINGS:MenuGroupLL_AccuracySystem(PlayerUnit, PlayerGroup, PlayerName, LL_Accuracy)</strong>
<a id="#(SETTINGS).MenuGroupLL_DDM_AccuracySystem" >
<strong>SETTINGS:MenuGroupLL_DDM_AccuracySystem(PlayerUnit, PlayerGroup, PlayerName, LL_Accuracy)</strong>
</a>
</dt>
<dd>
@ -910,42 +928,6 @@ true if metric.</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).MenuGroupLL_DMSSystem" >
<strong>SETTINGS:MenuGroupLL_DMSSystem(PlayerUnit, PlayerGroup, PlayerName, LL_DMS)</strong>
</a>
</dt>
<dd>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em> PlayerUnit </em></code>: </p>
</li>
<li>
<p><code><em> PlayerGroup </em></code>: </p>
</li>
<li>
<p><code><em> PlayerName </em></code>: </p>
</li>
<li>
<p><code><em> LL_DMS </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).MenuGroupMGRS_AccuracySystem" >
<strong>SETTINGS:MenuGroupMGRS_AccuracySystem(PlayerUnit, PlayerGroup, PlayerName, MGRS_Accuracy)</strong>
</a>
@ -1018,8 +1000,8 @@ true if metric.</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).MenuLL_Accuracy" >
<strong>SETTINGS:MenuLL_Accuracy(MenuGroup, RootMenu, LL_Accuracy)</strong>
<a id="#(SETTINGS).MenuLL_DDM_Accuracy" >
<strong>SETTINGS:MenuLL_DDM_Accuracy(MenuGroup, RootMenu, LL_Accuracy)</strong>
</a>
</dt>
<dd>
@ -1049,37 +1031,6 @@ true if metric.</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).MenuLL_DMS" >
<strong>SETTINGS:MenuLL_DMS(MenuGroup, RootMenu, LL_DMS)</strong>
</a>
</dt>
<dd>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em> MenuGroup </em></code>: </p>
</li>
<li>
<p><code><em> RootMenu </em></code>: </p>
</li>
<li>
<p><code><em> LL_DMS </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).MenuMGRS_Accuracy" >
<strong>SETTINGS:MenuMGRS_Accuracy(MenuGroup, RootMenu, MGRS_Accuracy)</strong>
</a>
@ -1263,13 +1214,31 @@ true if metric.</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).SetA2A_LL" >
<strong>SETTINGS:SetA2A_LL()</strong>
<a id="#(SETTINGS).SetA2A_LL_DDM" >
<strong>SETTINGS:SetA2A_LL_DDM()</strong>
</a>
</dt>
<dd>
<p>Sets A2A LL</p>
<p>Sets A2A LL DDM</p>
<h3>Return value</h3>
<p><em><a href="##(SETTINGS)">#SETTINGS</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).SetA2A_LL_DMS" >
<strong>SETTINGS:SetA2A_LL_DMS()</strong>
</a>
</dt>
<dd>
<p>Sets A2A LL DMS</p>
<h3>Return value</h3>
@ -1317,13 +1286,31 @@ true if metric.</p>
<dl class="function">
<dt>
<a id="#(SETTINGS).SetA2G_LL" >
<strong>SETTINGS:SetA2G_LL()</strong>
<a id="#(SETTINGS).SetA2G_LL_DDM" >
<strong>SETTINGS:SetA2G_LL_DDM()</strong>
</a>
</dt>
<dd>
<p>Sets A2G LL</p>
<p>Sets A2G LL DDM</p>
<h3>Return value</h3>
<p><em><a href="##(SETTINGS)">#SETTINGS</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).SetA2G_LL_DMS" >
<strong>SETTINGS:SetA2G_LL_DMS()</strong>
</a>
</dt>
<dd>
<p>Sets A2G LL DMS</p>
<h3>Return value</h3>
@ -1387,32 +1374,6 @@ true if metric.</p>
<p><em><a href="##(SETTINGS)">#SETTINGS</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SETTINGS).SetLL_DMS" >
<strong>SETTINGS:SetLL_DMS(LL_DMS)</strong>
</a>
</dt>
<dd>
<p>Sets the SETTINGS LL DMS.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number LL_DMS </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SETTINGS)">#SETTINGS</a>:</em></p>
</dd>
</dl>
<dl class="function">

View File

@ -822,12 +822,6 @@ and any spaces before and after the resulting name are removed.</p>
<td class="name" nowrap="nowrap"><a href="##(SPAWN)._TranslateRotate">SPAWN:_TranslateRotate(SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SPAWN).uncontrolled">SPAWN.uncontrolled</a></td>
<td class="summary">
</td>
</tr>
</table>
@ -2200,9 +2194,6 @@ The group that was spawned. You can use this group for further actions.</p>
<p> Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.</p>
</dd>
</dl>
<dl class="function">
@ -2755,9 +2746,6 @@ when nothing was spawned.</p>
<p> By default, no InitLimit</p>
</dd>
</dl>
<dl class="function">
@ -2793,7 +2781,7 @@ when nothing was spawned.</p>
<dl class="function">
<dt>
<em>#number</em>
<em></em>
<a id="#(SPAWN).SpawnMaxGroups" >
<strong>SPAWN.SpawnMaxGroups</strong>
</a>
@ -2810,7 +2798,7 @@ when nothing was spawned.</p>
<dl class="function">
<dt>
<em>#number</em>
<em></em>
<a id="#(SPAWN).SpawnMaxUnitsAlive" >
<strong>SPAWN.SpawnMaxUnitsAlive</strong>
</a>
@ -3138,7 +3126,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
<dl class="function">
<dt>
<em>#boolean</em>
<em></em>
<a id="#(SPAWN).SpawnUnControlled" >
<strong>SPAWN.SpawnUnControlled</strong>
</a>
@ -3742,20 +3730,6 @@ True = Continue Scheduler</p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(SPAWN).uncontrolled" >
<strong>SPAWN.uncontrolled</strong>
</a>
</dt>
<dd>
</dd>
</dl>

View File

@ -436,6 +436,7 @@ ptional) The name of the new static.</p>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(SPAWNSTATIC).SpawnIndex" >
<strong>SPAWNSTATIC.SpawnIndex</strong>
</a>

View File

@ -765,7 +765,6 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).ScheduleID" >
<strong>SPOT.ScheduleID</strong>
</a>
@ -779,7 +778,6 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).SpotIR" >
<strong>SPOT.SpotIR</strong>
</a>
@ -793,7 +791,6 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).SpotLaser" >
<strong>SPOT.SpotLaser</strong>
</a>
@ -807,7 +804,6 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).Target" >
<strong>SPOT.Target</strong>
</a>

View File

@ -183,6 +183,18 @@
<td class="name" nowrap="nowrap"><a href="##(TASK).CrashGroup">TASK:CrashGroup(PlayerUnit, PlayerGroup)</a></td>
<td class="summary">
<p>A PlayerUnit crashed in a Task.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK).DetectedItemIndex">TASK.DetectedItemIndex</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK).Detection">TASK.Detection</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -516,7 +528,7 @@
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK).ReportSummary">TASK:ReportSummary()</a></td>
<td class="name" nowrap="nowrap"><a href="##(TASK).ReportSummary">TASK:ReportSummary(ReportGroup)</a></td>
<td class="summary">
<p>Create a summary report of the Task.</p>
</td>
@ -537,6 +549,12 @@
<td class="name" nowrap="nowrap"><a href="##(TASK).SetBriefing">TASK:SetBriefing(TaskBriefing)</a></td>
<td class="summary">
<p>Sets a <a href="Task.html">Task</a> briefing.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK).SetDetection">TASK:SetDetection(Detection, DetectedItemIndex)</a></td>
<td class="summary">
<p>Set detection of a task</p>
</td>
</tr>
<tr>
@ -1156,6 +1174,34 @@ The CLIENT or UNIT of the Player aborting the Task.</p>
<p><em><a href="##(TASK)">#TASK</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(TASK).DetectedItemIndex" >
<strong>TASK.DetectedItemIndex</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(TASK).Detection" >
<strong>TASK.Detection</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -2344,7 +2390,7 @@ self</p>
<dt>
<a id="#(TASK).ReportSummary" >
<strong>TASK:ReportSummary()</strong>
<strong>TASK:ReportSummary(ReportGroup)</strong>
</a>
</dt>
<dd>
@ -2354,6 +2400,14 @@ self</p>
<p>List the Task Name and Status</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a> ReportGroup </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#string:</em></p>
@ -2429,6 +2483,37 @@ self</p>
<p><em><a href="##(TASK)">#TASK</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(TASK).SetDetection" >
<strong>TASK:SetDetection(Detection, DetectedItemIndex)</strong>
</a>
</dt>
<dd>
<p>Set detection of a task</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em><a href="Function.Detection.html##(DETECTION_BASE)">Function.Detection#DETECTION_BASE</a> Detection </em></code>: </p>
</li>
<li>
<p><code><em>#number DetectedItemIndex </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(TASK)">#TASK</a>:</em></p>
</dd>
</dl>
<dl class="function">

View File

@ -274,6 +274,12 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_ENGAGE).TargetSetUnit">TASK_A2A_ENGAGE.TargetSetUnit</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_ENGAGE).UpdateTaskInfo">TASK_A2A_ENGAGE:UpdateTaskInfo()</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -320,6 +326,12 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_INTERCEPT).TargetSetUnit">TASK_A2A_INTERCEPT.TargetSetUnit</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_INTERCEPT).UpdateTaskInfo">TASK_A2A_INTERCEPT:UpdateTaskInfo()</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -366,6 +378,12 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_SWEEP).TargetSetUnit">TASK_A2A_SWEEP.TargetSetUnit</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_SWEEP).UpdateTaskInfo">TASK_A2A_SWEEP:UpdateTaskInfo()</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -1069,6 +1087,19 @@ The score in points.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(TASK_A2A_ENGAGE).UpdateTaskInfo" >
<strong>TASK_A2A_ENGAGE:UpdateTaskInfo()</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -1309,6 +1340,19 @@ The score in points.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(TASK_A2A_INTERCEPT).UpdateTaskInfo" >
<strong>TASK_A2A_INTERCEPT:UpdateTaskInfo()</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -1549,6 +1593,19 @@ The score in points.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(TASK_A2A_SWEEP).UpdateTaskInfo" >
<strong>TASK_A2A_SWEEP:UpdateTaskInfo()</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">

View File

@ -199,6 +199,12 @@
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_DISPATCHER).ProcessDetected">TASK_A2A_DISPATCHER:ProcessDetected(Detection)</a></td>
<td class="summary">
<p>Assigns tasks in relation to the detected items to the <a href="Set.html##(SET_GROUP)">Set#SET_GROUP</a>.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK_A2A_DISPATCHER).RemoveTask">TASK_A2A_DISPATCHER:RemoveTask(TaskIndex)</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -760,6 +766,27 @@ Return true if you want the task assigning to continue... false will cancel the
<dl class="function">
<dt>
<a id="#(TASK_A2A_DISPATCHER).RemoveTask" >
<strong>TASK_A2A_DISPATCHER:RemoveTask(TaskIndex)</strong>
</a>
</dt>
<dd>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> TaskIndex </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(TASK_A2A_DISPATCHER).SetEngageRadius" >
<strong>TASK_A2A_DISPATCHER:SetEngageRadius(EngageRadius)</strong>
</a>

View File

@ -183,6 +183,12 @@
<td class="name" nowrap="nowrap"><a href="##(TASK_A2G_DISPATCHER).ProcessDetected">TASK_A2G_DISPATCHER:ProcessDetected(Detection)</a></td>
<td class="summary">
<p>Assigns tasks in relation to the detected items to the <a href="Set.html##(SET_GROUP)">Set#SET_GROUP</a>.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(TASK_A2G_DISPATCHER).RemoveTask">TASK_A2G_DISPATCHER:RemoveTask(TaskIndex)</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -542,6 +548,27 @@ The detection created by the <a href="Detection.html##(DETECTION_BASE)">Detectio
<p><em>#boolean:</em>
Return true if you want the task assigning to continue... false will cancel the loop.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(TASK_A2G_DISPATCHER).RemoveTask" >
<strong>TASK_A2G_DISPATCHER:RemoveTask(TaskIndex)</strong>
</a>
</dt>
<dd>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> TaskIndex </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">

View File

@ -552,7 +552,7 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<dl class="function">
<dt>
<em><a href="Core.Cargo.html##(CARGO)">Core.Cargo#CARGO</a></em>
<em><a href="Core.Cargo.html##(CARGO_GROUP)">Core.Cargo#CARGO_GROUP</a></em>
<a id="#(FSM_PROCESS).Cargo" >
<strong>FSM_PROCESS.Cargo</strong>
</a>
@ -631,7 +631,7 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<dl class="function">
<dt>
<em></em>
<em>#number</em>
<a id="#(TASK_CARGO).CargoLimit" >
<strong>TASK_CARGO.CargoLimit</strong>
</a>

View File

@ -386,6 +386,12 @@
<h2><a id="#(ZONE_GROUP)">Type <code>ZONE_GROUP</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_GROUP).GetRandomPointVec2">ZONE_GROUP:GetRandomPointVec2(inner, outer)</a></td>
<td class="summary">
<p>Returns a <a href="Point.html##(POINT_VEC2)">Point#POINT_VEC2</a> object reflecting a random 2D location within the zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_GROUP).GetRandomVec2">ZONE_GROUP:GetRandomVec2()</a></td>
<td class="summary">
<p>Returns a random location within the zone of the <a href="Group.html">Group</a>.</p>
@ -1425,6 +1431,39 @@ The smoke color.</p>
<dl class="function">
<dt>
<a id="#(ZONE_GROUP).GetRandomPointVec2" >
<strong>ZONE_GROUP:GetRandomPointVec2(inner, outer)</strong>
</a>
</dt>
<dd>
<p>Returns a <a href="Point.html##(POINT_VEC2)">Point#POINT_VEC2</a> object reflecting a random 2D location within the zone.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em>#number inner </em></code>:
(optional) Minimal distance from the center of the zone. Default is 0.</p>
</li>
<li>
<p><code><em>#number outer </em></code>:
(optional) Maximal distance from the outer edge of the zone. Default is the radius of the zone.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="Core.Point.html##(POINT_VEC2)">Core.Point#POINT_VEC2</a>:</em>
The <a href="Point.html##(POINT_VEC2)">Point#POINT_VEC2</a> object reflecting the random 3D location within the zone.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ZONE_GROUP).GetRandomVec2" >
<strong>ZONE_GROUP:GetRandomVec2()</strong>
</a>