CougarFFW04 Posted January 22, 2019 Share Posted January 22, 2019 (edited) Hello, Bon désolé pour l'avalanche de questions:lol: Mais fallait pas nous faire jouer avec :pilotfly: :smilewink: Alors voila concernant createNamedArea dans la doc il est dit que : L'aire peut être lée à une unité grâce au paramètre linkedUnit. et j'aurais aimé savoir si la zone est mobile avec l'unité a laquelle elle est liée ou si elle est positionnée "sur" l'unité au moment ou on définie la zone puis statique par la suite ? Je sais qu'une zone mobile est possible puisque je l'ai déjà programmé (il suffit de faire un update de la position chaque seconde) mais au cas ou, puisque je passe en ATME total :) autant le faire de A a Z. Si ca n'existe pas dans ATME c'est pas grave je garderais mon bout de code. Thanks Edited January 22, 2019 by CougarFFW04 Link to comment Share on other sites More sharing options...
sunski34 Posted January 22, 2019 Share Posted January 22, 2019 Elle est liée à l'unité donc bouge avec. Mais il y a des restrictions voir la doc pour ca. Link to comment Share on other sites More sharing options...
CougarFFW04 Posted January 22, 2019 Author Share Posted January 22, 2019 Elle est liée à l'unité donc bouge avec. Mais il y a des restrictions voir la doc pour ca. OK merci. Je regarderais plus en détail pour les restrictions :smilewink: Link to comment Share on other sites More sharing options...
snowsniper Posted January 22, 2019 Share Posted January 22, 2019 J ai un module wip traffic ai et un module case3 avec cette fonction arra linked to unit ca marche nickel pour detecter ce qui est dans un volume autour d une unite mouvante i7-10700KF CPU 3.80GHz - 32 GO Ram - - nVidia RTX 2070 - SSD Samsung EVO with LG TV screen 40" in 3840x2150 - cockpit scale 1:1 - MS FFB2 Joystick - COUGAR F16 throttle - Saitek Pro Flight Rudder Pedals Link to comment Share on other sites More sharing options...
CougarFFW04 Posted January 22, 2019 Author Share Posted January 22, 2019 Moi j'avais programmé ca pour mettre un vol en attente sur un waypoint jusqu'a ce que son escorte le rejoigne. Ca marchait nickel. Mais bon maintenant je passe tout en ATME. Du coup je perds un peu de temps pour tout recoder mais bon a terme ce sera payant en terme de lisibilité du code (puisque le bas niveau DCS est déporté dans ATME) et pour faire évoluer le code en complexité par la suite. ++ Link to comment Share on other sites More sharing options...
snowsniper Posted January 22, 2019 Share Posted January 22, 2019 (edited) un exemple ATME de cet usage mais en v145, je crois que ça a un peu évoluer le traitement des zones en 146, faut que je relise la doc aussi lol; notamment je crois que les sous zones ( ring circle ou autre) qu'on inclu a une area general ne sont plus nommées désormais car cela s'avère inutile, donc un parametre de moins dans la definition de ces sous zones. mis à part ça ... la logique d'usage reste vrai le link de l'area ici avec le player est la fonction thisModule:createNamedArea(areain,nplayer) -- creation d'une zone Aerea attachée au joueur / Create zone aerea linked to player / circle 40 Nm après on défini les sous zones qui composent cette area. Pour ce que tu veux faire ci dessus , tu peux regarder la tache escort, et aussi patrol --_______________________________________________________________________________________________ -- H A N D L E R F U N C T I O N S ---------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------- local function coreEventHandler(coreEvent) thisModule:output(coreEvent:getType(),1) if coreEvent:getType() == "AREA_GROUP_ENTERS" or coreEvent:getType() == "AREA_GROUP_LEAVES" then local datas = coreEvent:getDatas() local group = datas.group local trackingArea = datas.area local playername = datas.area:getLinkedUnitName() local groupname = group:getName() local NameArea = trackingArea:getName() local player = ATME.C_Player.getByName(playername) local AIunit = group:getFirstUnit() local typename = AIunit:getTypeName() if coreEvent:getType() == "AREA_GROUP_ENTERS" then player:display("Group:"..groupname.."/type: " ..typename.. "/enters tracking zone: "..NameArea,30) ATME.modules[moduleName][groupname] = (ATME.modules[moduleName][groupname] + 1) ATME.modules[moduleName].nbAi_outplayerzone = ATME.modules[moduleName].nbAi_outplayerzone - 1 ATME.modules[moduleName].nbAi_inplayerzone = ATME.modules[moduleName].nbAi_inplayerzone + 1 end if coreEvent:getType() == "AREA_GROUP_LEAVES" then player:display("Group:"..groupname.."/type: " ..typename.. "/leave tracking zone: "..NameArea,30) ATME.modules[moduleName][groupname] = (ATME.modules[moduleName][groupname] - 1) ATME.modules[moduleName].nbAi_outplayerzone = ATME.modules[moduleName].nbAi_outplayerzone + 1 ATME.modules[moduleName].nbAi_inplayerzone = ATME.modules[moduleName].nbAi_inplayerzone - 1 end player:display("value data for "..groupname.."="..(ATME.modules[moduleName][groupname]),10) player:display("nb avion dans une zone de joueur "..ATME.modules[moduleName].nbAi_inplayerzone,10) player:display("nb avion en dehors d' une zone de joueur "..ATME.modules[moduleName].nbAi_outplayerzone,10) end end ---------------------------------------------------------------------------------------- local function onCreatePlayer(player) thisModule:output(moduleName.." onCreatePlayer start ",1) -- debug helper for dcs log --action to perform when a new player join slot ( player var initialisation , player data table initialisation, etc ...) -- actions et fonctions à lancer lorsqu'un joeur rejoint la partie ( initialisation de variables propres au joeur, de table propre au joeur etc , ...) --create tracking zone relativ to player position local center = player:getPosition() local nplayer = player:getName() thisModule:output(nplayer.." nom du joueur ",1) local areain = nplayer.."_zone_traking_circle_40Nm" local areaout = nplayer.."_zone_traking_ring_40_60Nm" thisModule:output(areain.." nom de zone ",1) thisModule:output(areaout.." nom de zone ",1) thisModule:createNamedArea(areain,nplayer) -- creation d'une zone Aerea attachée au joueur / Create zone aerea linked to player / circle 40 Nm Areaplayer = thisModule:getAreaByName(areain) if Areaplayer:getClassName() == "C_Area" then thisModule:output("aire created"..areain,1) local circle = ATME.C_Circle(center,(ATME.convertNMtoM(40))) if circle :getClassName() =="C_Circle" then Areaplayer:add(nplayer.."trackzone1",circle) thisModule:output("circle added to "..areain,1) end end thisModule:createNamedArea(areaout,nplayer) -- creation d'une zone Aerea attachée au joueur / Create zone aerea linked to player / ring 40-60 Nm Areaplayer2 = thisModule:getAreaByName(areaout) if Areaplayer2:getClassName() == "C_Area" then thisModule:output("aire2 created"..areaout,1) local spawnzone = ATME.C_Ring(center, ATME.convertNMtoM(40) , ATME.convertNMtoM(60)) if spawnzone:getClassName() =="C_Ring" then Areaplayer2:add((nplayer.."trackzone2"),spawnzone) thisModule:output("ring added to "..areaout,1) end end --once aera and zone created, activate tracking for testing purpose on "testgroup" --local testGrp = ATME.C_Group.getByName("testgroup") --thisModule:addCoreEventCallback(testGrp, coreEventHandler) --Areaplayer:setGroupTracking(testGrp) --Areaplayer2:setGroupTracking(testGrp) player.modules[moduleName].target = ATME.C_CloningContext("AirTest") player.modules[moduleName].F10SubMenu = ATME.C_F10Menu(player,moduleName.." : spawn AirTest",thisModule) player.modules[moduleName].F10SubMenu:append(1,"test AI spawn" ,AItrafficSpawn,{player,(player.modules[moduleName].target)}) player.modules[moduleName].F10SubMenu:append(2,"test ground spawn" ,AIgroundSpawn,{player,(player.modules[moduleName].target)}) thisModule:output(moduleName.." onCreatePlayer end ",1) -- debug helper for dcs log end ---------------------------------------------------------------------------------------- --local function onDeletePlayer(player) --end ---------------------------------------------------------------------------------------- local function onUpdatePlayer(player) end ---------------------------------------------------------------------------------------- local function onTakeoffPlayer(player) thisModule:output(moduleName.." onTakeoffPlayer start ",1) -- debug helper for dcs log thisModule:output(moduleName.." onTakeoffPlayer end ",1) -- debug helper for dcs log end ---------------------------------------------------------------------------------------- --local function onLandingPlayer(player) --end ---------------------------------------------------------------------------------------- --local function onStartEnginePlayer(player) --end ---------------------------------------------------------------------------------------- --local function onStopEnginePlayer(player) --end ---------------------------------------------------------------------------------------- local function onSpawnGroup(group) thisModule:output(moduleName.." onSpawnGroup start ",1) -- debug helper for dcs log local groupname = group:getName() ATME.modules[moduleName][groupname] = 0 -- general variable for group spawned: number of player zone inside circle 40Nm. if 0 in none of player zone. ATME.modules[moduleName].nbAi_outplayerzone = ATME.modules[moduleName].nbAi_outplayerzone + 1 thisModule:addCoreEventCallback(group, coreEventHandler) -- add a specific callback for this group local Activplayers = ATME.getPlayers() -- for each activ player for x,playerX in Activplayers:pairs() do -- for each activ player local nplayer = playerX:getName() local areain = nplayer.."_zone_traking_circle_40Nm" Areaplayer = thisModule:getAreaByName(areain) -- retrieve specific Area for player ( Circle 40 Nm ) Areaplayer:setGroupTracking(group) -- activate tracking for this new spawned group ( event in function coreEventHandler) end thisModule:output(moduleName.." onSpawnGroup end ",1) -- debug helper for dcs log end Edited January 22, 2019 by snowsniper i7-10700KF CPU 3.80GHz - 32 GO Ram - - nVidia RTX 2070 - SSD Samsung EVO with LG TV screen 40" in 3840x2150 - cockpit scale 1:1 - MS FFB2 Joystick - COUGAR F16 throttle - Saitek Pro Flight Rudder Pedals Link to comment Share on other sites More sharing options...
CougarFFW04 Posted January 28, 2019 Author Share Posted January 28, 2019 (edited) Hello, Je fais une zone mobile de 10nm de rayon centrée et attaché sur un vol Donc pour la zone mobile je fais ca : -- Create an area linked to Lead Flight local areaNane = "areaArround_"..groupName local area = thisModule:createNamedArea(areaNane,ATME.C_AIUnit.getByName(groupName)) local circle = ATME.C_Circle(_Group:getPosition(), ATME.convertNMtoM(10)) area:add(circle) Mais est-ce que une aire de type Circle est une sphére ? Sinon comment créer une aire de détection qui serait une sphère (de même rayon que la zone cercle) ? Ou alors il faut faire une Box s'appuyant sur le cercle ? Pour ensuite dans une étape ultérieure détecter si un autre vol est dans cette zone en utilisant: Object:setGroupTracking(group) Au final ceci servirait entre autre de condition d’arrêt pour une tache par exemple avec un fonction qui retournerait "false" (=> arret de la tache) si un groupe ami est détecté dans la zone... Mais la je suis coincé par ca : https://forums.eagle.ru/showthread.php?t=231001 Edited January 29, 2019 by CougarFFW04 Link to comment Share on other sites More sharing options...
sunski34 Posted January 29, 2019 Share Posted January 29, 2019 Non ce n'est pas une sphère, mais un disque, comme dans l'éditeur de mission. Et donc le tracking se base sur la position dynamique associée de l'objet liée. Si tu veux une sphère, il existe une fonction isInSphere dans ATME.C_Group, qui va retourner true ou false, mais à gérer soi même. Tu as aussi isNear qui est un cylindre, même principe. Tu peux voir si tous les groupe est in ou au moins une unité du groupe. Voir la doc pour plus d'infos Espérant avoir été clair. A+ Sunski Link to comment Share on other sites More sharing options...
CougarFFW04 Posted January 29, 2019 Author Share Posted January 29, 2019 (edited) Oui parfaitement clair. Bon je pourrais faire un truc comme ca et mettre la fonction updatePos dans le onTimer : function detectUnit(_foundItem, _val) local unit = Object.Category.UNIT local pilot = foundItem:getName() local groupName = _foundItem:getGroup():getName() trigger.action.outText(groupName .. "\t" .. pilot .. " IN " .. val .. " ZONE", 1) end function updatePos(_flight) local volS = { id = world.VolumeType.SPHERE, params = { point = mist.getLeadPos(_flight), -- sphere.point, radius = 1500 -- sphere.radius } } local posit = mist.getLeadPos(_flight) world.searchObjects(Object.Category.UNIT, volS, detctUnit, _flight) end Ca marche mais c'est pas très pratique et en plus de mixer les fonctions DCS, Mist ca ne sera pas aussi bien optimisé que ATME :music_whistling::music_whistling: Oui je flatte, je flatte :D C'est pour mettre en condition pour ce qui est dessous :megalol: Du coup je me demandais si il serait possible dans une version 1.47+ d'implémenter la détection dans une sphère avec des événements core associés aux entrées/sorties dans une telle zone :smartass: Ca pourrait etre pratique pour plein de choses :music_whistling: Qui ne demande rien n'a rien :D:D Edited January 29, 2019 by CougarFFW04 Link to comment Share on other sites More sharing options...
sunski34 Posted January 30, 2019 Share Posted January 30, 2019 Salut, la même mécanique est utilisée pour les fonctions de classe getGroupsInAreaForAll par exemple, classe ATME.C_Group Aussi, creer deux fonctions nouvelles getGroupsInSphereForAll et getGroupsInSphereForCoalition est faisable oui. Je retiens l'idée pour la prochaine version. En attendant tu peux utiliser ton code, et dans ce cas, seule la fonction mist.getLeadPos doit pouvoir etre remplacée pour ne pas utiliser mist. A+ Link to comment Share on other sites More sharing options...
CougarFFW04 Posted January 30, 2019 Author Share Posted January 30, 2019 Aussi, creer deux fonctions nouvelles getGroupsInSphereForAll et getGroupsInSphereForCoalition est faisable oui. Je retiens l'idée pour la prochaine version. You ROCK :thumbup: Link to comment Share on other sites More sharing options...
sunski34 Posted February 2, 2019 Share Posted February 2, 2019 (edited) Ok c'est fait dans la version en Work In Progress, mais j'ai renommé ... le get.... devient find... pour ces fonctions et j'ai ajouté la possibilité de mettre une callback qui sera appelée pour chaque unité trouvée (addFindGroupsCallback). La callback pourra être modifiée quand on veut, ou remise à nil par removeFindGroupsCallback. Elle prendra deux paramètres, le groupe et l'unité. A suivre pour la release. Edited February 2, 2019 by sunski34 Link to comment Share on other sites More sharing options...
CougarFFW04 Posted February 2, 2019 Author Share Posted February 2, 2019 Ok c'est fait dans la version en Work In Progress, mais j'ai renommé ... le get.... devient find... pour ces fonctions et j'ai ajouté la possibilité de mettre une callback qui sera appelée pour chaque unité trouvée (addFindGroupsCallback). La callback pourra être modifiée quand on veut, ou remise à nil par removeFindGroupsCallback. Elle prendra deux paramètres, le groupe et l'unité. A suivre pour la release. :thumbup::thumbup::thumbup::thumbup::thumbup::thumbup::thumbup: :pilotfly::pilotfly::pilotfly: MERCI Link to comment Share on other sites More sharing options...
sunski34 Posted February 2, 2019 Share Posted February 2, 2019 Finalement, il y aura deux niveaux pour la callback, soit 1 appel par groupe soit un appel par unité avec respectivement en paramètre le groupe ou l'unité. Link to comment Share on other sites More sharing options...
CougarFFW04 Posted February 2, 2019 Author Share Posted February 2, 2019 :beer::rotflmao::yay::clap: Link to comment Share on other sites More sharing options...
sunski34 Posted February 2, 2019 Share Posted February 2, 2019 Pour CougarFFW04 : Je t'ai envoyé un mail avec les missions et la WIP. Fais moi un retour par mail. Link to comment Share on other sites More sharing options...
CougarFFW04 Posted February 3, 2019 Author Share Posted February 3, 2019 Hello, Vu. Je test dés que possible et je te réponds. ++ Link to comment Share on other sites More sharing options...
Recommended Posts