----------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------- -- Title: Dynamic Tanker Script -- Orig. Author: Turbine "Turbs" -- Version: 1.0 -- Initial Date: 2024-06-22 -- Description: -- To Use: -- -- Changelog: Version | Date | Author | Description -- 1.0 | 2024-06-22 | Turbine | Initial Release -- 1.1 | 2024-09-09 | Turbine | Added TACG to heading of menu system -- 1.2 | 2024-10-12 | Turbine | Found a bug where if there's a missing tanker # the tanker script freezes the game. -- ----------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------- -- Define Local Variables ----------------------------------------------------------------------------------------------------------------------------------- local DEBUGGING = false -- This will draw circles where the trigger zones should be located and turn on log messaging. local SRS_PATH = "C:\\Program Files\\DCS-SimpleRadio-Standalone\\" -- Set this as the path to your local SRS installation. local SERVER_NAME = "" -- Placeholder for storing name of server local SRS_PORT = 0000 -- Set the default port! If you have one server, this will be your port. local ACTIVE_TANKER_GROUPS = {} --DON'T TOUCH THIS! This is the table that will store the active carrier groups in the mission local TANKERZONERADIUS = 926 --Radius that will dictate whether a player is refueling with a tanker. local TANKER_DECONFLICTION_CONFIG = { ALTITUDE_LIMIT = 150, -- In meters, for defining the limit that tankers must segregate by altitude. ZONE_RADIUS = 18520, -- In meters, 18520 meters is 10nm, the altitude before deconfliction will kick in. CHECK_INTERVAL = 30, -- In seconds, how often to check the deconfliction altitudes. } ----------------------------------------------------------------------------------------------------------------------------------- -- Debugging Functions, DO NOT TOUCH! ----------------------------------------------------------------------------------------------------------------------------------- --Print string debug local function DebugLogger(message) if DEBUGGING then env.info("DYNAMIC TANKER SCRIPT: " .. message) trigger.action.outText("DYNAMIC TANKER SCRIPT: " .. message, 20) end end --Add debugging information DebugLogger("DYNAMIC TANKER SCRIPT Ver: 1.1") --Print Table debug function DebugTable(_table, _indentstring) if DEBUGGING then env.info(tostring(_table) .. " = {") _indentstring = _indentstring or "" for k, v in pairs(_table) do if type(v) == "table" then env.info(_indentstring .. tostring(k) .. " = {") DebugTable(v, _indentstring .. " ") env.info(_indentstring .. "},") else env.info(_indentstring .. tostring(k) .. " = " .. tostring(v) ..",") end end env.info("}") end end --Add debugging information DebugLogger("DEBUGGING SCRIPTS LOADED") ----------------------------------------------------------------------------------------------------------------------------------- -- Define Servers Information -- -- Template: -- { -- SERVER_NAME = "Name", -- SRS_PORT = "5002" -- } ----------------------------------------------------------------------------------------------------------------------------------- local SERVER_INFO = SERVER_MASTER_LIST --Add debugging information DebugLogger("SEVER LIST LOADED") ----------------------------------------------------------------------------------------------------------------------------------- -- Define Tanker Information --KC130 --KC135MPRS --KC-135 ----------------------------------------------------------------------------------------------------------------------------------- --Define variables local TANKER_MASTER_LIST = { ["KC130"] = { tankerType = "KC130", callsignName = "Arco", frequencyBase = "251", frequencyModulation = "AM", tacanBase = 40, tacanID = "AC", Immortality = "immortal", FuelState = "unlimited", ROTState = "none", }, ["KC-135"] = { tankerType = "KC-135", callsignName = "Shell", frequencyBase = "253", frequencyModulation = "AM", tacanBase = 60, tacanID = "SH", mmortality = "immortal", FuelState = "unlimited", ROTState = "none", }, ["KC135MPRS"] = { tankerType = "KC135MPRS", callsignName = "Texaco", frequencyBase = "252", frequencyModulation = "AM", tacanBase = 50, tacanID = "TX", mmortality = "immortal", FuelState = "unlimited", ROTState = "none", }, } --Add debugging information DebugLogger("MASTER TANKER LIST LOADED") ----------------------------------------------------------------------------------------------------------------------------------- -- DEFINE TANKER ALTITUDE VS SPPED TABLE -- Units are CAS ----------------------------------------------------------------------------------------------------------------------------------- local TANKER_SPEED_TABLE = { ["KC-135"] = {321, 327, 331, 337, 341, 346, 350, 356, 362, 370, 376, 379, 387, 393, 399, 407, 411, 418, 424, 432, 442, 448, 455, 465, 473, 481, 490, 545, 545, 545}, ["KC135MPRS"] = {280, 284, 290, 294, 298, 302, 306, 309, 315, 319, 325, 330, 335, 342, 346, 354, 358, 366, 370, 378, 385, 389, 399, 405, 411, 416, 424, 436, 444, 450}, ["KC130"] = {336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336, 336}, } --Add debugging information DebugLogger("TANKER SPEED TABLE LOADED") ----------------------------------------------------------------------------------------------------------------------------------- --Grab all the aircraft groups, find which ones are tankers of type ----------------------------------------------------------------------------------------------------------------------------------- --Define variables local tankerGroupCount = 0 local tankerGroups = SET_GROUP:New():FilterCategoryAirplane():FilterOnce() local tankerArcoCounter = 0 local tankerShellCounter = 0 local tankerTexacoCounter = 0 --Loop through each group found tankerGroups:ForEachGroup( function(Group) --Define variables local unitTable = Group:GetDCSUnits() -- This will return a table of units within the group --Iterate through each Unit within each group for _, v in pairs(unitTable) do --Define variables local mooseUnitObject = UNIT:Find(v) --Find the unit --local unitType = mooseUnitObject:GetTypeName() -- Grab the units Type Name --local unitName = mooseUnitObject:GetName() --Grab the unit's name --Loop through each tanker group within the master list for _, tankerMaster in pairs(TANKER_MASTER_LIST) do --Check if tanker type is the same if tankerMaster.tankerType == mooseUnitObject:GetTypeName() then --Increment the Tanker Group Count tankerGroupCount = tankerGroupCount + 1 --Check if tanker has the correct callsign name if string.find(mooseUnitObject:GetCallsign(), tankerMaster.callsignName) then --Define variabls local callsignNumber --Increment the tanker count and grab the first number of the callsign if tankerMaster.callsignName == "Arco" then --Increment the Arco Counter tankerArcoCounter = tankerArcoCounter + 1 --Grab just the base callsign number callsignNumber = string.gsub(string.gsub(mooseUnitObject:GetCallsign(),"Arco",""),"-1","") end if tankerMaster.callsignName == "Shell" then --Increment the Shell Counter tankerShellCounter = tankerShellCounter + 1 --Grab just the base callsign number callsignNumber = string.gsub(string.gsub(mooseUnitObject:GetCallsign(),"Shell",""),"-1","") end if tankerMaster.callsignName == "Texaco" then --Increment the Texaco Counter tankerTexacoCounter = tankerTexacoCounter + 1 --Grab just the base callsign number callsignNumber = string.gsub(string.gsub(mooseUnitObject:GetCallsign(),"Texaco",""),"-1","") end --Setup the ACTIVE_TANKER_GROUPS table ACTIVE_TANKER_GROUPS[mooseUnitObject:GetName()] = { tankerUnitObj = UNIT:Find(v), tankerGroupObj = GROUP:FindByName(mooseUnitObject.GroupName), tankerUnitType = mooseUnitObject:GetTypeName(), tankerUnitName = mooseUnitObject:GetName(), tankerUnitCallsignName = tankerMaster.callsignName, tankerUnitCallsignNumber = callsignNumber, tankerUnitFrequency = tonumber(tankerMaster.frequencyBase .. "." .. callsignNumber), tankerUnitFreqMod = tankerMaster.frequencyModulation, tankerUnitTacan = tankerMaster.tacanBase + callsignNumber, tankerUnitTacanID = tankerMaster.tacanID .. tostring(callsignNumber), tankerMortality = tankerMaster.Immortality, tankerFuelState = tankerMaster.FuelState, tankerRTTState = tankerMaster.ROTState, tankerInitialAlt = 0, tankerInitialSpeed = 0, tankerZone = ZONE_UNIT:New(mooseUnitObject:GetName(), mooseUnitObject, TANKERZONERADIUS), deconflictionZone = ZONE_UNIT:New(mooseUnitObject:GetName(), mooseUnitObject, TANKER_DECONFLICTION_CONFIG.ZONE_RADIUS), } --If Debugging, output drawzones to F10 Map. if DEBUGGING then ACTIVE_TANKER_GROUPS[mooseUnitObject:GetName()].tankerZone:DrawZone(-1, {0,0,1}, 1, {0,0,1}, 0.15, 1, true) ACTIVE_TANKER_GROUPS[mooseUnitObject:GetName()].deconflictionZone:DrawZone(-1, {1,0,0}, 1, {1,0,0}, 0.15, 1, true) end --Add Debugging Information DebugLogger("FOUND AND REGISTERED UNIT " .. mooseUnitObject:GetName() .. " WITH TYPE " .. mooseUnitObject:GetTypeName() .. " AND CALLSIGN " .. mooseUnitObject:GetCallsign()) end end end end end ) --Add debugging information DebugLogger("TANKER REGISTRATION COMPLETE") ----------------------------------------------------------------------------------------------------------------------------------- --For each active tanker in the ACTIVE_TANKER_GROUPS table, setup the tanker on initial load ----------------------------------------------------------------------------------------------------------------------------------- for _, tankerGroup in pairs (ACTIVE_TANKER_GROUPS) do --Define variables local tempAlt = 0 local groupWaypoints = tankerGroup.tankerGroupObj:GetTemplateRoutePoints() --Apply the TACAN tankerGroup.tankerUnitObj:CommandActivateBeacon(BEACON.Type.TACAN, BEACON.System.TACAN_TANKER_Y,UTILS.TACANToFrequency(tankerGroup.tankerUnitTacan, "Y"),tankerGroup.tankerUnitObj:GetID(), tankerGroup.tankerUnitTacan,"Y",nil,tankerGroup.tankerUnitTacanID,true) --Set the Frequency if tankerGroup.tankerUnitFreqMod == "AM" then tankerGroup.tankerUnitObj:CommandSetFrequency(tankerGroup.tankerUnitFrequency,radio.modulation.AM) end if tankerGroup.tankerUnitFreqMod == "FM" then tankerGroup.tankerUnitObj:CommandSetFrequency(tankerGroup.tankerUnitFrequency,radio.modulation.AM) end --Set the Mortality if tankerGroup.tankerMortality == "immortal" then tankerGroup.tankerGroupObj:CommandSetImmortal(true) end --Set Unlimited FuelState if tankerGroup.tankerFuelState == "unlimited" then tankerGroup.tankerGroupObj:CommandSetUnlimitedFuel(true) end --Set Reaction to Threat if tankerGroup.tankerRTTState == "none" then tankerGroup.tankerGroupObj:OptionROTNoReaction() end --Loop through each tanker's waypoints to find the orbit altitude for _, v in pairs(groupWaypoints) do --Define variables local alt = v.alt -- UTILS.MetersToFeet(v.alt) --Check if this waypoint altitude is higher than the previous if tempAlt < alt then --Set the new altitude tempAlt = alt --UTILS.MetersToFeet(alt) --Set the new airspeed tankerGroup.tankerInitialSpeed = v.speed end end --Apply it to the Active List tankerGroup.tankerInitialAlt = math.floor(UTILS.MetersToFeet(tempAlt)) end --Add debugging information DebugLogger("TANKER SETUP COMPLETE") ----------------------------------------------------------------------------------------------------------------------------------- --Setup Tanker Functions ----------------------------------------------------------------------------------------------------------------------------------- function tanker_info(args) --Define variables local tankerGroup = args[1] local playerAircraftSet = SET_UNIT:New():FilterActive(true):FilterOnce() --Grabs all the players int the mission --Set the initial Altitude if ACTIVE_TANKER_GROUPS[tankerGroup].tankerInitialAlt == 0 then --ACTIVE_TANKER_GROUPS[tankerGroup].tankerInitialAlt = end --Set the output text local outputText = "====== TANKER " .. string.upper(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignName) .. " " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignNumber .. "-1 STATUS ======" --Set the tanker type info outputText = outputText .. "\nA/C TYPE: " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitType --Set the Frequency info outputText = outputText .. "\nFREQUENCY: " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitFrequency .. " Mhz " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitFreqMod --Set the TACAN info outputText = outputText .. "\nTACAN: " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitTacan .. "Y (" .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitTacanID .. ")" --Set the Altitude info outputText = outputText .. "\nALTITUDE: " .. math.floor(UTILS.MetersToFeet(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetAltitude(false))) .. " ft ASL / " .. math.floor(UTILS.MetersToFeet(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetAltitude(true))) .. " ft AGL" --Set the Speed info outputText = outputText .. "\nSPEED: " .. math.floor(UTILS.MpsToKnots(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetAirspeedIndicated())) .. " kn IAS / " .. math.floor(UTILS.MpsToKnots(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetAirspeedTrue())) .. " kn TAS / " .. math.floor(UTILS.MpsToKnots(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetGroundSpeed())) .. " kn GS " --Calculate who is within the zone of the tanker, and display their names outputText = outputText .. "\nCURRENTLY REFUELING: " playerAircraftSet:ForEachUnitCompletelyInZone(ACTIVE_TANKER_GROUPS[tankerGroup].tankerZone, function(playerUnit) if playerUnit:GetPlayerName() ~= nil then outputText = outputText .. playerUnit:GetPlayerName() .. "\n" end end ) --Display the message trigger.action.outText(outputText, 20) end function tanker_reset_beacons(args) --Define variables local tankerGroup = args[1] --Deactivate the TACAN beacon ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:CommandDeactivateBeacon() --Activate the TACAN beacon ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:CommandActivateBeacon(BEACON.Type.TACAN, BEACON.System.TACAN_TANKER_Y,UTILS.TACANToFrequency(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitTacan, "Y"),ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetID(), ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitTacan,"Y",nil,ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitTacanID,true) --Set the Frequency if ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitFreqMod == "AM" then ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:CommandSetFrequency(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitFrequency,radio.modulation.AM) end if ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitFreqMod == "FM" then ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:CommandSetFrequency(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitFrequency,radio.modulation.AM) end end function tanker_change_alt(args) --Define variables local tankerGroup = args[1] local altitudeChange = args[2] local currentAlt = math.floor(UTILS.MetersToFeet(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetAltitude())/1000+0.5)*1000 local newAlt = math.floor(UTILS.FeetToMeters(currentAlt + altitudeChange)) local currentGroundSpeed = math.floor(UTILS.MpsToKnots(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetGroundSpeed())) local newGroundSpeed = UTILS.KnotsToMps(UTILS.KnotsToAltKIAS(currentGroundSpeed,newAlt)) --Set the new altitude change ACTIVE_TANKER_GROUPS[tankerGroup].tankerGroupObj:SetAltitude(newAlt, true, "BARO") --Adjust the Speed according to the altitude change ACTIVE_TANKER_GROUPS[tankerGroup].tankerGroupObj:SetSpeed(newGroundSpeed,true) --Send notice to the client if altitudeChange > 0 then trigger.action.outText(string.upper("99, " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignName) .. " " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignNumber .. "-1, CLIMBING TO ANGELS " .. math.floor((currentAlt + altitudeChange)/1000+0.5), 10) elseif altitudeChange < 0 then trigger.action.outText(string.upper("99, " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignName) .. " " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignNumber .. "-1, DESCENDING TO ANGELS " .. math.floor((currentAlt + altitudeChange)/1000+0.5), 10) end end function tanker_change_spd(args) --Define variables local tankerGroup = args[1] local speedChange = args[2] local currentAlt = math.floor(UTILS.MetersToFeet(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetAltitude())/1000+0.5)*1000 local currentGroundSpeed = math.floor(UTILS.MpsToKnots(ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitObj:GetGroundSpeed())) local newGroundSpeed = UTILS.KnotsToMps(UTILS.KnotsToAltKIAS(currentGroundSpeed + speedChange,currentAlt)) --Set the new speed change ACTIVE_TANKER_GROUPS[tankerGroup].tankerGroupObj:SetSpeed(newGroundSpeed,true) --Send notice to the client if altitudeChange > 0 then trigger.action.outText(string.upper("99, " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignName) .. " " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignNumber .. "-1, CLIMBING TO ANGELS " .. math.floor((currentAlt + altitudeChange)/1000+0.5), 10) elseif altitudeChange < 0 then trigger.action.outText(string.upper("99, " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignName) .. " " .. ACTIVE_TANKER_GROUPS[tankerGroup].tankerUnitCallsignNumber .. "-1, DESCENDING TO ANGELS " .. math.floor((currentAlt + altitudeChange)/1000+0.5), 10) end end function tanker_reset_Spd_Alt(args) end --Add debugging information DebugLogger("TANKER FUNCTIONS LOADED") ----------------------------------------------------------------------------------------------------------------------------------- --Setup the Menu System ----------------------------------------------------------------------------------------------------------------------------------- --Define variables/menus local TankerMenu = MENU_COALITION:New(coalition.side.BLUE, "TANKER MENUS") local Arco_Total = 0 local Shell_Total = 0 local Texaco_Total = 0 --Iterate through each Active tanker to grab the tanker count till done for _, activetanker in pairs(ACTIVE_TANKER_GROUPS) do --Check to see if tanker has Arco callsign name if activetanker.tankerUnitCallsignName == "Arco" then --Increment the Total flag Arco_Total = Arco_Total + 1 end --Check to see if tanker has Shell callsign name if activetanker.tankerUnitCallsignName == "Shell" then --Increment the Total flag Shell_Total = Shell_Total + 1 end --Check to see if tanker has Texaco callsign name if activetanker.tankerUnitCallsignName == "Texaco" then --Increment the Total flag Texaco_Total = Texaco_Total + 1 end end --Check if the counter is greater than 0, if so then add the menu if Arco_Total > 0 then local Arco_Menu local Arco_SubMenu local Arco_BeaconsMenu local Arco_AltMenu local Arco_SpeedMenu end local testvar = 0 --Loop through each Arco Tanker Number for i=1,9,1 do --Iterate through each active tanker for _, activetanker in pairs(ACTIVE_TANKER_GROUPS) do --Check to see if unit has callsign name of Arco if activetanker.tankerUnitCallsignName == "Arco" then --Check to see if the unit callsign number matches the counter if tonumber(activetanker.tankerUnitCallsignNumber) == i then --Set menu system Arco_Menu = MENU_COALITION:New(coalition.side.BLUE, "ARCO TANKERS", TankerMenu) Arco_SubMenu = MENU_COALITION:New(coalition.side.BLUE, string.upper(activetanker.tankerUnitCallsignName) .. " " .. activetanker.tankerUnitCallsignNumber.."-1", Arco_Menu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "TANKER STATUS", Arco_SubMenu, tanker_info, {activetanker.tankerUnitName}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CYCLE BEACONS", Arco_SubMenu, tanker_reset_beacons, {activetanker.tankerUnitName}) Arco_AltMenu = MENU_COALITION:New(coalition.side.BLUE,"CHANGE ALTITUDE", Arco_SubMenu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 1000 FT", Arco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,1000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 2000 FT", Arco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,2000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 3000 FT", Arco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,3000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 1000 FT", Arco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-1000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 2000 FT", Arco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-2000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 3000 FT", Arco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-3000}) Arco_SpeedMenu = MENU_COALITION:New(coalition.side.BLUE,"CHANGE SPEED", Arco_SubMenu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 10 KTS", Arco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,10}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 20 KTS", Arco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,20}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 30 KTS", Arco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,30}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 10 KTS", Arco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-10}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 20 KTS", Arco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-20}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 30 KTS", Arco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-30}) end end end end --Add debugging information DebugLogger("TANKER ARCO MENU LOADED") --Check if the counter is greater than 0, is so then add the menu if Shell_Total > 0 then local Shell_Menu local Shell_SubMenu local Shell_BeaconsMenu local Shell_AltMenu local Shell_SpeedMenu end --Loop through each Shell Tanker Number for i=1,9,1 do --Iterate through each active tanker for _, activetanker in pairs(ACTIVE_TANKER_GROUPS) do --Check to see if unit has callsign name of Shell if activetanker.tankerUnitCallsignName == "Shell" then --Check to see if the unit callsign number matches the counter if tonumber(activetanker.tankerUnitCallsignNumber) == i then --Set menu system Shell_Menu = MENU_COALITION:New(coalition.side.BLUE, "SHELL TANKERS", TankerMenu) Shell_SubMenu = MENU_COALITION:New(coalition.side.BLUE, string.upper(activetanker.tankerUnitCallsignName) .. " " .. activetanker.tankerUnitCallsignNumber.."-1", Shell_Menu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "TANKER STATUS", Shell_SubMenu, tanker_info, {activetanker.tankerUnitName}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CYCLE BEACONS", Shell_SubMenu, tanker_reset_beacons, {activetanker.tankerUnitName}) Shell_AltMenu = MENU_COALITION:New(coalition.side.BLUE,"CHANGE ALTITUDE", Shell_SubMenu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 1000 FT", Shell_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,1000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 2000 FT", Shell_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,2000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 3000 FT", Shell_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,3000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 1000 FT", Shell_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-1000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 2000 FT", Shell_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-2000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 3000 FT", Shell_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-3000}) Shell_SpeedMenu = MENU_COALITION:New(coalition.side.BLUE,"CHANGE SPEED", Shell_SubMenu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 10 KTS", Shell_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,10}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 20 KTS", Shell_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,20}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 30 KTS", Shell_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,30}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 10 KTS", Shell_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-10}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 20 KTS", Shell_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-20}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 30 KTS", Shell_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-30}) end end end end --Add debugging information DebugLogger("TANKER SHELL MENU LOADED") --Check if the counter is greater than 0, is so then add the menu if Texaco_Total > 0 then local Texaco_Menu local Texaco_SubMenu local Texaco_BeaconsMenu local Texaco_AltMenu local Texaco_SpeedMenu end --Loop through each Texaco Tanker Number for i=1,9,1 do --Iterate through each active tanker for _, activetanker in pairs(ACTIVE_TANKER_GROUPS) do --Check to see if unit has callsign name of Texaco if activetanker.tankerUnitCallsignName == "Texaco" then --Check to see if the unit callsign number matches the counter if tonumber(activetanker.tankerUnitCallsignNumber) == i then --Set menu system Texaco_Menu = MENU_COALITION:New(coalition.side.BLUE, "TEXACO TANKERS", TankerMenu) Texaco_SubMenu = MENU_COALITION:New(coalition.side.BLUE, string.upper(activetanker.tankerUnitCallsignName) .. " " .. activetanker.tankerUnitCallsignNumber.."-1", Texaco_Menu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "TANKER STATUS", Texaco_SubMenu, tanker_info, {activetanker.tankerUnitName}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CYCLE BEACONS", Texaco_SubMenu, tanker_reset_beacons, {activetanker.tankerUnitName}) Texaco_AltMenu = MENU_COALITION:New(coalition.side.BLUE,"CHANGE ALTITUDE", Texaco_SubMenu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 1000 FT", Texaco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,1000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 2000 FT", Texaco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,2000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "CLIMB 3000 FT", Texaco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,3000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 1000 FT", Texaco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-1000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 2000 FT", Texaco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-2000}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DESCEND 3000 FT", Texaco_AltMenu, tanker_change_alt, {activetanker.tankerUnitName,-3000}) Texaco_SpeedMenu = MENU_COALITION:New(coalition.side.BLUE,"CHANGE SPEED", Texaco_SubMenu) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 10 KTS", Texaco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,10}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 20 KTS", Texaco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,20}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "INCREASE 30 KTS", Texaco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,30}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 10 KTS", Texaco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-10}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 20 KTS", Texaco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-20}) MENU_COALITION_COMMAND:New(coalition.side.BLUE, "DECREASE 30 KTS", Texaco_SpeedMenu, tanker_change_spd, {activetanker.tankerUnitName,-30}) end end end end --Add debugging information DebugLogger("TANKER TEXACO MENU LOADED") --Add debugging information DebugLogger("TANKER MENUS LOADED") ----------------------------------------------------------------------------------------------------------------------------------- -- Setup function to check for potential deconfliction issues among tankers ----------------------------------------------------------------------------------------------------------------------------------- --function tanker_decon_check() -- --Define variables -- local adjustedTankers = {} -- -- --Give notice -- trigger.action.outText("Checking Tanker Altitudes",10) -- -- --Loop through each active tanker -- for _, tankerGroup1 in pairs(ACTIVE_TANKER_GROUPS) do -- -- --Lop through each active tanker a 2nd time -- for _, tankerGroup2 in pairs(ACTIVE_TANKER_GROUPS) do -- --Define variables -- local tankerUnit1Alt = tankerGroup1.tankerUnitObj:GetAltitude(false) -- local tankerUnit2Alt = tankerGroup2.tankerUnitObj:GetAltitude(false) -- -- --Check if the unit in both groups are the same -- if tankerGroup1.tankerUnitName ~= tankerGroup2.tankerUnitName then -- -- --Check if tankerGroup2 is within the zone of tankerGroup1 -- if tankerGroup1.deconflictionZone:IsVec2InZone(tankerGroup2.tankerUnitObj:GetVec2()) then -- -- --Check their altitudes, if they are within the Altitude limit, then segregate them. -- if math.abs(tankerUnit1Alt - tankerUnit2Alt) < TANKER_DECONFLICTION_CONFIG.ALTITUDE_LIMIT then -- DebugLogger("This Worked") -- end -- -- DebugLogger("Unit 1: " .. tankerGroup1.tankerUnitObj:GetCallsign() .. " Alt: " .. tankerUnit1Alt .. " | Unit 2:" .. tankerGroup2.tankerUnitObj:GetCallsign().. " Alt: " .. tankerUnit2Alt) -- end -- end -- end -- end --end ----------------------------------------------------------------------------------------------------------------------------------- -- Schedule the check to be conducted every ATIS_CONFIG.CHECK_INTERVAL seconds. ----------------------------------------------------------------------------------------------------------------------------------- --local TankerChecker = SCHEDULER:New(nil, tanker_decon_check, {}, TANKER_DECONFLICTION_CONFIG.CHECK_INTERVAL, TANKER_DECONFLICTION_CONFIG.CHECK_INTERVAL) ----------------------------------------------------------------------------------------------------------------------------------- --Output Debugging Information ----------------------------------------------------------------------------------------------------------------------------------- DebugLogger("TOTAL TANKER GROUP COUNT IN MISSION: " .. tankerGroupCount) DebugLogger("ARCO COUNT: " .. tankerArcoCounter) DebugLogger("SHELL COUNT: " .. tankerShellCounter) DebugLogger("TEXACO COUNT: " .. tankerTexacoCounter) --Report any errors if tankerGroupCount ~= (tankerArcoCounter + tankerShellCounter + tankerTexacoCounter) then DebugLogger("NOT ALL TANKERS ARE REGISTERED WITH THE SCRIPT. PLEASE CHECK THE MISSION EDITOR!") trigger.action.outText("NOT ALL TANKERS ARE REGISTERED WITH THE SCRIPT. PLEASE CHECK THE MISSION EDITOR!",10) end --Display script loaded successfully env.info("DYNAMIC TANKER SCRIPT: SCRIPT LOADED SUCCESSFULLY")