Jump to content

ATME (1.46) : createNamedArea


CougarFFW04

Recommended Posts

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 by CougarFFW04
Link to comment
Share on other sites

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

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

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 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

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 by CougarFFW04
Link to comment
Share on other sites

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

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 by CougarFFW04
Link to comment
Share on other sites

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

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 by sunski34
Link to comment
Share on other sites

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

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...