-- ***************************************************************************** -- ** Set_Client ** -- ********************************************************* Set_CLIENT = SET_CLIENT:New():FilterOnce() Set_CLIENT:HandleEvent(EVENTS.Refueling) Set_CLIENT:HandleEvent(EVENTS.RefuelingStop) Set_CLIENT:HandleEvent(EVENTS.PlayerEnterAircraft) function Set_CLIENT:OnEventPlayerEnterAircraft(EventData) if (EventData.IniGroup) then local clientSetting = SETTINGS:Set( EventData.IniPlayerName) clientSetting:SetImperial() clientSetting:SetA2G_MGRS() clientSetting:SetMenutextShort(true) if type(InterceptArray) == 'table' then for index, objIntercept in ipairs(InterceptArray) do if (objIntercept.menus[EventData.IniUnit:GetCoalition()]) then MENU_GROUP_COMMAND:New( EventData.IniGroup, "High Aspect", objIntercept.menus[EventData.IniUnit:GetCoalition()], StartInterceptTraining, {EventData.IniUnit:GetName(),index,-20,20} ) MENU_GROUP_COMMAND:New( EventData.IniGroup, "Medium Aspect Left", objIntercept.menus[EventData.IniUnit:GetCoalition()], StartInterceptTraining, {EventData.IniUnit:GetName(),index,20,50} ) MENU_GROUP_COMMAND:New( EventData.IniGroup, "Medium Aspect Right", objIntercept.menus[EventData.IniUnit:GetCoalition()], StartInterceptTraining, {EventData.IniUnit:GetName(),index,-50,-20} ) MENU_GROUP_COMMAND:New( EventData.IniGroup, "Low Aspect Left", objIntercept.menus[EventData.IniUnit:GetCoalition()], StartInterceptTraining, {EventData.IniUnit:GetName(),index,50,80} ) MENU_GROUP_COMMAND:New( EventData.IniGroup, "Low Aspect Right", objIntercept.menus[EventData.IniUnit:GetCoalition()], StartInterceptTraining, {EventData.IniUnit:GetName(),index,-80,-50} ) end end end jtff_log.debug(string.format("Add QRA Menu for group [%s], player name [%s]",EventData.IniGroupName , EventData.IniPlayerName),"QRA") if type(QRAArray) == 'table' then for index, objQRA in ipairs(QRAArray) do if (MenuCoalitionQRA[EventData.IniUnit:GetCoalition()]) and (objQRA.customconfig.type == JTFF_QRA.Type.TangoAuto) then objQRA.menu[EventData.IniUnit:GetCoalition()] = MENU_GROUP_COMMAND:New( EventData.IniGroup, "Trigger " .. objQRA.customconfig.name, MenuCoalitionQRA[EventData.IniUnit:GetCoalition()], QRATrigger, { objQRA, EventData.IniUnit:GetName(), index, } ) end end end jtff_log.debug(string.format("Add Tanker Menu for group [%s], player name [%s]",EventData.IniGroupName , EventData.IniPlayerName),"TANKER") if EventData.IniUnit:GetCoalition() == coalition.side.BLUE then MENU_GROUP_COMMAND:New( EventData.IniGroup, "Nearest Tanker Info", MenuCoalitionTankerBlue, NearestTankerInfo, { EventData.IniUnit, EventData.IniGroup} ) MENU_GROUP_COMMAND:New( EventData.IniGroup, "All Tankers Info", MenuCoalitionTankerBlue, AllTankersInfo, {EventData.IniUnit,EventData.IniGroup} ) else MENU_GROUP_COMMAND:New( EventData.IniGroup, "Nearest Tanker Info", MenuCoalitionTankerRed, NearestTankerInfo, { EventData.IniUnit, EventData.IniGroup} ) MENU_GROUP_COMMAND:New( EventData.IniGroup, "All Tankers Info", MenuCoalitionTankerRed, AllTankersInfo, {EventData.IniUnit,EventData.IniGroup} ) end local GroupMenu = MENU_GROUP:New( EventData.IniGroup, "My Group settings" ) jtff_log.debug(string.format("Add Immortal Menu for group [%s], player name [%s]",EventData.IniGroupName , EventData.IniPlayerName),"GENERAL") BASE:SetState( EventData.IniGroup, "isImmortal", false ) BASE:SetState( EventData.IniUnit, "isRefueling", false ) MENU_GROUP_COMMAND:New( EventData.IniGroup, "Switch immortal status", GroupMenu, switchGroupImmortalStatus, EventData.IniGroup ) if (type(AIRBOSSArray) == 'table') then if #AIRBOSSArray > 0 then MENU_GROUP_COMMAND:New( EventData.IniGroup, "Switch Airboss subtitles", GroupMenu, switchGroupAirbossSubtitlesStatus, EventData.IniGroup ) end end end end function Set_CLIENT:OnEventRefueling(EventData) if (EventData.initiator) then if NET:GetMyPlayerID() == 1 then --trigger.action.outText("Vous ĂȘtes en mode multijoueur.", 90) local tankerUnit = UNIT:Find(EventData.initiator) local refuelingUnitsSearchRadiusMeters = 150 local tankerUnitName = 'unknown' local client = nil local clientUnit = nil local clientFuel = 0 local clientName = 'unknown' if (type(tankerUnit) ~= 'nil') then local clientRefuelableSet = SET_CLIENT:New() --trigger.action.outText(string.format("clientRefuelableSet init count = %d",clientRefuelableSet:Count()), 90) --trigger.action.outText(string.format("tankerUnit = %s",tankerUnit:GetName()), 90) tankerUnitName = tankerUnit:GetName() local isTanker, tankerRefuelSystem = tankerUnit:IsTanker() local refuelingUnitsSet = tankerUnit :GetCoordinate() :ScanUnits(refuelingUnitsSearchRadiusMeters) :FilterCoalitions(tankerUnit:GetCoalitionName()) :FilterActive(true) :FilterAlive() :FilterFunction( function(unit) local isRefuelable, unitrefuelsystem = unit:IsRefuelable() return isRefuelable and unitrefuelsystem == tankerRefuelSystem end) :ForEachUnit( function(unit) local clientRefueling = CLIENT:Find(unit:GetDCSObject(), true) --trigger.action.outText(string.format("testing unit %s for clientRefuelableSet",unit:GetName()), 90) if type(clientRefueling) ~= 'nil' then clientRefuelableSet:AddObject(clientRefueling) jtff_log.trace(string.format("adding %s to clientRefuelableSet (refuelable aicrafts near tanker)",clientRefueling:GetPlayer()),"TANKER") end end ) jtff_log.trace(string.format("refuelingUnitSet (refuelable aicrafts near tanker) : count = %d",refuelingUnitsSet:Count()),"TANKER") jtff_log.trace(string.format("clientRefuelableSet (client refuelable aircrafts near tanker): count = %d",clientRefuelableSet:Count()),"TANKER") if clientRefuelableSet:Count() >= 1 then if clientRefuelableSet:Count() >= 2 then clientRefuelableSet:ForEachClient( function(client) local clientUnit = client:GetClientGroupUnit() local clientFuel = clientUnit:GetFuel() * clientUnit:GetDesc().fuelMassMax if not(BASE:GetState(clientUnit, "isRefueling")) then local mytimer=TIMER:New( function(unit, clientObject, initialFuelState, tankerName) if (unit:GetFuel() * unit:GetDesc().fuelMassMax-initialFuelState >= 0) then local clientName = clientObject:GetPlayer() or unit:GetName() BASE:SetState( unit, "isRefueling", true ) BASE:SetState( unit, "FuelState", initialFuelState ) jtff_log.info( string.format( "[%s] Start refueling at the tanker [%s], current fuel : %.0f Lbs", clientName, tankerName, UTILS.kg2lbs(initialFuelState) ), "TANKER" ) end end, clientUnit, client, clientFuel, tankerUnitName ) mytimer:Start(2) end end ) else client = clientRefuelableSet:GetFirst() clientUnit = client:GetClientGroupUnit() clientFuel = clientUnit:GetFuel() * clientUnit:GetDesc().fuelMassMax clientName = client:GetPlayer() or clientUnit:GetName() BASE:SetState( clientUnit, "FuelState", clientFuel ) BASE:SetState( clientUnit, "isRefueling", true ) jtff_log.info(string.format("[%s] Start refueling at the tanker [%s], current fuel : %.0f Lbs", clientName, tankerUnitName, UTILS.kg2lbs(clientFuel)),"TANKER") end end else jtff_log.error("tanker not found !!!","TANKER") end else --trigger.action.outText("Vous ĂȘtes en mode solo.", 90) local client = CLIENT:Find(EventData.initiator, true) if (type(client) ~= 'nil') then local clientUnit = UNIT:Find(EventData.initiator) local clientFuel = clientUnit:GetFuel() * clientUnit:GetDesc().fuelMassMax local tankerUnit = getNearestTankerfromPlayerUnit(clientUnit) local tankerUnitName = 'unknown' if (type(tankerUnit) ~= 'nil') then tankerUnitName = tankerUnit:GetName() end local clientName = clientUnit:GetName() clientName = client:GetPlayer() BASE:SetState( clientUnit, "FuelState", clientFuel ) BASE:SetState( clientUnit, "isRefueling", true ) jtff_log.info(string.format("[%s] Start refueling at the tanker [%s], current fuel : %.0f Lbs", clientName, tankerUnitName, UTILS.kg2lbs(clientFuel)),"TANKER") end end end end function Set_CLIENT:OnEventRefuelingStop(EventData) if (EventData.initiator) then local client = CLIENT:Find(EventData.initiator, true) if (type(client) ~= 'nil') then local clientUnit = UNIT:Find(EventData.initiator) local clientFuel = clientUnit:GetFuel() * clientUnit:GetDesc().fuelMassMax local tankerUnit = getNearestTankerfromPlayerUnit(clientUnit) local tankerUnitName = 'unknown' if (type(tankerUnit) ~= 'nil') then tankerUnitName = tankerUnit:GetName() end if not(BASE:GetState(clientUnit,"isRefueling")) then jtff_log.error(string.format("impossible to determine accurately fuel taken by [%s] : trying anyway...",client:GetPlayer()),"TANKER") end local clientFuelTaken = clientFuel - BASE:GetState(clientUnit,"FuelState") BASE:SetState( clientUnit, "FuelState", clientFuel ) BASE:SetState( clientUnit, "isRefueling", false ) jtff_log.info(string.format("[%s] just finsihed refueling at the tanker [%s], taken %.0f Lbs",client:GetPlayer() , tankerUnitName, UTILS.kg2lbs(clientFuelTaken)),"TANKER") if (type(dcsbot) ~= 'nil') then local title = string.format('End of Air refuel !') local description = string.format("[%s] just finsihed refueling at the tanker [%s], taken %.0f Lbs",client:GetPlayer() , tankerUnitName, UTILS.kg2lbs(clientFuelTaken)) local img = 'https://cdn10.picryl.com/photo/2004/10/03/a-us-navy-usn-f-14b-tomcat-aircraft-assigned-to-fighter-squadron-one-zero-three-f5f749-1024.jpg' local fields = { ['Pilot'] = client:GetPlayer(), ['Tanker'] = tankerUnitName, ['RefuelQty'] = string.format("%.0f Lbs", UTILS.kg2lbs(clientFuelTaken)) } local footer = 'Sorry, tomcats took it all again...' dcsbot.sendEmbed(title, description, img, fields, footer) end end end end Set_CLIENT_Bleu = SET_CLIENT:New():FilterCoalitions(coalition.side.BLUE):FilterOnce() jtff_log.debug(string.format("Nbre Blue Client : %i", Set_CLIENT_Bleu:Count()),"GENERAL") Set_CLIENT_Red = SET_CLIENT:New():FilterCoalitions(coalition.side.RED):FilterOnce() jtff_log.debug(string.format("Nbre Red Client : %i", Set_CLIENT_Red:Count()),"GENERAL")