Využitie príkazu spawn

Z Armed Assault nápověda

Přejít na: navigace, hledání

Obsah

Úvod

Příkaz o kterém byste měli vědět a který přišel s první verzí ArmA: Armed Assault je příkaz spawn.
Tímto příkazem můžete velmi snadno paralelně spouštět různé kódy aniž byste museli čekat na jejich dokončení. Může se vám to zdát zbytečné a matoucí, ale výsledek je přesně opačný.
Pomocí tohoto příkazu můžete udržovat funkčnost mise v jednom hlavním skriptu a samotné části kódu, které jste předtím pouštěli ve více skriptech paralelně a které byli různě provázané, je možné udržovat přehledně na jednom místě.
Není tak nutné kvůli každé hlouposti vytvářet a pouštět další externí skripty.

Pro definici příkazu mrkněte sem.

Nejlepší je ale asi uvést nějaký příklad.

Příklad

Mějme tedy jednoduchou misi, kde musí hráč v roli pozorovatele dorazit na kopec a odtud se nahlásit velitelství operace. Dle následného rozkazu bude hlídat údolí a hlásit všechna nepřátelská vozidla. Ze severu mezitím vyrazí nepřátelská kolona několika tanků.
Po jejch zpozorování hráčem a ohlášení situace rádiem, jsou vyslány helikoptéry které je mají zničit.
Pokud dojde ke zničení kolony označí se mise za úspěšnou. V ostatních případech (nezpozorování kolony hráčem či zničení všech helikoptér) je mise označena za neúspěšnou.

Následující kód je příkladem, jak lze takovou misi řešit ...

init.sqf

// --- nastaveni globalnich promenych pro ukonceni mise
mise_uspesna = false;
mise_neuspesna_helikoptery = false;
mise_neuspesna_tanky = false; 

private ["tanky","helikoptery","papa_bear","hlidka"];

tanky = group TANK1; // TANK1 - nazev tanku definovaneho v editoru
helikoptery = group COBRA1; // COBRA1 - nazev helikoptery definovane v editoru
hlidka = group player;
papa_bear = [west,"PAPA_BEAR"];

// ---- zacatek mise
[] spawn {
        sleep 1;

        // --- vytvoreni WP pro hrace na danou kotu na mape
        hlidka addWaypoint [position KOTA,0]; // KOTA - pozice definovana v editoru 

        [hlidka, 1] setWaypointSpeed "NORMAL";
        [hlidka, 1] setWaypointBehaviour "STEALTH";
        [hlidka, 1] setWaypointCombatMode "RED";
        [hlidka, 1] setWaypointType "MOVE";

        // --- vytvoreni WP pro skupinu nepratelskych tanku
        tanky addWaypoint [position UDOLI,0]; // UDOLI - pozice definovana v editoru 

        [tanky, 1] setWaypointSpeed "LIMITED";
        [tanky, 1] setWaypointBehaviour "AWARE";
        [tanky, 1] setWaypointCombatMode "YELLOW";
        [tanky, 1] setWaypointType "MOVE";
        [tanky, 1] setWaypointFormation "COLUMN";
     };

// ---- komunikace po dorazeni hrace na kopec
[] spawn {
        waitUntil {player distance KOTA<40};
           sleep 5;
        player sideChat "Crossroad, tady Alfa. Jsme na kote 314.";
           sleep 5;
        papa_bear sideChat "Crossroad Alfe. Najdete si vhodnou pozici a pozorujte deni v udoli. Hlaste jakykoliv pohyb nepritele. Do niceho se zatim nepoustejte.";
     };

// ---- komunikace po detekci tanku hracem
[] spawn {
        waitUntil {{player knowsAbout vehicle _x>0} count units tanky>0};
        player sideChat "Crossroad, tady Alfa, slysite me ? Udolim se k nasi pozici blizi nepratelska obrnena technika.";
           sleep 5;
        papa_bear sideChat "Tady Crossroad. Posilame helikoptery. Vydrzte na miste a kontrolujte situaci.";
           sleep 8;
        player sideChat "Rozumim, budeme vas informovat";

        // --- vytvoreni dynamickeho WP helikopteram
        helikoptery addWaypoint [position leader tanky,0];

        [helikoptery, 1] setWaypointTimeout [1,3,2];
        [helikoptery, 1] setWaypointSpeed "FULL";
        [helikoptery, 1] setWaypointBehaviour "COMBAT";
        [helikoptery, 1] setWaypointCombatMode "RED";
        [helikoptery, 1] setWaypointType "DESTROY";
     };

// ---- doresení konce mise (uspech i neuspech)
[] spawn {
        waitUntil {({canMove vehicle _x} count units tanky==0) OR ({canMove vehicle _x} count units helikoptery==0) OR ({vehicle _x distance UDOLI<20} count units tanky>0)};
           sleep 3;

        try {
              if ({canMove vehicle _x} count units helikoptery==0) then {throw "heliny out"};
              if ({vehicle _x distance UDOLI<20} count units tanky>0) then {throw "tanky projely"};

              // ---- komunikace pri zniceni celeho konvoje nepratelskych tanku
              leader helikoptery sideChat "Crossroad, hlasime vyrazeni nepratelske techniky.";
                 sleep 7;
              papa_bear sideChat "Tady Crossroad. Rozumim. Alfo, muzete to potvrdit ?";
                 sleep 7;
              player sideChat "Crossroad, tady Alfa. Potvrzujeme zniceni nepratelske techniky";
                 sleep 7;
              papa_bear sideChat "Dobra prace.";
                 sleep 5;

              // --- uspesne ukonceni mise pres spinac Konec c.1
              mise_uspesna = true;

           } catch {

              // ---- komunikace pri zniceni vsech helikopter 
              if (_exception == "heliny out") then {
              player sideChat "Crossroad, tady Alfa. Prisli jsme o helikoptery !";
                 sleep 7;
              papa_bear sideChat "Tady Crossroad. Rozumim, stahnete se.";
                 sleep 5;

              // --- neuspesne ukonceni mise pres spinac Konec c.2 
              mise_neuspesna_helikoptery = true; };

              // ---- komunikace pri projeti nepratelskych tanku 
              if (_exception == "tanky projely") then {
              papa_bear sideChat "Crossroad Alfe. Nepratelske tanky projely. Stahnete se.";
                 sleep 5;

              // --- neuspesne ukonceni mise pres spinac Konec c.3
              mise_neuspesna_tanky = true; };

           };
     }; 

Popis
Najskôr máme na začiatku skriptu zadefinované všetky globálne a lokálne premenné s ktorými budeme pracovať. Na definíciu lokálnych premenných (v súboroch *.sqf) sme použili príkaz private.

Po spustení misie sa teda spustí automaticky aj skript "init.sqf" a začnú sa paralelne vykonávať jednotlivé príkazy spawn s vlastnými kódmi uzavretými v zložených zátvorkách - {};.

V prvom kroku sa jednoducho vytvorí waypoint pre hráčovu skupinu a zároveň pre skupinu SLA tankov.
Zároveň s týmto sa čaká v druhom procese pomocou príkazu waitUntil až hráč dosiahne stanovenej pozície s označením "KOTA".
Ďalej sú pomocou toho istého príkazu kontrolované aj ďalšie dva paralelne spustené procesy - detekcia tankovej kolóny hráčom a jednotlivé ukončenia misie.
Pokiaľ sa teda nesplnia ich podmienky, hra bude v týchto ďalších prípadoch neustále čakať na ich splnenie.

Po dorazení hráča na "kótu", resp. do jej blízkosti (menej ako 40m) sa prehrá krátka rádiová komunikácia a hra ďalej paralelne kontroluje už iba podmienky pre detekciu obrnenej kolóny a jej zničenia resp. úniku helikoptéram.

Zbytok skriptu je už iba rutina. Ak je kolóna detekovaná hráčom (knowsAbout), znova sa prehrá krátka rádiová komunikácia a v zápätí na to sa čakajúcim helikoptéram niekde na letisku vytvorí nový "dynamický" waypoint.
Dynamický už len z toho dôvodu, že je helikoptéram predaná koncová pozícia tohto waypointu ako pozícia vedúceho kolóny tankov.

Pomaly sa blížime k záveru. Hra teraz už iba kontroluje podmienku posledného príkazu spawn.
Jedná sa o súčasnú kontrolu (or) stavu tankov z kolóny (canMove), stavu útočiacich helikoptér (canMove) a vzdialenosti (distance) kolóny tankov od cieľovej pozície "UDOLI".

Ak je splnená jedna z týchto podmienok, hra pokračuje ďalej v skripte a následne vyhodnocuje konkrétny stav pomocou throw.

Pre lepšie vysvetlenie:

  • ak sú zničené útočiace helikoptéry, skript "vyhodí" výnimku (exception) definovanú ako "heliny out" a prejde na catch blok ktorý vyhodnocuje práve tento stav. Tu sa prehrá krátka rádiová komunikácia a misia sa neúspešne skončí
  • ak aspoň jeden z tankov pôvodnej kolóny (alebo aj všetky) v poriadku prešiel celým údolím až na pozíciu "UDOLI", skript "vyhodí" výnimku "tanky projely" a taktiež prejde na catch blok ktorý vyhodnocuje zasa tento stav. Taktiež sa prehrá krátka rádiová komunikácia a misia skončí iným neúspešným koncom
  • ak ale nenastane ani jedna z týchto dvoch podmienok (pričom hra postúpila ďalej v tomto skripte vďaka splnenej prvej podmienke pri waitUntil)
...il {({canMove vehicle _x} count units tanky==0) OR ({ca... 

... prehrá sa už iba krátka rádiová komunikácia s témou splnenia úlohy a misia sa končí úspešne:

mise_uspesna = true; 

Dúfam že som celý spôsob spracovania a vyhodnocovania jednotlivých blokov skriptu popísal dostatočne zrozumiteľne, každopádne ak budete mať niekedy s niečím podobným problém, neváhajte sa (rozumne) spýtať na oficiálnych BI fórach alebo na Ruprtovej poradne k OFP a ArmA.

Download

 !

Krátka ukážková misia (*.pbo archív): Download - nájdete ju ako priložený archív rovnakého tutoriálu v off-line ArmA Helpe

Osobní nástroje