Využitie príkazu spawn
Z Armed Assault nápověda
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 |

