Got engage working from the air. Now I need to fix:

- Overhead
- Correct Defense Type assignment to engage.
This commit is contained in:
FlightControl 2018-11-08 07:38:04 +01:00
parent 0e656c8520
commit e7181c255b
3 changed files with 62 additions and 27 deletions

View File

@ -325,53 +325,53 @@ do -- AI_A2G_DISPATCHER
self:AddTransition( "*", "Defend", "*" )
--- GCI Handler OnBefore for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnBeforeGCI
--- Defend Handler OnBefore for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnBeforeDefend
-- @param #AI_A2G_DISPATCHER self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @return #boolean
--- GCI Handler OnAfter for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnAfterGCI
--- Defend Handler OnAfter for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnAfterDefend
-- @param #AI_A2G_DISPATCHER self
-- @param #string From
-- @param #string Event
-- @param #string To
--- GCI Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] GCI
--- Defend Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] Defend
-- @param #AI_A2G_DISPATCHER self
--- GCI Asynchronous Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] __GCI
--- Defend Asynchronous Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] __Defend
-- @param #AI_A2G_DISPATCHER self
-- @param #number Delay
self:AddTransition( "*", "ENGAGE", "*" )
self:AddTransition( "*", "Engage", "*" )
--- ENGAGE Handler OnBefore for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnBeforeENGAGE
--- Engage Handler OnBefore for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnBeforeEngage
-- @param #AI_A2G_DISPATCHER self
-- @param #string From
-- @param #string Event
-- @param #string To
-- @return #boolean
--- ENGAGE Handler OnAfter for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnAfterENGAGE
--- Engage Handler OnAfter for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] OnAfterEngage
-- @param #AI_A2G_DISPATCHER self
-- @param #string From
-- @param #string Event
-- @param #string To
--- ENGAGE Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] ENGAGE
--- Engage Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] Engage
-- @param #AI_A2G_DISPATCHER self
--- ENGAGE Asynchronous Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] __ENGAGE
--- Engage Asynchronous Trigger for AI_A2G_DISPATCHER
-- @function [parent=#AI_A2G_DISPATCHER] __Engage
-- @param #AI_A2G_DISPATCHER self
-- @param #number Delay
@ -618,7 +618,7 @@ do -- AI_A2G_DISPATCHER
--
function AI_A2G_DISPATCHER:SetDefenseRadius( DefenseRadius )
self.DefenseRadius = DefenseRadius or 40000
self.DefenseRadius = DefenseRadius or 100000
return self
end
@ -765,7 +765,24 @@ do -- AI_A2G_DISPATCHER
-- @return #table A list of the defender friendlies nearby, sorted by distance.
function AI_A2G_DISPATCHER:GetDefenderFriendliesNearBy( DetectedItem )
local DefenderFriendliesNearBy = self.Detection:GetFriendliesDistance( DetectedItem )
-- local DefenderFriendliesNearBy = self.Detection:GetFriendliesDistance( DetectedItem )
local DefenderFriendliesNearBy = {}
local DetectionCoordinate = self.Detection:GetDetectedItemCoordinate( DetectedItem )
local ScanZone = ZONE_RADIUS:New( "ScanZone", DetectionCoordinate:GetVec2(), self.DefenseRadius )
ScanZone:Scan( Object.Category.UNIT, { Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } )
local DefenderUnits = ScanZone:GetScannedUnits()
for DefenderUnitID, DefenderUnit in pairs( DefenderUnits ) do
local DefenderUnit = UNIT:FindByName( DefenderUnit:getName() )
DefenderFriendliesNearBy[#DefenderFriendliesNearBy+1] = DefenderUnit
end
return DefenderFriendliesNearBy
end
@ -1154,7 +1171,7 @@ do -- AI_A2G_DISPATCHER
if DefenderSquadron.Captured == false then -- We can only spawn new defense if the home airbase has not been captured.
if ( not DefenderSquadron.ResourceCount ) or ( DefenderSquadron.ResourceCount and DefenderSquadron.ResourceCount > 0 ) then -- And, if there are sufficient resources.
if DefenderSquadron[DefenseTaskType] and DefenderSquadron[DefenseTaskType].Defend == true then
if DefenderSquadron[DefenseTaskType] and ( DefenderSquadron[DefenseTaskType].Defend == true ) then
return DefenderSquadron, DefenderSquadron[DefenseTaskType]
end
end
@ -2381,7 +2398,7 @@ do -- AI_A2G_DISPATCHER
if Defenders then
for DefenderID, Defender in pairs( Defenders ) do
for DefenderID, Defender in pairs( Defenders or {} ) do
local Fsm = self:GetDefenderTaskFsm( Defender )
Fsm:__Engage( 1, AttackerDetection.Set ) -- Engage on the TargetSetUnit

View File

@ -417,7 +417,7 @@ function AI_A2G_PATROL:onafterEngage( AIPatrol, From, Event, To, AttackSetUnit )
for AttackUnitID, AttackUnit in pairs( self.AttackSetUnit:GetSet() ) do
local AttackUnit = AttackUnit -- Wrapper.Unit#UNIT
self:T( { "Attacking Unit:", AttackUnit:GetName(), AttackUnit:IsAlive(), AttackUnit:IsAir() } )
if AttackUnit:IsAlive() and AttackUnit:IsAir() then
if AttackUnit:IsAlive() and AttackUnit:IsGround() then
AttackTasks[#AttackTasks+1] = AIPatrol:TaskAttackUnit( AttackUnit )
end
end

View File

@ -618,6 +618,9 @@ function ZONE_RADIUS:GetVec3( Height )
end
--- Scan the zone for the presence of units of the given ObjectCategories.
-- Note that after a zone has been scanned, the zone can be evaluated by:
--
@ -629,11 +632,11 @@ end
-- @{#ZONE_RADIUS.
-- @param #ZONE_RADIUS self
-- @param ObjectCategories
-- @param Coalition
-- @param UnitCategories
-- @usage
-- self.Zone:Scan()
-- local IsAttacked = self.Zone:IsSomeInZoneOfCoalition( self.Coalition )
function ZONE_RADIUS:Scan( ObjectCategories )
function ZONE_RADIUS:Scan( ObjectCategories, UnitCategories )
self.ScanData = {}
self.ScanData.Coalitions = {}
@ -660,9 +663,24 @@ function ZONE_RADIUS:Scan( ObjectCategories )
if ( ObjectCategory == Object.Category.UNIT and ZoneObject:isExist() and ZoneObject:isActive() ) or
(ObjectCategory == Object.Category.STATIC and ZoneObject:isExist()) then
local CoalitionDCSUnit = ZoneObject:getCoalition()
self.ScanData.Coalitions[CoalitionDCSUnit] = true
self.ScanData.Units[ZoneObject] = ZoneObject
self:F2( { Name = ZoneObject:getName(), Coalition = CoalitionDCSUnit } )
local Include = false
if not UnitCategories then
Include = true
else
local CategoryDCSUnit = ZoneObject:getDesc().category
for UnitCategoryID, UnitCategory in pairs( UnitCategories ) do
if UnitCategory == CategoryDCSUnit then
Include = true
break
end
end
end
if Include then
local CoalitionDCSUnit = ZoneObject:getCoalition()
self.ScanData.Coalitions[CoalitionDCSUnit] = true
self.ScanData.Units[ZoneObject] = ZoneObject
self:F2( { Name = ZoneObject:getName(), Coalition = CoalitionDCSUnit } )
end
end
if ObjectCategory == Object.Category.SCENERY then
local SceneryType = ZoneObject:getTypeName()