Ce code à pour but de faire venir un hélicoptère pour s'extraire
d'un endroit et de situer sur la carte le point où on demandera au pilote de nous déposer.
Dans l'éditeur insérer un marquer nommé mk_heli.
Se sera l'endroit d'où l'helico se créé et décollera
Insérer une nouvelle action dans le menu action.
idx_action = player addAction ["Extraction en Helico", "evac.sqf",[],-1,false];
On pourrait imaginer placer ce code dans le champs Init du joueur dans l'éditeur, ou bien sur un déclencheur radio. etc…
private ["_p","_gp","_posP","_nearest","_sortie","_nobjects"]; //Quelques variables locales _p= _this select 0; // _p contient le joueur qui a activé le script _gp= group _p; // _gp contient le groupe du joueur _posP=position _p; // _posP contient la position du joueur _p removeAction idx_action;//On retire l'action sur la roulette pour éviter de déclencher le script x fois de suite sleep 1;//On calme un peu le jeu [WEST,"HQ"] sideChat "HQ : Reçu pour votre demande d'évacuation, nous vous envoyons Delta 4 dès que possible. Terminé"; sleep 15; _pos=getMarkerPos "mk_heli"; //Récupération de la position du marker pour savoir où créer l"helico /*On créé un marqueur sur la map à l'emplacement du joueur. Juste pour faire beau. * et montrer au joueur que l'on a bien pris en compte son clique */ _marker = createMarker ["EVAC", _posP ]; _marker setMarkerShape "ICON"; _marker setMarkerType "MOVE"; _marker setMarkerText "Evacuation héliportée"; //Creation de l'helico helico = "UH60MG" createVehicle _pos; //On ajoute à l'hélico un eventHandler pour savoir quand quelqu'un monte dedans p=_p; Evt = helico addEventHandler ["getin", {if (_this select 2 == p) then {in_board=true};}]; //On lui ajoute un eventHandler pour savoir quand quelqu'un en descend Evt = helico addEventHandler ["getout", {if (_this select 2 == p) then {in_board=false};}]; //On créé le pilote "SoldierWPilot" createUnit [[(_pos select 0)+2,(_pos select 1)+2,(_pos select 2)], _gp," driver1=this;",0.9,"sergent"]; driver1 groupChat "Delta 4 : Bonjour. Ok pour l'évacuation. Je met en route et j'arrive !!!"; driver1 moveInDriver helico; //On fait monter le pilote dans l'helico driver1 action ["engineOn", helico]; //On met le moteur de l'hélico en route driver1 doMove (_posP); //On envoi le tout vers la position du joueur /* On prepare une petite boucle qui va tester si l'helico arrive dans une zone proche du joueur (1000m) */ _sortie=false; while {(alive _p) && (!_sortie)} do { _nearest = objNull; // On cherche les objets aériens dans un périmètre de 1000 m _nobjects = nearestObjects [_p, ["Air"],1000]; sleep 0.1; //Si on a trouvé au moins un objet if (count _nobjects > 0) then { _nearest = _nobjects select 0; //On regarde s'il correspond à notre hélico if( _nearest==helico)then { sleep 0.1; //On sort de la boucle _sortie = true; }; }; }; //L'hélico est sur la zone sleep 14; //On calme un peu le jeu driver1 groupChat "Delta 4 : Dégagez la zone, je descend !!!"; helico flyInHeight 2; //On demande à l'hélico de se positionner à quelques mettre du sol //On attent que le joueur monte dans l'helico. //C'est l"eventHandler qui règle le tout. Quand le joueur monte dans l'helico la variable in_board est mise à true. waitUntil{in_board}; // On attend que le joueur monte driver1 groupChat "Delta 4 : Bienvenue à bord."; // Il est à bord sleep 1; //On indique au joueur de cliquer sur la map pour savoir où il faudra se rendre driver1 groupChat "Delta 4 : Cliquez sur la carte pour sélectionner le point où vous voulez vous rendre"; map_click=false; onMapSingleClick "newpos=_pos;map_click=true;onMapSingleClick """";"; waitUntil{map_click}; //On attend qu'il clique //Quand il a cliqué, la position est rangée dans la variable newpos //On créé un marqueur à l'emplacement du clique. Il se sert à rien, c'est juste pour faire beau //et pour montrer au joueur qu'on a bien pris son clique en compte _marker = createMarker ["DEPOSE", newpos]; _marker setMarkerShape "ICON"; _marker setMarkerType "FireMission"; _marker setMarkerText "Dépose héliportée"; sleep 2; helico flyInHeight 50; //On demande à l'helico de reprendre de l'altitude driver1 doMove (newpos); //On demande au pilote de se rendre à l'endroit cliqué sur la carte /* On prepare une petite boucle qui va tester si l'helico arrive dans une zone proche du joueur (1000m) */ _sortie=false; while {(alive _p) && (!_sortie)} do { _nearest = objNull; _pos=getMarkerPos "DEPOSE"; _nobjects = nearestObjects [_pos, ["Air"],1000]; sleep 0.1; if (count _nobjects > 0) then { _nearest = _nobjects select 0; if( _nearest==helico)then { sleep 0.1; _sortie = true; }; }; }; sleep 14; driver1 groupChat "Delta 4 : Sur zone. Attention à la marche en descendant !"; helico flyInHeight 1; //On descend l'altitude de l'hélico //On attend que le joueur descend //C'est le evntHandler initialisé au démarrage qui nous l'indiquera waitUntil{!in_board}; _p groupChat "Merci pour la promenade Delta 4, bon retour !"; helico flyInHeight 50;//Le joueur est descendu, on demande à l'hélico de repartir driver1 doMove ([1,1,50]);//On expédie l'hélico à tataouine les bains //On efface les marquer qu'on avait mis sur la carte pour faire joli. deleteMarker "EVAC"; deleteMarker "DEPOSE"; sleep 60; //on attend un peu que l'helico s'éloigne //quand il est assez loin, on l'efface ainsi que son pilote deleteVehicle driver1; deleteVehicle helico; //On redonne au joueur l'action qui permet de redemander une évacuation idx_action = _p addAction ["Extraction", "evac.sqf",[],-1,false]; if (true) exitWith {}; //C'est fini, on quitte le script
Le joueur est le seul paramètre du script
—- clint 21/03/2009 23:24