Updates for visibility of squadrons before start.

This commit is contained in:
FlightControl
2018-10-24 20:55:04 +02:00
parent 52069cc1d0
commit 17ffc7cef9
2 changed files with 109 additions and 73 deletions

View File

@@ -502,9 +502,10 @@ function AI_A2A:onafterStatus()
if RTB == true then if RTB == true then
self:__RTB( 0.5 ) self:__RTB( 0.5 )
else
self:__Status( 10 )
end end
self:__Status( 10 )
end end
end end

View File

@@ -1030,26 +1030,29 @@ do -- AI_A2A_DISPATCHER
for SquadronName, DefenderSquadron in pairs( self.DefenderSquadrons ) do for SquadronName, DefenderSquadron in pairs( self.DefenderSquadrons ) do
DefenderSquadron.Resource = {} DefenderSquadron.Resource = {}
for Resource = 1, DefenderSquadron.ResourceCount do for Resource = 1, DefenderSquadron.ResourceCount do
local TemplateID = math.random( 1, #DefenderSquadron.Spawn ) self:ParkDefender( DefenderSquadron )
local Spawn = DefenderSquadron.Spawn[ TemplateID ] -- Core.Spawn#SPAWN
Spawn:InitGrouping( 1 )
local SpawnGroup
if DefenderSquadron.Uncontrolled then
SpawnGroup = Spawn:SpawnAtAirbase( DefenderSquadron.Airbase, SPAWN.Takeoff.Cold )
else
Spawn:InitLateActivated( true )
SpawnGroup = Spawn:SpawnAtAirbase( DefenderSquadron.Airbase, SPAWN.Takeoff.Cold )
end
local GroupName = SpawnGroup:GetName()
DefenderSquadron.Resources = DefenderSquadron.Resources or {}
DefenderSquadron.Resources[TemplateID] = DefenderSquadron.Resources[TemplateID] or {}
DefenderSquadron.Resources[TemplateID][GroupName] = {}
DefenderSquadron.Resources[TemplateID][GroupName] = SpawnGroup
end end
end end
end end
--- @param #AI_A2A_DISPATCHER self
function AI_A2A_DISPATCHER:ParkDefender( DefenderSquadron )
local TemplateID = math.random( 1, #DefenderSquadron.Spawn )
local Spawn = DefenderSquadron.Spawn[ TemplateID ] -- Core.Spawn#SPAWN
Spawn:InitGrouping( 1 )
local SpawnGroup
if self:IsSquadronVisible( DefenderSquadron.Name ) then
SpawnGroup = Spawn:SpawnAtAirbase( DefenderSquadron.Airbase, SPAWN.Takeoff.Cold )
local GroupName = SpawnGroup:GetName()
DefenderSquadron.Resources = DefenderSquadron.Resources or {}
DefenderSquadron.Resources[TemplateID] = DefenderSquadron.Resources[TemplateID] or {}
DefenderSquadron.Resources[TemplateID][GroupName] = {}
DefenderSquadron.Resources[TemplateID][GroupName] = SpawnGroup
end
end
--- @param #AI_A2A_DISPATCHER self --- @param #AI_A2A_DISPATCHER self
-- @param Core.Event#EVENTDATA EventData -- @param Core.Event#EVENTDATA EventData
function AI_A2A_DISPATCHER:OnEventBaseCaptured( EventData ) function AI_A2A_DISPATCHER:OnEventBaseCaptured( EventData )
@@ -1090,6 +1093,7 @@ do -- AI_A2A_DISPATCHER
self:RemoveDefenderFromSquadron( Squadron, Defender ) self:RemoveDefenderFromSquadron( Squadron, Defender )
end end
DefenderUnit:Destroy() DefenderUnit:Destroy()
self:ParkDefender( Squadron, Defender )
return return
end end
if DefenderUnit:GetLife() ~= DefenderUnit:GetLife0() then if DefenderUnit:GetLife() ~= DefenderUnit:GetLife0() then
@@ -1116,6 +1120,7 @@ do -- AI_A2A_DISPATCHER
self:RemoveDefenderFromSquadron( Squadron, Defender ) self:RemoveDefenderFromSquadron( Squadron, Defender )
end end
DefenderUnit:Destroy() DefenderUnit:Destroy()
self:ParkDefender( Squadron, Defender )
end end
end end
end end
@@ -1607,6 +1612,29 @@ do -- AI_A2A_DISPATCHER
end end
--- Check if the Squadron is visible before startup of the dispatcher.
-- @param #AI_A2A_DISPATCHER self
-- @param #string SquadronName The squadron name.
-- @return #bool true if visible.
-- @usage
--
-- -- Set the Squadron visible before startup of dispatcher.
-- local IsVisible = A2ADispatcher:IsSquadronVisible( "Mineralnye" )
--
function AI_A2A_DISPATCHER:IsSquadronVisible( SquadronName )
self.DefenderSquadrons[SquadronName] = self.DefenderSquadrons[SquadronName] or {}
local DefenderSquadron = self:GetSquadron( SquadronName )
if DefenderSquadron then
return DefenderSquadron.Uncontrolled == true
end
return nil
end
--- Set a CAP for a Squadron. --- Set a CAP for a Squadron.
-- @param #AI_A2A_DISPATCHER self -- @param #AI_A2A_DISPATCHER self
-- @param #string SquadronName The squadron name. -- @param #string SquadronName The squadron name.
@@ -2705,57 +2733,75 @@ do -- AI_A2A_DISPATCHER
--- ---
-- @param #AI_A2A_DISPATCHER self -- @param #AI_A2A_DISPATCHER self
function AI_A2A_DISPATCHER:ResourceActivate( DefenderSquadron ) function AI_A2A_DISPATCHER:ResourceActivate( DefenderSquadron, DefendersNeeded )
local SquadronName = DefenderSquadron.Name local SquadronName = DefenderSquadron.Name
DefendersNeeded = DefendersNeeded or 4
-- Here we CAP the new planes.
-- The Resources table is filled in advance.
local TemplateID = math.random( 1, #DefenderSquadron.Spawn ) -- Choose the template.
-- We determine the grouping based on the parameters set.
local DefenderGrouping = DefenderSquadron.Grouping or self.DefenderDefault.Grouping local DefenderGrouping = DefenderSquadron.Grouping or self.DefenderDefault.Grouping
self:F( { DefenderGrouping = DefenderGrouping } ) DefenderGrouping = ( DefenderGrouping < DefendersNeeded ) and DefenderGrouping or DefendersNeeded
--Spawn:InitGrouping( DefenderGrouping )
-- New we will form the group to spawn in. if self:IsSquadronVisible( SquadronName ) then
-- We search for the first free resource matching the template.
local DefenderUnitIndex = 1 -- Here we CAP the new planes.
local DefenderCAPTemplate = nil -- The Resources table is filled in advance.
local DefenderName = nil local TemplateID = math.random( 1, #DefenderSquadron.Spawn ) -- Choose the template.
for GroupName, DefenderGroup in pairs( DefenderSquadron.Resources[TemplateID] or {} ) do
self:F( { GroupName = GroupName } ) -- We determine the grouping based on the parameters set.
local DefenderTemplate = _DATABASE:GetGroupTemplate( GroupName ) self:F( { DefenderGrouping = DefenderGrouping } )
if DefenderUnitIndex == 1 then
DefenderCAPTemplate = UTILS.DeepCopy( DefenderTemplate ) -- New we will form the group to spawn in.
self.DefenderCAPIndex = self.DefenderCAPIndex + 1 -- We search for the first free resource matching the template.
DefenderCAPTemplate.name = SquadronName .. "#" .. self.DefenderCAPIndex .. "#" .. GroupName local DefenderUnitIndex = 1
DefenderName = DefenderCAPTemplate.name local DefenderCAPTemplate = nil
else local DefenderName = nil
-- Add the unit in the template to the DefenderCAPTemplate. for GroupName, DefenderGroup in pairs( DefenderSquadron.Resources[TemplateID] or {} ) do
local DefenderUnitTemplate = DefenderTemplate.units[1] self:F( { GroupName = GroupName } )
DefenderCAPTemplate.units[DefenderUnitIndex] = DefenderUnitTemplate local DefenderTemplate = _DATABASE:GetGroupTemplate( GroupName )
if DefenderUnitIndex == 1 then
DefenderCAPTemplate = UTILS.DeepCopy( DefenderTemplate )
self.DefenderCAPIndex = self.DefenderCAPIndex + 1
DefenderCAPTemplate.name = SquadronName .. "#" .. self.DefenderCAPIndex .. "#" .. GroupName
DefenderName = DefenderCAPTemplate.name
else
-- Add the unit in the template to the DefenderCAPTemplate.
local DefenderUnitTemplate = DefenderTemplate.units[1]
DefenderCAPTemplate.units[DefenderUnitIndex] = DefenderUnitTemplate
end
DefenderUnitIndex = DefenderUnitIndex + 1
DefenderSquadron.Resources[TemplateID][GroupName] = nil
if DefenderUnitIndex > DefenderGrouping then
break
end
end
if DefenderCAPTemplate then
local TakeoffMethod = self:GetSquadronTakeoff( SquadronName )
local SpawnGroup = GROUP:Register( DefenderName )
DefenderCAPTemplate.lateActivation = nil
DefenderCAPTemplate.uncontrolled = nil
local Takeoff = self:GetSquadronTakeoff( SquadronName )
DefenderCAPTemplate.route.points[1].type = GROUPTEMPLATE.Takeoff[Takeoff][1] -- type
DefenderCAPTemplate.route.points[1].action = GROUPTEMPLATE.Takeoff[Takeoff][2] -- action
local Defender = _DATABASE:Spawn( DefenderCAPTemplate )
self:AddDefenderToSquadron( DefenderSquadron, Defender, DefenderGrouping )
return Defender, DefenderGrouping
end end
DefenderUnitIndex = DefenderUnitIndex + 1 else
DefenderSquadron.Resources[TemplateID][GroupName] = nil local Spawn = DefenderSquadron.Spawn[ math.random( 1, #DefenderSquadron.Spawn ) ] -- Core.Spawn#SPAWN
if DefenderUnitIndex > DefenderGrouping then if DefenderGrouping then
break Spawn:InitGrouping( DefenderGrouping )
else
Spawn:InitGrouping()
end end
end local TakeoffMethod = self:GetSquadronTakeoff( SquadronName )
local Defender = Spawn:SpawnAtAirbase( DefenderSquadron.Airbase, TakeoffMethod, DefenderSquadron.TakeoffAltitude or self.DefenderDefault.TakeoffAltitude ) -- Wrapper.Group#GROUP
local TakeoffMethod = self:GetSquadronTakeoff( SquadronName ) return Defender, DefenderGrouping
local SpawnGroup = GROUP:Register( DefenderName ) end
DefenderCAPTemplate.lateActivation = nil
DefenderCAPTemplate.uncontrolled = nil
local Takeoff = self:GetSquadronTakeoff( SquadronName )
DefenderCAPTemplate.route.points[1].type = GROUPTEMPLATE.Takeoff[Takeoff][1] -- type
DefenderCAPTemplate.route.points[1].action = GROUPTEMPLATE.Takeoff[Takeoff][2] -- action
local Defender = _DATABASE:Spawn( DefenderCAPTemplate )
self:AddDefenderToSquadron( DefenderSquadron, Defender, DefenderGrouping )
return Defender, DefenderGrouping return nil, nil
end end
--- ---
@@ -2824,9 +2870,9 @@ do -- AI_A2A_DISPATCHER
if Dispatcher:GetSquadronLanding( Squadron.Name ) == AI_A2A_DISPATCHER.Landing.NearAirbase then if Dispatcher:GetSquadronLanding( Squadron.Name ) == AI_A2A_DISPATCHER.Landing.NearAirbase then
Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender ) Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender )
Defender:Destroy() Defender:Destroy()
self:ParkDefender( Squadron, Defender )
end end
end end
end end
end end
end end
@@ -2941,19 +2987,7 @@ do -- AI_A2A_DISPATCHER
while ( DefendersNeeded > 0 ) do while ( DefendersNeeded > 0 ) do
local DefenderGCI, DefenderGrouping = self:ResourceActivate( DefenderSquadron ) local DefenderGCI, DefenderGrouping = self:ResourceActivate( DefenderSquadron, DefendersNeeded )
-- local Spawn = DefenderSquadron.Spawn[ math.random( 1, #DefenderSquadron.Spawn ) ] -- Core.Spawn#SPAWN
-- local DefenderGrouping = ( DefenderGrouping < DefendersNeeded ) and DefenderGrouping or DefendersNeeded
-- if DefenderGrouping then
-- Spawn:InitGrouping( DefenderGrouping )
-- else
-- Spawn:InitGrouping()
-- end
--
-- local TakeoffMethod = self:GetSquadronTakeoff( ClosestDefenderSquadronName )
-- local DefenderGCI = Spawn:SpawnAtAirbase( DefenderSquadron.Airbase, TakeoffMethod, DefenderSquadron.TakeoffAltitude or self.DefenderDefault.TakeoffAltitude ) -- Wrapper.Group#GROUP
-- self:F( { GCIDefender = DefenderGCI:GetName() } )
DefendersNeeded = DefendersNeeded - DefenderGrouping DefendersNeeded = DefendersNeeded - DefenderGrouping
@@ -3023,6 +3057,7 @@ do -- AI_A2A_DISPATCHER
if Dispatcher:GetSquadronLanding( Squadron.Name ) == AI_A2A_DISPATCHER.Landing.NearAirbase then if Dispatcher:GetSquadronLanding( Squadron.Name ) == AI_A2A_DISPATCHER.Landing.NearAirbase then
Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender ) Dispatcher:RemoveDefenderFromSquadron( Squadron, Defender )
Defender:Destroy() Defender:Destroy()
self:ParkDefender( Squadron, Defender )
end end
end end
end -- if DefenderGCI then end -- if DefenderGCI then