-- ***************************************************************************** -- ** OnDemand ELint ** -- ********************************************************* function triggerOnDemandElintPlatform(type, askedDuration, askedFL, askedSpeed, askedAnchorCoord, askedOrbitHeading, askedOrbitLeg) local elintPlatformGroup = nil if (elintConfig) then for index, onDemandPlatformConfig in ipairs(elintConfig.onDemandPlatforms) do if ((onDemandPlatformConfig.type == type) and (onDemandPlatformConfig.enabled)) then jtff_log.debug(string.format('Found type %s ELINT : %s Group!', type, onDemandPlatformConfig.groupName),"ELINT") if (askedSpeed and askedSpeed > 0) then onDemandPlatformConfig.speed = askedSpeed end if (askedFL and askedFL > 0) then onDemandPlatformConfig.altitude = askedFL * 100 end if ( askedDuration == nil or askedDuration == 0 ) then askedDuration = 480 end if (askedOrbitHeading) then if (askedOrbitLeg and askedOrbitLeg > 10) then --heading et Leg demandés onDemandPlatformConfig.orbit = { heading = askedOrbitHeading % 360, length = askedOrbitLeg, } else --heading demandé et leg non demandé if (onDemandPlatformConfig.orbit ) then if (not(onDemandPlatformConfig.orbit.length)) then onDemandPlatformConfig.orbit = { heading = askedOrbitHeading % 360, length = 30, } else onDemandPlatformConfig.orbit = { heading = askedOrbitHeading % 360, length = math.max(5, onDemandPlatformConfig.orbit.length), } end else onDemandPlatformConfig.orbit = { heading = askedOrbitHeading % 360, length = 30, } end end else --pas de heading demandé if (onDemandPlatformConfig.orbit ) then if (not(onDemandPlatformConfig.orbit.heading)) then onDemandPlatformConfig.orbit.heading = 90 end if (not(onDemandPlatformConfig.orbit.length)) then onDemandPlatformConfig.orbit.length = 30 else onDemandPlatformConfig.orbit.length = math.max(5, onDemandPlatformConfig.orbit.length) end else onDemandPlatformConfig.orbit = { heading = 90, length = 30, } end end local set_group_elint = SET_GROUP:New() :FilterActive() :FilterPrefixes(onDemandPlatformConfig.groupName) :FilterCategories("plane") :FilterOnce() local aliveELINTGroupList = set_group_elint:GetSetObjects() local is_elint_spawned = false jtff_log.debug(string.format('Looking for a Group corresponding to template %s', string.format("%s-%s", onDemandPlatformConfig.groupName, onDemandPlatformConfig.type)),"ELINT") for index, current_group in ipairs(aliveELINTGroupList) do if ( (not(is_elint_spawned)) and (string.find( current_group.GroupName, string.format("%s-%s", onDemandPlatformConfig.groupName, onDemandPlatformConfig.type), 1, true ) ~= nil) ) then jtff_log.info(string.format('Found %s corresponding to template %s', current_group.GroupName, string.format("%s-%s", onDemandPlatformConfig.groupName, onDemandPlatformConfig.type)),"ELINT") is_elint_spawned = true elintPlatformGroup = current_group end end local RTBAirbase = nil local elintRoute = {} if (onDemandPlatformConfig.baseUnit) then RTBAirbase = AIRBASE:FindByName(onDemandPlatformConfig.baseUnit) else RTBAirbase = askedAnchorCoord:GetClosestAirbase2(Airbase.Category.AIRDROME, GROUP:FindByName(onDemandPlatformConfig.groupName):GetCoalition()) end if (is_elint_spawned) then jtff_log.info( string.format( 'onDemand Elint already in air : rerouting %s', onDemandPlatformConfig.groupName ), "ELINT" ) elintPlatformGroup:ClearTasks() table.insert( elintRoute, askedAnchorCoord :SetAltitude(UTILS.FeetToMeters(onDemandPlatformConfig.altitude)) :WaypointAirTurningPoint( nil, UTILS.KnotsToKmph(onDemandPlatformConfig.speed), { { id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK, speed = UTILS.KnotsToMps(onDemandPlatformConfig.speed), altitude = UTILS.FeetToMeters(onDemandPlatformConfig.altitude) } }, stopCondition = { duration = askedDuration * 60 } }, }, }, "ELINT Start" ) ) table.insert( elintRoute, askedAnchorCoord :Translate(UTILS.NMToMeters(onDemandPlatformConfig.orbit.length), onDemandPlatformConfig.orbit.heading, true, false) :SetAltitude(UTILS.FeetToMeters(onDemandPlatformConfig.altitude)) :WaypointAirTurningPoint( nil, UTILS.KnotsToKmph(onDemandPlatformConfig.speed), {}, "Orbit End" ) ) table.insert( elintRoute, RTBAirbase :GetCoordinate() :WaypointAirLanding( UTILS.KnotsToKmph(onDemandPlatformConfig.speed), RTBAirbase ) ) else jtff_log.info( string.format( 'onDemandElint Spawning %s', onDemandPlatformConfig.groupName ), "ELINT" ) local spawnELINT = SPAWN:NewWithAlias( onDemandPlatformConfig.groupName, string.format("%s-%s", onDemandPlatformConfig.groupName, onDemandPlatformConfig.type) ) if (onDemandPlatformConfig.freq) then spawnELINT:InitRadioFrequency(onDemandPlatformConfig.freq) spawnELINT:InitRadioModulation("AM") end if (onDemandPlatformConfig.modex) then spawnELINT:InitModex(onDemandPlatformConfig.modex) end if (onDemandPlatformConfig.baseUnit) then elintPlatformGroup = spawnELINT:SpawnAtAirbase( AIRBASE:FindByName(onDemandPlatformConfig.baseUnit), SPAWN.Takeoff.Hot, nil, onDemandPlatformConfig.terminalType ) table.insert(elintRoute, AIRBASE :FindByName(onDemandPlatformConfig.baseUnit) :GetCoordinate() :WaypointAirTakeOffParkingHot() ) else elintPlatformGroup = spawnELINT:SpawnFromCoordinate( askedAnchorCoord :GetRandomCoordinateInRadius( UTILS.NMToMeters(30), UTILS.NMToMeters(20) ) :SetAltitude( UTILS.FeetToMeters(onDemandPlatformConfig.altitude) ) ) end local networkIndex = 0 for index, networkElement in ipairs(elintNetworksArray) do if (networkElement.customconfig.coalition == elintPlatformGroup:GetCoalition()) then networkIndex = index end end if (networkIndex > 0) then elintNetworksArray[networkIndex].networkObject:addPlatform(elintPlatformGroup:GetFirstUnit():GetName()) elintPlatformGroup.elintNetworkIndex = networkIndex end elintPlatformGroup.customconfig = onDemandPlatformConfig elintPlatformGroup.spawnAbsTime = timer.getAbsTime() elintPlatformGroup.missionmaxduration = askedDuration table.insert(elintRoute, askedAnchorCoord :SetAltitude(UTILS.FeetToMeters(onDemandPlatformConfig.altitude)) :WaypointAirTurningPoint( nil, UTILS.KnotsToKmph(onDemandPlatformConfig.speed), { { id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK, speed = UTILS.KnotsToMps(onDemandPlatformConfig.speed), altitude = UTILS.FeetToMeters(onDemandPlatformConfig.altitude) } }, stopCondition = { duration = askedDuration * 60 } }, }, }, "ELINT Start" ) ) table.insert(elintRoute, askedAnchorCoord :Translate(UTILS.NMToMeters(onDemandPlatformConfig.orbit.length), onDemandPlatformConfig.orbit.heading, true, false) :SetAltitude(UTILS.FeetToMeters(onDemandPlatformConfig.altitude)) :WaypointAirTurningPoint( nil, UTILS.KnotsToKmph(onDemandPlatformConfig.speed), {}, "Orbit End" ) ) table.insert(elintRoute, RTBAirbase :GetCoordinate() :WaypointAirLanding( UTILS.KnotsToKmph(onDemandPlatformConfig.speed), RTBAirbase, {}, 'RTB' ) ) end elintPlatformGroup:Route(elintRoute) elintPlatformGroup:CommandEPLRS(true, 4) if onDemandPlatformConfig.escortgroupname then elintPlatformGroup.escortSpawnObject = SPAWN:NewWithAlias(onDemandPlatformConfig.escortgroupname,'escort-'.. onDemandPlatformConfig.groupName) :InitSkill("Excellent") :OnSpawnGroup(function(SpawnGroup) taskGroupEscort({ elintPlatformGroup, SpawnGroup}) end) elintPlatformGroup.escortGroupObject = spawnRecoveryTankerEscort(elintPlatformGroup.escortSpawnObject, onDemandPlatformConfig) if onDemandPlatformConfig.missionmaxduration then elintPlatformGroup.escortGroupObject:ScheduleOnce(onDemandPlatformConfig.missionmaxduration*60, function(SpawnGroup, airBaseName) --trigger.action.outText('RTB schedule trigger Tanker-escort group : '..(SpawnGroup.GroupName)..' airbase'..(airBaseName)..'...', 45) SpawnGroup:RouteRTB(AIRBASE:FindByName(airBaseName)) end, elintPlatformGroup.escortGroupObject, onDemandPlatformConfig.baseUnit ) --trigger.action.outText('Tanker-escort configured to RTB in : '..(onDemandElint.missionmaxduration)..' minutes max...', 45) end end if (map_marker[elintPlatformGroup:GetName()]) then COORDINATE:RemoveMark(map_marker[elintPlatformGroup:GetName()]) end map_marker[elintPlatformGroup:GetName()] = askedAnchorCoord:MarkToCoalition( string.format( 'OnDemand ELINT %s\nFL %i at %i knots\nOn station for %i minutes\nRacetrack : %i ° for %i nm', onDemandPlatformConfig.type, UTILS.Round(onDemandPlatformConfig.altitude / 100 , 0), onDemandPlatformConfig.speed, askedDuration, onDemandPlatformConfig.orbit.heading, onDemandPlatformConfig.orbit.length ), elintPlatformGroup:GetCoalition(), true, 'OnDemand ELINT %s is Activated' ) elintPlatformGroup:HandleEvent(EVENTS.Land) elintPlatformGroup:HandleEvent(EVENTS.Crash) elintPlatformGroup:HandleEvent(EVENTS.Dead) function elintPlatformGroup:OnEventLand(EventData) COORDINATE:RemoveMark(map_marker[self:GetName()]) elintNetworksArray[findElintNetworkIndexByCoalition(self:GetCoalition())].networkObject:removePlatform(self:GetFirstUnit():GetName()) if self.customconfig.escortgroupname then jtff_log.info('RTB: '..self.GroupName..'...',"ELINT") if self.escortGroupObject:IsAirborne(false) == true then jtff_log.info('escort RTB : '.. self.escortGroupObject.GroupName..' ELINT : '..self.GroupName..'...',"ELINT") self.escortGroupObject:RouteRTB() else --self.escortGroupObject:Destroy(nil, 5) end end end function elintPlatformGroup:OnEventCrash(EventData) COORDINATE:RemoveMark(map_marker[self:GetName()]) elintNetworksArray[findElintNetworkIndexByCoalition(self:GetCoalition())].networkObject:removePlatform(self:GetFirstUnit():GetName()) if self.customconfig.escortgroupname then jtff_log.info('RTB: '..self.GroupName..'...',"ELINT") if self.escortGroupObject:IsAirborne(false) == true then jtff_log.info('escort RTB : '.. self.escortGroupObject.GroupName..' ELINT : '..self.GroupName..'...',"ELINT") self.escortGroupObject:RouteRTB() else --self.escortGroupObject:Destroy(nil, 5) end end end function elintPlatformGroup:OnEventDead(EventData) COORDINATE:RemoveMark(map_marker[self:GetName()]) elintNetworksArray[findElintNetworkIndexByCoalition(self:GetCoalition())].networkObject:removePlatform(self:GetFirstUnit():GetName()) if self.customconfig.escortgroupname then jtff_log.info('RTB: '..self.GroupName..'...',"ELINT") if self.escortGroupObject:IsAirborne(false) == true then jtff_log.info('escort RTB : '.. self.escortGroupObject.GroupName..' ELINT : '..self.GroupName..'...',"ELINT") self.escortGroupObject:RouteRTB() else --self.escortGroupObject:Destroy(nil, 5) end end end end end end return elintPlatformGroup; end function findElintNetworkIndexByCoalition(coalition) local foundIndex = 0 for indexNetwork, networkObject in ipairs(elintNetworksArray) do if (networkObject.customconfig.coalition == coalition) then foundIndex = indexNetwork end end if foundIndex > 0 then return foundIndex end return nil end function createElintAirborneControllerSpawnObject(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig local spawnObject = SPAWN:NewWithAlias( elintnetworkconfig.controller.groupName, string.format( "ELINT-%s-controller", UTILS.GetCoalitionName(elintnetworkconfig.coalition) ) ) if (type(spawnObject) == "nil") then jtff_log.error( string.format( 'Controller SPAWN Object: The ELINT controller template %s not found...', elintnetworkconfig.controller.groupName ), "ELINT" ) return spawnObject end spawnObject:InitCoalition(elintnetworkconfig.coalition) --:InitLimit(1,0) :InitSkill("Random") if (elintnetworkconfig.coalition == coalition.side.BLUE) then spawnObject:InitCountry( country.id.CJTF_BLUE ) elseif (elintnetworkconfig.coalition == coalition.side.RED) then spawnObject:InitCountry( country.id.CJTF_RED ) else spawnObject:InitCountry( country.id.UN_PEACEKEEPERS ) end if (type(elintnetworkconfig.controller.modex) == "number") then spawnObject:InitModex( elintnetworkconfig.controller.modex ) end if (type(elintnetworkconfig.controller.freq) == "number") then spawnObject:InitRadioCommsOnOff(true) spawnObject:InitRadioFrequency( elintnetworkconfig.controller.freq ) spawnObject:InitRadioModulation("AM") else spawnObject:InitRadioCommsOnOff(false) end jtff_log.info( string.format( 'Controller SPAWN Object: The SpawnObject is created. Template group is %s ...', elintnetworkconfig.controller.groupName ), "ELINT" ) spawnObject:OnSpawnGroup(airborneControllerOnSpawnGroup,networkIndex) --spawnObject:InitRepeatOnEngineShutDown() --spawnObject:InitCleanUp(60) return spawnObject end function airborneControllerOnSpawnGroup(spawnedGroup,networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig local controllerConfig = elintnetworkconfig.controller spawnedGroup.elintnetworkindex = networkIndex spawnedGroup:OptionROE(ENUMS.ROE.ReturnFire) spawnedGroup:OptionROT(ENUMS.ROT.EvadeFire) spawnedGroup:OptionRTBBingoFuel(true) spawnedGroup:OptionRestrictBurner(true) spawnedGroup:OptionECM_OnlyLockByRadar() spawnedGroup:EnableEmission(true) spawnedGroup:OptionAlarmStateRed() routeElintController( spawnedGroup, networkIndex ) if (type(elintNetworksArray[networkIndex].controllerMark) == "nil") then elintNetworksArray[networkIndex].controllerMark = MARKER:New( COORDINATE:NewFromVec2( AIRBASE:FindByName(controllerConfig.baseUnit):GetCoordinate():GetRandomVec2InRadius( UTILS.NMToMeters(2), UTILS.NMToMeters(0.5) ) ), string.format( "ELINT-%s-airborne-controller\nFL%i at %i knots GS\nControl: %.2f MHz ATIS: %.2f MHz\nOn station for %i minutes", UTILS.GetCoalitionName(elintnetworkconfig.coalition), UTILS.Round(controllerConfig.altitude / 100 , 0), controllerConfig.speed, controllerConfig.controller_freq or 270.350, controllerConfig.atis_freq or 270.250, controllerConfig.missionmaxduration ) ):ToCoalition(elintnetworkconfig.coalition) else elintNetworksArray[networkIndex].controllerMark:UpdateCoordinate( AIRBASE:FindByName(controllerConfig.baseUnit):GetCoordinate() ) end setupElintNetworkwithController(networkIndex, spawnedGroup:GetFirstUnit():GetName()) elintNetworksArray[networkIndex].networkObject:addPlatform(spawnedGroup:GetFirstUnit():GetName()) spawnedGroup:HandleEvent(EVENTS.Land) spawnedGroup:HandleEvent(EVENTS.Crash) spawnedGroup:HandleEvent(EVENTS.Dead) function spawnedGroup:OnEventLand(EventData) elintNetworksArray[self.elintnetworkindex].networkObject:removePlatform(spawnedGroup:GetFirstUnit():GetName()) stopElintNetwork(self.elintnetworkindex) end function spawnedGroup:OnEventCrash(EventData) elintNetworksArray[self.elintnetworkindex].networkObject:removePlatform(spawnedGroup:GetFirstUnit():GetName()) stopElintNetwork(self.elintnetworkindex) end function spawnedGroup:OnEventDead(EventData) elintNetworksArray[self.elintnetworkindex].networkObject:removePlatform(spawnedGroup:GetFirstUnit():GetName()) stopElintNetwork(self.elintnetworkindex) end jtff_log.debug( string.format( 'airborne Controller Group: AirController group %s is spawned and setup...', spawnedGroup:GetName() ), "ELINT" ) end function spawnElintAirborneControllerFromSpawn(spawnObject,networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig local controllerGroup = nil local controllerConfig = elintnetworkconfig.controller if (type(elintNetworksArray[networkIndex].customconfig.controller) == "nil") then jtff_log.error( string.format( 'Airborne Controller: No controller paragraph in the network %i config...', networkIndex ), "ELINT" ) return nil end local groupNameToSearch = string.format( "ELINT-%s-controller", UTILS.GetCoalitionName(elintnetworkconfig.coalition) ) if (type(GROUP:FindByName(groupNameToSearch)) == "nil") then controllerGroup = spawnObject:SpawnAtAirbase( AIRBASE:FindByName(controllerConfig.baseUnit), controllerConfig.takeOffType or SPAWN.Takeoff.Cold, nil, controllerConfig.terminalType or AIRBASE.TerminalType.OpenMedOrBig, true) else controllerGroup = spawnObject:GetLastAliveGroup() if (type(elintNetworksArray[networkIndex].controllerMark) == "nil") then elintNetworksArray[networkIndex].controllerMark = MARKER:New( COORDINATE:NewFromVec2( AIRBASE:FindByName(controllerConfig.baseUnit):GetCoordinate():GetRandomVec2InRadius( UTILS.NMToMeters(2), UTILS.NMToMeters(0.5) ) ), string.format( "ELINT-%s-airborne-controller\nFL%i at %i knots GS\nControl: %.2f MHz ATIS: %.2f MHz\nOn station for %i minutes", UTILS.GetCoalitionName(elintnetworkconfig.coalition), UTILS.Round(controllerConfig.altitude / 100 , 0), controllerConfig.speed, controllerConfig.controller_freq or 270.350, controllerConfig.atis_freq or 270.250, controllerConfig.missionmaxduration ) ):ToCoalition(elintnetworkconfig.coalition) else elintNetworksArray[networkIndex].controllerMark:UpdateCoordinate( AIRBASE:FindByName(controllerConfig.baseUnit):GetCoordinate() ) end end if (type(controllerGroup) == "nil") then jtff_log.error( string.format( 'Airborne Controller: impossible to spawn airborne ELINT controller based on template %s...', controllerConfig.groupName ), "ELINT" ) return nil end return controllerGroup end function setupElintNetworkwithController(networkIndex, controllerUnitName) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig elintNetworksArray[networkIndex].networkObject:setTransmitter(controllerUnitName) jtff_log.info( string.format( 'Controller setup ELINT: Transmitter added for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) if (type(elintnetworkconfig.controller.atis_freq) == "number") then elintNetworksArray[networkIndex].networkObject:configureAtis({ freq = elintnetworkconfig.controller.atis_freq or 270.250, modulation = "AM", volume = 1.0, gender = "male", }) elintNetworksArray[networkIndex].networkObject:setAtisUpdateInterval(15*60) elintNetworksArray[networkIndex].networkObject:enableAtis() jtff_log.info( string.format( 'Controller setup ELINT: Atis enabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) else elintNetworksArray[networkIndex].networkObject:disableAtis() jtff_log.debug( string.format( 'Controller setup ELINT: Atis disabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) end if (type(elintnetworkconfig.controller.notify_freq) == "number") then elintNetworksArray[networkIndex].networkObject:configureNotifier({ freq = elintnetworkconfig.controller.notify_freq or 261.000, modulation = "AM", volume = 1.0, gender = "male", }) elintNetworksArray[networkIndex].networkObject:enableNotifier() jtff_log.info( string.format( 'Controller setup ELINT: Notifyer enabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) else elintNetworksArray[networkIndex].networkObject:disableNotifier() jtff_log.debug( string.format( 'Controller setup ELINT: Notifyer disabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) end if (type(elintnetworkconfig.controller.controller_freq) == "number") then elintNetworksArray[networkIndex].networkObject:configureController({ freq = elintnetworkconfig.controller.controller_freq or 270.350, modulation = "AM", volume = 1.0, gender = "female", }) elintNetworksArray[networkIndex].networkObject:enableController() jtff_log.info( string.format( 'Controller setup ELINT: Controller enabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) if (elintnetworkconfig.enableAlerts == false) then elintNetworksArray[networkIndex].networkObject:disableAlerts() jtff_log.debug( string.format( 'Controller setup ELINT: Alerting disabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) else elintNetworksArray[networkIndex].networkObject:enableAlerts() jtff_log.info( string.format( 'Controller setup ELINT: Alerting enabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) end else elintNetworksArray[networkIndex].networkObject:disableController() jtff_log.debug( string.format( 'Controller setup ELINT: Controller disabled for network %s.', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) end elintNetworksArray[networkIndex].networkObject:systemOn(elintnetworkconfig.debug) jtff_log.info( string.format( 'Controller setup ELINT: Network %s is started !', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) return elintNetworksArray[networkIndex].networkObject end function initializeElintNetwork(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig --create the network elintNetworksArray[networkIndex].networkObject = createHoundElintObject(networkIndex) jtff_log.info('init ELINT : '.. UTILS.GetCoalitionName(elintnetworkconfig.coalition) ..'...',"ELINT") if (type(elintNetworksArray[networkIndex].rootMenu) == "nil") then elintNetworksArray[networkIndex].rootMenu = createELintRootMenu(networkIndex) end if (type(elintNetworksArray[networkIndex].startNetworkCommandMenu) == "nil") then elintNetworksArray[networkIndex].startNetworkCommandMenu = MENU_COALITION_COMMAND:New( elintnetworkconfig.coalition, "Start newtork", elintNetworksArray[networkIndex].rootMenu, initializeElintNetwork, networkIndex ) jtff_log.info('init ELINT : Start menu created for coalition '.. UTILS.GetCoalitionName(elintnetworkconfig.coalition) ..'...',"ELINT") end --Manage the menus elintNetworksArray[networkIndex].networkObject:setRadioMenuParent(elintNetworksArray[networkIndex].rootMenu.MenuPath) --Manage debugging elintNetworksArray[networkIndex].networkObject:onScreenDebug(elintnetworkconfig.debug or false) --Manage markers for radars detected if (elintnetworkconfig.enableMarkers == true) then elintNetworksArray[networkIndex].networkObject:enableMarkers() elintNetworksArray[networkIndex].networkObject:setMarkerType(HOUND.MARKER.POLYGON) else elintNetworksArray[networkIndex].networkObject:disableMarkers() end --Manage BDA if (elintnetworkconfig.enableBDA == true) then elintNetworksArray[networkIndex].networkObject:enableBDA() else elintNetworksArray[networkIndex].networkObject:disableBDA() end --Manage namings standards elintNetworksArray[networkIndex].networkObject:enableNATO() elintNetworksArray[networkIndex].networkObject:useNATOCallsignes(true) --Add startup platforms for indexPlatform, startupPlatformName in ipairs(elintConfig.startupPlatformUnitNames) do local platformUnitObject = UNIT:FindByName(startupPlatformName) if ((platformUnitObject ~= nil) and (platformUnitObject:GetCoalition() == elintnetworkconfig.coalition)) then elintNetworksArray[networkIndex].networkObject:addPlatform(startupPlatformName) end end --Manage SRS settings if (elintnetworkconfig.useSRS == false) then elintNetworksArray[networkIndex].networkObject:disableTTS() end --Manage EWR reporting elintNetworksArray[networkIndex].networkObject:reportEWR(elintnetworkconfig.reportEWR or true) startElintController(networkIndex) jtff_log.info('init ELINT : Elint network '.. UTILS.GetCoalitionName(elintnetworkconfig.coalition) ..' initialized...',"ELINT") return elintNetworksArray[networkIndex] end function startElintAirborneController(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig --need a plane controller to be spawned if (type(elintNetworksArray[networkIndex].controllerSpawnObject) == "nil") then --no SpawnObject created ==> let's create the spawnobject elintNetworksArray[networkIndex].controllerSpawnObject = createElintAirborneControllerSpawnObject(networkIndex) end if (type(elintNetworksArray[networkIndex].controllerSpawnObject) == "nil") then -- still no spawnObject present ==> error and return nil jtff_log.error( string.format( 'Airborne ControllerUnit: impossible to create a spawn object based on template %s...', elintnetworkconfig.controller.groupName ), "ELINT" ) return nil end if (type(elintNetworksArray[networkIndex].controllerGroup) == "nil") then --controller has to be spawned elintNetworksArray[networkIndex].controllerGroup = spawnElintAirborneControllerFromSpawn( elintNetworksArray[networkIndex].controllerSpawnObject, networkIndex ) if (type(elintNetworksArray[networkIndex].controllerGroup) == "nil") then -- still no controllerGroup present ==> error and return nil jtff_log.error( string.format( 'Airborne ControllerUnit: impossible to create a spawn object based on template %s...', elintnetworkconfig.controller.groupName ), "ELINT" ) return nil end end jtff_log.info( string.format( 'Airborne ControllerUnit: Group %s is created and routed properly...', elintNetworksArray[networkIndex].controllerGroup:GetFirstUnit():GetName() ), "ELINT" ) return elintNetworksArray[networkIndex].controllerGroup:GetFirstUnit():GetName() end function startElintStaticController(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig local controllerUnitName = string.format( "ELINT-%s-ground-controller", UTILS.GetCoalitionName(elintnetworkconfig.coalition) ) local alreadySpawnedStaticController = STATIC:FindByName(controllerUnitName) if (type(alreadySpawnedStaticController) == "nil") then local spawnStatic if (elintnetworkconfig.coalition == coalition.side.BLUE) then spawnStatic = SPAWNSTATIC:NewFromType("ERO_Radio_Tower", "Fortifications", country.id.CJTF_BLUE) elseif (elintnetworkconfig.coalition == coalition.side.RED) then spawnStatic = SPAWNSTATIC:NewFromType("ERO_Radio_Tower", "Fortifications", country.id.CJTF_RED) else spawnStatic = SPAWNSTATIC:NewFromType("ERO_Radio_Tower", "Fortifications", country.id.UN_PEACEKEEPERS) end local controllerStatic = spawnStatic:SpawnFromCoordinate( AIRBASE:FindByName(elintnetworkconfig.controller.baseUnit):GetCoordinate():GetRandomCoordinateInRadius( UTILS.NMToMeters(5), UTILS.NMToMeters(3) ), math.random(0,360), controllerUnitName ) elintNetworksArray[networkIndex].controllerMark = MARKER:New( controllerStatic:GetCoordinate(), string.format( "ELINT-%s-ground-controller", UTILS.GetCoalitionName(elintnetworkconfig.coalition) ) ):ToCoalition(elintnetworkconfig.coalition) return controllerStatic:GetName() else elintNetworksArray[networkIndex].controllerMark:UpdateCoordinate( alreadySpawnedStaticController:GetCoordinate() ) return alreadySpawnedStaticController:GetName() end end function startElintController(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig if (type(elintnetworkconfig.controller) == "table") then if (type(elintnetworkconfig.controller.groupName) == "string") then startElintAirborneController(networkIndex) else setupElintNetworkwithController(networkIndex, startElintStaticController(networkIndex)) end jtff_log.info( string.format( 'Controller start ELINT: Controller unit for %s network started !', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) elintNetworksArray[networkIndex].startNetworkCommandMenu:Remove() elintNetworksArray[networkIndex].startNetworkCommandMenu = nil elintNetworksArray[networkIndex].stopNetworkCommandMenu = MENU_COALITION_COMMAND:New( elintnetworkconfig.coalition, "Stop newtork", elintNetworksArray[networkIndex].rootMenu, stopElintNetwork, networkIndex ) jtff_log.info( string.format( 'Controller start ELINT: network menu %s is updated !', UTILS.GetCoalitionName(elintnetworkconfig.coalition) ), "ELINT" ) return elintNetworksArray[networkIndex].networkObject else jtff_log.error( string.format( 'controller config: No controller paragraph in the network %i config...', networkIndex ), "ELINT" ) return nil end end function stopElintNetwork(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig if (type(elintNetworksArray[networkIndex].controllerSpawnObject) == "table") then if (type(elintNetworksArray[networkIndex].controllerGroup) == "table") then local controllerRoute = {} local controllerGroup = elintNetworksArray[networkIndex].controllerGroup controllerGroup:ClearTasks() table.insert( controllerRoute, AIRBASE:FindByName(elintnetworkconfig.controller.baseUnit) :GetCoordinate() :WaypointAirLanding( UTILS.KnotsToKmph(elintnetworkconfig.controller.speed), AIRBASE:FindByName(elintnetworkconfig.controller.baseUnit) ) ) controllerGroup:Route(controllerRoute) end --elintNetworksArray[networkIndex].controllerSpawnObject:StopRepeat() end if (type(elintNetworksArray[networkIndex].controllerMark) ~= "nil") then elintNetworksArray[networkIndex].controllerMark:Remove() end for indexPlatform, platformName in ipairs(elintNetworksArray[networkIndex].networkObject:listPlatforms()) do elintNetworksArray[networkIndex].networkObject:removePlatform(platformName) local platformUnitObject = UNIT:FindByName(platformName) if (type(platformUnitObject) ~= "nil") then platformUnitObject:GetGroup():RouteRTB( AIRBASE:FindByName(elintNetworksArray[networkIndex].customconfig.controller.baseUnit) ) end end elintNetworksArray[networkIndex].stopNetworkCommandMenu:Remove() elintNetworksArray[networkIndex].stopNetworkCommandMenu = nil elintNetworksArray[networkIndex].networkObject:removeController() elintNetworksArray[networkIndex].networkObject:destroy() elintNetworksArray[networkIndex].networkObject = nil elintNetworksArray[networkIndex].rootMenu:Remove() elintNetworksArray[networkIndex].rootMenu = nil elintNetworksArray[networkIndex].controllerMark = nil elintNetworksArray[networkIndex].controllerGroup = nil elintNetworksArray[networkIndex].rootMenu = createELintRootMenu(networkIndex) elintNetworksArray[networkIndex].networkObject = createHoundElintObject(networkIndex) elintNetworksArray[networkIndex].startNetworkCommandMenu = MENU_COALITION_COMMAND:New( elintnetworkconfig.coalition, "Start newtork", elintNetworksArray[networkIndex].rootMenu, initializeElintNetwork, networkIndex ) end function routeElintController(controllerGroup, configIndex) local controllerRoute = {} local networkConfig = elintNetworksArray[configIndex].customconfig jtff_log.debug( string.format( 'Airborne Controller routing : controller popped %s based on template %s', controllerGroup:GetName(), networkConfig.controller.groupName ), "ELINT" ) controllerGroup:ClearTasks() table.insert( controllerRoute, AIRBASE:FindByName(networkConfig.controller.baseUnit) :GetCoordinate() :SetAltitude(UTILS.FeetToMeters(networkConfig.controller.altitude)) :WaypointAirTurningPoint( nil, UTILS.KnotsToKmph(networkConfig.controller.speed), { { id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK, speed = UTILS.KnotsToMps(networkConfig.controller.speed), altitude = UTILS.FeetToMeters(networkConfig.controller.altitude) } }, stopCondition = { duration = networkConfig.controller.missionmaxduration * 60 } }, }, }, "Control Start" ) ) table.insert( controllerRoute, AIRBASE:FindByName(networkConfig.controller.baseUnit) :GetCoordinate() :Translate(UTILS.NMToMeters(networkConfig.controller.orbit.length), networkConfig.controller.orbit.heading, true, false) :SetAltitude(UTILS.FeetToMeters(networkConfig.controller.altitude)) :WaypointAirTurningPoint( nil, UTILS.KnotsToKmph(networkConfig.controller.speed), {}, "Orbit End" ) ) table.insert( controllerRoute, AIRBASE:FindByName(networkConfig.controller.baseUnit) :GetCoordinate() :WaypointAirLanding( UTILS.KnotsToKmph(networkConfig.controller.speed), AIRBASE:FindByName(networkConfig.controller.baseUnit) ) ) controllerGroup:Route(controllerRoute) jtff_log.debug( string.format( 'Airborne Controller routing : controller %s routed', controllerGroup:GetName() ), "ELINT" ) end function createELintRootMenu(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig jtff_log.info('ELINT RootMenu: creating for coalition '.. UTILS.GetCoalitionName(elintnetworkconfig.coalition) ..'...',"ELINT") if (elintnetworkconfig.coalition == coalition.side.BLUE) then return MENU_COALITION:New(coalition.side.BLUE, "OnDemand ELint", MenuCoalitionBlue) elseif (elintnetworkconfig.coalition == coalition.side.RED) then return MENU_COALITION:New(coalition.side.RED, "OnDemand ELint", MenuCoalitionRed) elseif (elintnetworkconfig.coalition == coalition.side.NEUTRAL) then return MENU_COALITION:New(coalition.side.NEUTRAL, "OnDemand ELint", MenuCoalitionNeutral) else jtff_log.error('ELINT RootMenu: error in the coalition config...',"ELINT") return nil end end function createHoundElintObject(networkIndex) local elintnetworkconfig = elintNetworksArray[networkIndex].customconfig return HoundElint:create(elintnetworkconfig.coalition) end --local RestrToCoal = nil elintNetworksArray = {} local compteur = 0 for indexElintNetwork, elintnetworkconfig in ipairs(elintConfig.networks) do if elintnetworkconfig.enabled == true then compteur = compteur + 1 jtff_log.info('configuration ELINT : '.. UTILS.GetCoalitionName(elintnetworkconfig.coalition) ..'...',"ELINT") elintNetworksArray[compteur] = { customconfig = elintnetworkconfig, networkObject = nil, rootMenu = nil, controllerMark = nil, controllerSpawnObject = nil, controllerGroup = nil, startNetworkCommandMenu = nil, } elintNetworksArray[compteur].rootMenu = createELintRootMenu(compteur) elintNetworksArray[compteur].startNetworkCommandMenu = MENU_COALITION_COMMAND:New( elintnetworkconfig.coalition, "Start newtork", elintNetworksArray[compteur].rootMenu, initializeElintNetwork, compteur ) end end local elintMarkHandler = {} function elintMarkHandler:onEvent(event) local elintCmdSymbol = "-" if event.id == 25 then --trigger.action.outText(" ", 0, true) elseif (event.id == 27 and string.find(event.text, elintCmdSymbol)) then --if (event.coalition == RestrToCoal or RestrToCoal == nil) then local full = nil local remString = nil local cmd = nil local param1 = nil local param1Start = nil local param2 = nil local param2Start = nil local param3 = nil local param3Start = nil local param4 = nil local param4Start = nil local param5 = nil local param5Start = nil local param6 = nil local param6Start = nil local mcoord = COORDINATE:New(event.pos.x, event.pos.y, event.pos.z) local mvec3 = event.pos full = string.sub(event.text, 2) if (string.find(full, elintCmdSymbol)) then param1Start = string.find(full, elintCmdSymbol) cmd = string.sub(full, 0, param1Start-1) remString = string.sub(full, param1Start+1) if (string.find(remString, elintCmdSymbol)) then param2Start = string.find(remString, elintCmdSymbol) param1 = string.sub(remString, 0, param2Start-1) remString = string.sub(remString, param2Start+1) if string.find(remString, elintCmdSymbol) then param3Start = string.find(remString, elintCmdSymbol) param2 = string.sub(remString, 0, param3Start-1) remString = string.sub(remString, param3Start+1) if string.find(remString, elintCmdSymbol) then param4Start = string.find(remString, elintCmdSymbol) param3 = string.sub(remString, 0, param4Start-1) remString = string.sub(remString, param4Start+1) if string.find(remString, elintCmdSymbol) then param5Start = string.find(remString, elintCmdSymbol) param4 = string.sub(remString, 0, param5Start-1) remString = string.sub(remString, param5Start+1) if string.find(remString, elintCmdSymbol) then param6Start = string.find(remString, elintCmdSymbol) param5 = string.sub(remString, 0, param6Start-1) param6 = string.sub(remString, param6Start+1) else param5 = remString end else param4 = remString end else param3 = remString end else param2 = remString end else param1 = remString end else cmd = full end if log_levels[JTFF_LOGLEVEL] <= log_levels['debug'] then trigger.action.outText("Full Text = " .. full, 10) trigger.action.outText("Command = " .. cmd, 10) if param1 ~= nil then trigger.action.outText("type = " .. param1, 10) end if param2 ~= nil then trigger.action.outText("Duration = " .. param2, 10) end if param3 ~= nil then trigger.action.outText("FlightLevel = " .. param3, 10) end if param4 ~= nil then trigger.action.outText("Speed = " .. param4, 10) end if param5 ~= nil then trigger.action.outText("OrbitHeading = " .. param5, 10) end if param6 ~= nil then trigger.action.outText("OrbitLeg = " .. param6, 10) end end if string.find(cmd, "elint") then if log_levels[JTFF_LOGLEVEL] <= log_levels['debug'] then trigger.action.outText("DEBUG: On Demand ELint Started!", 10) end triggerOnDemandElintPlatform( param1, tonumber(param2), tonumber(param3), tonumber(param4), mcoord, tonumber(param5), tonumber(param6) ) end --end end end world.addEventHandler(elintMarkHandler)