LUCY "101" : prise en main - GdC-Framework/GdC_lib GitHub Wiki

A qui s'adresse ce tutoriel ?

Pour tirer profit de ce tutoriel, vous devez avoir envie de créer des missions Arma 3 et de comprendre la logique générale des scripts Arma. A part une connaissance minimale de l'éditeur Eden de Arma 3, aucune connaissance technique n'est requise.

A noter cependant que pour vous attaquer réellement à la création de missions en multijoueurs, des connaissances supplémentaires sont requises.

1. Premiers pas

Le présent tutoriel vise la simplicité pour favoriser la compréhension générale de Lucy. Il n'est pas applicable tel quel dans un contexte multijoueurs.

Faire spawner un groupe d'IA en jeu avec la console de débogage

Dans l'exemple qui suit, nous allons construire une mission simplissime, la lancer et faire spawner un binôme d'IA hostiles en passant une commande dans la fenêtre de débogage.

  1. Lancer l'éditeur Eden et créer une nouvelle mission. Pour cet exemple, il faut a minima :
    • une unité joueur BLUEFOR
    • un marqueur que nous appellerons marker_1 (placé à vue de la position de votre unité, mais pas trop près pour éviter de vous faire tuer immédiatement)
  2. Installer Lucy dans la mission comme vu ci-dessus
  3. Initialiser Lucy : dans le fichier init.sqf, copier la ligne [] call GDC_fnc_lucyInit;
  4. Lancer le scénario
  5. Une fois le jeu lancé, ouvrir la console de débogage (touche Echap)
  6. Dans la console, coller le code [] spawn {[getMarkerPos "marker_1", EAST, ["O_Soldier_F", "O_Soldier_F"]] call GDC_fnc_lucySpawnGroupInf;};, puis cliquer sur ExecLocal. Les unités hostiles devraient apparaître sur la position de marker_1.

Comme d'habitude dans Arma, la syntaxe de la commande est assez illisible pour le néophyte (voire pour les autres). Pas de panique, Mystery a prévu de nous simplifier la vie, nous verrons cela dans les prochaines étapes.

Faire spawner un groupe d'IA grâce à un déclencheur (trigger)

  1. Nommons donc l'unité joueur joueur1, en entrant dans les attributs de l'unité joueur : Objet:init>Nom de la variable: joueur1
  2. Dans la mission précédemment créée, ajoutons un déclencheur :
    • avec la condition du type "le joueur est vivant" : déclencheur:Expression>Condition: alive joueur1;
    • avec, lorsque la condition est remplie, l'action de spawn des unités hostiles : déclencheur:Expression>Quand Activation: [] spawn {[getMarkerPos "marker_1", EAST, ["O_Soldier_F", "O_Soldier_F"]] call GDC_fnc_lucySpawnGroupInf;};

Quelques explications

LUCY contient des fonctions permettant de spawner divers groupes ou unités (comme par exemple GDC_fnc_lucySpawnGroupInf) et/ou de gérer leurs déplacements (comme par exemple GDC_fnc_lucyAddWaypoint). La documentation complète se trouve sur ce même wiki. On peut appeler directement ces fonctions par la fenêtre de débogage (très utile pour les tests), par un déclencheur (trigger) ou encore le scripter dans un fichier dédié qui sera appelé par l'init.sqf.

2. Un truc plus amusant

Bon, tout ce que nous venons de faire est très facilement réalisable dans Eden et avec des scripts assez simples. Maintenant, commençons à exploiter la vraie valeur ajoutée de Lucy. Voici le topo : des unités patrouillent autour d'un point (notre fameux marker_1). Comme vous êtes un as de la gâchette, vous arriverez à les traiter sans prendre une balle. Mais voilà, la patrouille attaquée appelle des renforts... Et là, c'est une autre histoire !

Mise en place

Repartons de notre mission simplissime. Pour commencer, nous allons simplement faire spawner un groupe de deux éléments hostiles en patrouille autour de marker_1.

  1. Créer la zone de patrouille autour de marker_1 : dans Eden, insérez une élipse autour de marker_1 et nommez-là marker_patrouille.
  2. Dans le déclencheur précédemment créé, remplacez le code présent dans déclencheur:Expression>Quand Activation par : [] spawn { patrouille = [getMarkerPos "marker_1", EAST, ["O_Soldier_F", "O_Soldier_F"]] call GDC_fnc_lucySpawnGroupInf; [patrouille, 'marker_patrouille'] call GDC_fnc_lucyGroupRandomPatrol; };

Mais bon sang, qu'est-ce que tout ça veut bien dire ?

  • Il faut avant tout appeler la fonction avec []spawn {...};, comme cela est expliqué ici.
  • Vient ensuite [getMarkerPos "marker_1", EAST, ["O_Soldier_F", "O_Soldier_F"]] call GDC_fnc_lucySpawnGroupInf; Comme vu précédemment cette fonction fait spawner des unités sur un marqueur donné.
  • Ensuite on trouve [patrouille, 'marker_patrouille'] call GDC_fnc_lucyGroupRandomPatrol; qui fait patrouiller le groupe spawné par la commande précédente par des points de passage aléatoires dans la zone définie par le marqueur marker_patrouille.

Les renforts !

Au bout d'une minute, un véhicule blindé arrive et fonce droit sur vous. Très simple à faire avec Lucy. Voyons comment :

  1. Créer un marqueur marker_2 à l'endroit ou vous, joueur, spawnez. C'est sur ce marqueur que les renforts vont se ruer.
  2. Créer un second déclencheur qui spawnera les renforts au bout d'une minute. Paramétrez les attributs comme suit :
    • Entrez la condition du type "le joueur est vivant" : déclencheur:Expression>Condition: alive joueur1;
    • Entrez dans _déclencheur:Expression>Quand Activation:_[] spawn {veh_group = [getMarkerPos "marker_1", EAST,["O_MRAP_02_gmg_F"],["O_crew_F"],["O_crew_F"](/GdC-Framework/GdC_lib/wiki/"O_crew_F"),["O_Soldier_F", "O_Soldier_F"](/GdC-Framework/GdC_lib/wiki/"O_Soldier_F",-"O_Soldier_F"),true,0,15.0,["NONE", 0, 0]] call GDC_fnc_lucySpawnGroupVehicle;[veh_group select 0, getMarkerPos "marker_2", 10, "SAD", "NORMAL", "AWARE", "RED", "RANDOM"] call GDC_fnc_lucyAddWaypoint;};
    • Enfin , pensez à régler le délai à 60 secondes en entrant 60 dans les trois zones sous déclencheur:Chrono:

Là encore, comme précédemment, les explications du script sont assez simples :

  • On commence toujours par l'appel par []spawn {...};
  • Vient ensuite veh_group = [getMarkerPos "marker_1" ... ] call GDC_fnc_lucySpawnGroupVehicle; Cette fonction appelle des renforts en véhicule.
  • Ensuite,[veh_group select 0 ... ] call GDC_fnc_lucyAddWaypoint; envoie le véhicule sur le marqueur marker_2. Enfantin, non ?

3. Lucy pour de vrai

Comme cela a été signalé au début de ce tutoriel, les exemples donnés ne peuvent pas être utilisés en multijoueurs. Notamment, l'appel [] spawn {[getMarkerPos "marker_1", EAST, ["O_Soldier_F", "O_Soldier_F"]] call GDC_fnc_lucySpawnGroupInf;}; sera exécuté autant de fois qu'il y a de clients connectés et donc spawnera autant de groupes que de clients !

Lucy révèle sa puissance lorsqu'un Headless Client (HC) est disponible (un Headless Client est un client autonome qui prend en charge l'exécution des scripts et permet d'optimiser les performances en multijoueurs). Pour tirer profit du HC, il faut appeler un fichier de script contenant les appels aux fonctions Lucy par la commande GDC_fnc_lucyExecVMHC (lire la page de présentation de Lucy pour plus de détails). Par exemple, en reprenant les fonctions précédentes, créer un fichier lucy101.sqf et le placer dans le même répertoire que le script mission.sqf. Il suffit alors d'appeler la fonction ["lucy101.sqf"] call GDC_fnc_lucyExecVMHC;, soit à partir de la console de débogage, soit dans le init.sqf.

Les fonctions de Lucy offrent de nombreuses possibilités, bien au-delà de cet exemple très simple. Le tout, sans s'encombrer de tonnes de scripts complexes et délicats à maintenir. Lucy est orientée vers la réutilisabilité et la simplicité.

4. Pour aller plus loin...

...Il faudra vous rapprocher des hard-codeurs de la communauté Grèce de Canard, à commencer par le papa de Lucy, le mystérieux Mystery 😉. Une mission démo complète est disponible sur demande !