Minulý týden jsem shodou okolností narazil na to, že již loni byl do Arma 3 přidán nový event handler “KnowsAboutChanged“. Tak jsem našel svou x-tou verzi alarm systému, která se původně inspirovala v OFP misi “Hawk in Nets” od Silver Falcona (respektive Munch Studios) a kterou jsem později přetvořil pro Armed Assault a zkoušel i nadále udržovat v nějaké aktuální verzi i v pokračováních původního Flashpointu. Princip byl ale stále dosti podobný a víceméně hlavně s novým event handlerem se mi více podařilo upravit systém tak, abych se již zbavil všech smyček a celý ho postavil již jen na event handlerech.Systém navíc nově vytváří objekt logiky do kterého se nastaví všechny potřebné předané parametry vrátí ho po inicializaci s možností[…]

Tento skript vytvoří ve výchozím nastavení BLUFOR letoun, pilota a bod trasy, který má dá za úkol hledat nepřítele a ničit ho. K vytvoření dojde tři kilometry daleko od předané pozice, která tvoří jedinou povinnou položku volání. Dalšími volitelnými položkami je možné změnit stranu, typ letounu, pilota, nastavit případného střelce a výšku, ve které má létat. Zavolání skriptu pak vrátí objekt vytvořeného vozidla se kterým je možná následně pracovat. Příklady volání:

Pokud chcete svému vojákovi na rameno umístit jmenovku s aktuálním jménem hráče, pak díky novince, se kterou přišel update 2.12 (vydaný 28.2.2023) tak můžete díky faktu, že jako texturu lze nově použít přímo text. Příklad: Syntaxe pro vytvoření textové textury, jak ji uvádí BI Wiki, je: Nevýhoda uvedeného je v tom, že po sundání uniformy a nasazení jmenovka zmizí. To lze pořešit jedině uložením přes setVariable při inicializaci textury a následné znovunačtení při oblečení díky obsluze event handleru “Take”.

Jednoduchá krátká funkce, která po zavolaní a předání dvou parametrů (dělo či minomet a pozice) vystřelí dostupnou munici “tiše” na tuto pozici (zjištěnou přímo či například přes getPos, getMarkerPos,…). Podmínkou je, že první předaný objekt musí být “herně” funkční (mít střelce, munici a být ve správném dostřelu). Příklad volání:

Následující kód vytvoří jednoduchý spínač, který na pozici určenou prvním parametrem vytvoří spínač, jenž za sekundu zlikviduje všechny jednotky patřící straně nastavené v druhém parametru. Nepovinný třetí parametr určuje velikost oblasti. Výchozí je, jak je vidět 300 metrů.

Na základě dřívějšího zaznamenaní tohoto používání jsem se rozhodl přijmout názvosloví, kdy pro sadu příkazů nutnou volat přes příkaz spawn používám název “procedura”, kdežto pro sadu příkazů volaných příkazem call používám název “funkce” a patřičnou zkratku používám i v názvech. Tedy například:[soldier1,soldier2] spawn celo_proc_wait_for_visibile_contact;[soldier1] call celo_fnc_get_actual_guard_state; Pokud dojde omylem k vyvolání funkce zavoláním přes spawn, tak se nic zásadního neděje, kdežto obráceně nastává problém. Na základě tweetu Kilo bych rád upozornil na možnost vložit kontrolní kód na začátek procedury, který zjistí, že došlo k vyvolání přes call, ukončí patřičný skript a zavolá sám sebe správným způsobem if (!canSuspend) exitWith {_this spawn celo_proc_name_of_proc)};

Existuje relativně jednoduchý způsob jak vytvořit potlačující palbu AIčkem. Pro ni potřebujeme znát pozici na kterou bude střílet a která musí být viditelná pro AI. V příkladu umístíme například “logiku hry” s názvem “targetForJoe”, ale stačí klidně značka (a getMarketPos). Na jejím místě pak vytvoříme dočasný cíl a nastavíme ho jako cíl pro AI (v našem příkladu se jménem Joe). _target = “SuppressTarget” createVehicle getPos targetForJoe;createVehicleCrew _target;Joe doSuppressiveFire _target;

Kratší skript, který po svém zavolání za pomoci funkce BIS_fnc_moduleCAS vyvolá útok na předanou pozici. Povinná je právě jen pozice jako první parametr. Další lze zadat a tím upravit letoun (výchozí je “B_Plane_CAS_01_F”), typ použité munice (výchozí je 2, což znamená “Guns & Missiles) a úhel, ze kterého útok přijde (výchozí je 200). Příklady volání:

Vytvoření privátní hodnoty a její dostupnosti (closure) demonstrují následující příklady. V prvním případě v rámci “procedury” vyvolané spawn vytvoříme privátní proměnnou “_a”, která je dostupná i v samotných vnitřně vyvolaných funkcích. [] spawn { private _a = 0; [] call { systemchat format[“%1”,_a]; // “0” }; }; Oproti tomu druhý příkaz ukazuje, že privátní hodnota vytvořená ve funkci je pak následně ve vnitřně “spawnuté” proceduře nedostupná. [] call { private _a = 0; [] spawn { systemchat format[“%1”,_a]; // “any” }; };