-- ***************************************************************************** -- ** CAPZone War ** -- ********************************************************* function toggleDebugCapWarZone(objCapWarZone) objCapWarZone.objDispatcher:SetTacticalDisplay(not(objCapWarZone.objDispatcher.TacticalDisplay)) end function wipeCapWarZone(objCapWarZone) jtff_log.info(string.format("%s Zone Stopping...", objCapWarZone.customconfig.name),"CAP_WAR_ZONE") --TODO: remove all drawings generated by CAPSquadrons objCapWarZone.objDispatcher:SetTacticalDisplay(false) objCapWarZone.objDispatcher:Stop() objCapWarZone.objDispatcher = nil objCapWarZone.objDetectionAreas = nil objCapWarZone.objEWRNetwork = nil objCapWarZone.objMenu:RemoveSubMenus() MENU_MISSION_COMMAND:New( "Start ".. objCapWarZone.customconfig.name .. " CAP War Zone", objCapWarZone.objMenu, startCapWarZone, objCapWarZone) trigger.action.outText('CAP War Zone '..(objCapWarZone.customconfig.name)..' disabled !!', 30) end function startCapWarZone(objCapWarZone) jtff_log.info(string.format("%s Zone Starting...", objCapWarZone.customconfig.name),"CAP_WAR_ZONE") objCapWarZone.objEWRNetwork = SET_GROUP:New() objCapWarZone.objEWRNetwork:FilterPrefixes(objCapWarZone.customconfig.ewrPrefixes) objCapWarZone.objEWRNetwork:FilterStart() objCapWarZone.objDetectionAreas = DETECTION_AREAS:New( objCapWarZone.objEWRNetwork, UTILS.NMToMeters(objCapWarZone.customconfig.detectionGroupingRadius or UTILS.MetersToNM(30000))) objCapWarZone.objDispatcher = AI_A2A_DISPATCHER:New( objCapWarZone.objDetectionAreas ) objCapWarZone.objDispatcher:SetBorderZone(objCapWarZone.objZone) objCapWarZone.objDispatcher:SetEngageRadius(UTILS.NMToMeters(objCapWarZone.customconfig.engageRadius or UTILS.MetersToNM(100000))) objCapWarZone.objDispatcher:SetGciRadius(UTILS.NMToMeters(objCapWarZone.customconfig.gciRadius or UTILS.MetersToNM(200000))) objCapWarZone.objDispatcher:SetDefaultTakeoffFromParkingHot() objCapWarZone.objDispatcher:SetDefaultLandingAtRunway() objCapWarZone.objDispatcher:SetDefaultFuelThreshold(0.30) objCapWarZone.objDispatcher:SetDefaultCapRacetrack( UTILS.NMToMeters(20), UTILS.NMToMeters(40), 0, 180, 15*60, 45*60 ) objCapWarZone.objDispatcher:SetDefaultOverhead(objCapWarZone.customconfig.overhead or 1) for indexbase, capbaseconfig in ipairs(objCapWarZone.customconfig.CAPBases) do jtff_log.info(string.format("Activating all Squadrons stationed at %s...", capbaseconfig.baseName),"CAP_WAR_ZONE") for indexcapsqn, capsqnconfig in ipairs(capbaseconfig.patrolSquadrons) do local CAPSquadronName = "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn if capsqnconfig.enable then jtff_log.info(string.format("Activating CAP Squadron %s (based on %s) at %s...", CAPSquadronName, capsqnconfig.groupName, capbaseconfig.baseName),"CAP_WAR_ZONE") if AIRBASE:FindByName(capbaseconfig.baseName) then --baseName is Airbase objCapWarZone.objDispatcher:SetSquadron( CAPSquadronName, capbaseconfig.baseName, capsqnconfig.groupName, capsqnconfig.groupNumber * capsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronGrouping( CAPSquadronName, capsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronTakeoffFromParkingHot( CAPSquadronName ) else --baseName is not an Airbase --> Airstart objCapWarZone.objDispatcher:SetSquadron( CAPSquadronName, capbaseconfig.baseName, capsqnconfig.groupName, capsqnconfig.groupNumber * capsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronGrouping( CAPSquadronName, capsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronTakeoffInAir( CAPSquadronName, UTILS.FeetToMeters(20000) ) end if ( (capsqnconfig.overhead or 0 ) > 0) then objCapWarZone.objDispatcher:SetSquadronOverhead(CAPSquadronName, capsqnconfig.overhead) end function objCapWarZone.objDispatcher:OnEventBirth(eventData) local unit = UNIT:Find(eventData.initiator) if (objCapWarZone.customconfig.fireRange) then unit:OptionAAAttackRange(objCapWarZone.customconfig.fireRange) else unit:OptionAAAttackRange(AAMAxRange.TARGET_THREAT_EST) end unit:OptionROT(ENUMS.ROT.EvadeFire) end local CapZone = nil local CapZoneName = nil if capsqnconfig.patrolZoneName then if capsqnconfig.patrolZoneGroupName then CapZone = ZONE_POLYGON:New(capsqnconfig.patrolZoneGroupName, GROUP:FindByName(capsqnconfig.patrolZoneGroupName)) CapZoneName = capsqnconfig.patrolZoneGroupName else CapZone = ZONE:New(capsqnconfig.patrolZoneName) CapZoneName = capsqnconfig.patrolZoneName end else if capsqnconfig.patrolZoneGroupName then CapZone = ZONE_POLYGON:New(capsqnconfig.patrolZoneGroupName, GROUP:FindByName(capsqnconfig.patrolZoneGroupName)) CapZoneName = capsqnconfig.patrolZoneGroupName else CapZone = objCapWarZone.objZone --CapZoneName = objCapWarZone.objZone:GetName() CapZoneName = "unknown" end end if objCapWarZone.customconfig.coalitionCAP == coalition.side.RED then if ((objCapWarZone.customconfig.drawzone == true) or false) then CapZone:DrawZone( coalition.side.BLUE, {1,0,1}, 1, {1,0,1}, 0.10, 4, true, nil ) CapZone:GetCoordinate():TextToAll( "CAP Warzone " .. objCapWarZone.customconfig.name, coalition.side.BLUE, {1,0,0}, 1, {1,0,0}, 0, 20, true ) end else if ((objCapWarZone.customconfig.drawzone == true) or false) then CapZone:DrawZone( coalition.side.RED, {1,0,1}, 1, {1,0,1}, 0.10, 4, true, nil ) CapZone:GetCoordinate():TextToAll( "CAP Warzone " .. objCapWarZone.customconfig.name, coalition.side.RED, {1,0,0}, 1, {1,0,0}, 0, 20, true ) end end jtff_log.info(string.format("Assigned Squadron %s to %s patrol Zone...", CAPSquadronName, CapZoneName),"CAP_WAR_ZONE") objCapWarZone.objDispatcher:SetSquadronCap( CAPSquadronName, CapZone, UTILS.FeetToMeters(objCapWarZone.customconfig.capParameters.patrolFloor) or UTILS.FeetToMeters(20000), UTILS.FeetToMeters(objCapWarZone.customconfig.capParameters.patrolCeiling) or UTILS.FeetToMeters(50000), UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.minPatrolSpeed) or UTILS.KnotsToKmph(200), UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.maxPatrolSpeed) or UTILS.KnotsToKmph(400), UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.minEngageSpeed) or UTILS.KnotsToKmph(200), UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.maxEngageSpeed) or UTILS.KnotsToKmph(2000), "BARO" ) jtff_log.info(string.format("start CAP Squadron %s (%s)...", CAPSquadronName, capsqnconfig.groupName),"CAP_WAR_ZONE") objCapWarZone.objDispatcher:SetSquadronCapInterval( CAPSquadronName, capsqnconfig.patrolInAirNumber, 8*60, 13*60, 1 ) end end for indexinterceptsqn, interceptsqnconfig in ipairs(capbaseconfig.interceptSquadrons) do if interceptsqnconfig.enable then local interceptSquadronName = "GCI-"..capbaseconfig.baseName.."-"..indexinterceptsqn jtff_log.info(string.format("Activating GCI Squadron %s (based on %s) at %s...", interceptSquadronName, interceptsqnconfig.groupName, capbaseconfig.baseName),"CAP_WAR_ZONE") if AIRBASE:FindByName(capbaseconfig.baseName) then --baseName is Airbase objCapWarZone.objDispatcher:SetSquadron( interceptSquadronName, capbaseconfig.baseName, interceptsqnconfig.groupName, interceptsqnconfig.groupNumber * interceptsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronGrouping( interceptSquadronName, interceptsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronTakeoffFromRunway( interceptSquadronName ) else --baseName is not an Airbase --> Airstart objCapWarZone.objDispatcher:SetSquadron( interceptSquadronName, capbaseconfig.baseName, interceptsqnconfig.groupName, interceptsqnconfig.groupNumber * interceptsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronGrouping( interceptSquadronName, interceptsqnconfig.groupForce ) objCapWarZone.objDispatcher:SetSquadronTakeoffInAir( interceptSquadronName, UTILS.FeetToMeters(20000) ) end jtff_log.info(string.format("Assigned Squadron %s to GCI mission...", interceptSquadronName),"CAP_WAR_ZONE") if ( ( interceptsqnconfig.overhead or 0 ) > 0) then objCapWarZone.objDispatcher:SetSquadronOverhead(interceptSquadronName, interceptsqnconfig.overhead) end objCapWarZone.objDispatcher:SetSquadronGci( interceptSquadronName, UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.minEngageSpeed) or UTILS.KnotsToKmph(200), UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.maxEngageSpeed) or UTILS.KnotsToKmph(5000) ) end end end objCapWarZone.objDispatcher:SetTacticalDisplay(objCapWarZone.customconfig.debug or false) objCapWarZone.objMenu:RemoveSubMenus() MENU_MISSION_COMMAND:New( "Stop ".. objCapWarZone.customconfig.name .. " CAP War Zone", objCapWarZone.objMenu, wipeCapWarZone, objCapWarZone ) MENU_MISSION_COMMAND:New( "Toggle Display Status ".. objCapWarZone.customconfig.name .. " CAP War Zone", objCapWarZone.objMenu, toggleDebugCapWarZone, objCapWarZone ) end CAPWarZoneArray = {} compteur = 0 MenuCoalitionCAPWarZone = MENU_MISSION:New("CAP War Zones", nil) for index, capwarzoneconfig in ipairs(WarCAPConfig) do if capwarzoneconfig.enable == true and #(capwarzoneconfig.ewrPrefixes) > 0 then compteur = compteur + 1 jtff_log.info(string.format("%s Zone creation...", capwarzoneconfig.name),"CAP_WAR_ZONE") objCapWarZone = {} if capwarzoneconfig.borderZoneGroupName then objCapWarZone.objZone = ZONE_POLYGON:New( capwarzoneconfig.borderZoneGroupName, GROUP:FindByName( capwarzoneconfig.borderZoneGroupName ) ) else if capwarzoneconfig.borderZoneName then objCapWarZone.objZone = ZONE:New(capwarzoneconfig.borderZoneName) else objCapWarZone.objZone = ZONE_GROUP:New( "border_" .. capwarzoneconfig.name, GROUP:FindByName(capwarzoneconfig.ewrPrefixes[1]), UTILS.NMToMeters(600) ) end end objCapWarZone.customconfig = capwarzoneconfig objCapWarZone.objMenu = MENU_MISSION:New(capwarzoneconfig.name, MenuCoalitionCAPWarZone) objCapWarZone.objMenu:RemoveSubMenus() CAPWarZoneArray[compteur] = objCapWarZone MENU_MISSION_COMMAND:New( "Start ".. capwarzoneconfig.name .. " CAP War Zone", CAPWarZoneArray[compteur].objMenu, startCapWarZone, CAPWarZoneArray[compteur]) end end