Manipulácia so zbraňami a muníciou
Z Armed Assault nápověda
Obsah |
Úvod
Pre pokročilejšie využívanie zbraní a munície v hre si naštudujte tento tutoriál a na záver mrknite aj do zdrojových kódov ukážkovej misie.
Som si istý že jedného dňa si pri tvorbe spomeniete že ste tu zahliadli niečo čo vám práve v tej chvíli pomôže.
Základné príkazy pre prácu so zbraňami tu nebudem uvádzať a ani rozpitvávať. Ich použitie je jednoduché, ale pre istotu ich tu aspoň uvediem:
removeAllWeapons, addWeapon, removeMagazines, removeMagazine, addMagazine, reload.
My sa teraz zameriame na už spomínané pokročilejšie hrátky s "ohňom":
Vytvorenie výbuchu alebo míny
Tento príkaz sa vám bude hodiť napríklad minimálne v prípade simulácie delostreleckého bombardovania. Pomocou príkazu createVehicle totiž môžete vytvoriť akýkoľvek druh dostupnej munície v hre.
Či sa bude jednať o obyčajný ručný granát, alebo priamo leteckú pumu, pomocou tohto príkazu efektívne zasiahnete presne určený cieľ, alebo len vystrašíte obrancov.
Ako jeden z parametrov príkazu je totiž pole ktoré obsahuje presné súradnice na ktorých sa daná munícia vytvorí - vybuchne.
Aby som to tu ale zbytočne neobkecával, ukážeme si pár príkladov:
bomba = "SH_125_HE" createVehicle position ciel;
- presne na mieste jednotky (vojak, vozidlo ...) s názvom "ciel" sa vytvorí delostrelecký granát
- ako vidíte na príklade, pole súradníc tu zastupuje príkaz position, ktorý ich načíta z aktuálnej pozície jednotky s názvom "ciel"
bomba = "SH_125_HE" createVehicle getMarkerPos "znacka";
- požadovanú muníciu môžeme taktiež vytvoriť na mieste markerov, ktoré môžu mať napíklad aj nulové rozmery - hráč ich neuvidí
- v tomto prípade je zasa pole súradníc značky s názvom "znacka", predávané prostredníctvom príkazu getMarkerPos
bomba = "SH_125_HE" createVehicle [ (position ciel select 0), (position ciel select 1) + 15, (position ciel select 2) ];
- a tu už vidíte priamo spomínané pole súradníc odvodené od pozície jednotky s názvom "ciel"
- odvodené z toho dôvodu, že sme výbuch chceli privodiť až cca 15 metrov od jednotky
Ďalším, bohužiaľ charakterom nedeštruktívnym príkazom, je príkaz createMine.
Pomocou neho vlastne iba rozmiestňujete míny po mape (samozrejme za pomoci súradníc - spôsobu uvedeného vyššie), ale o samotný výbuch sa už musíte postarať nejakým vlastným skriptom alebo spínačom ktorý vytvorí výbuch na mieste míny práve vtedy, keď sa splnia jeho podmienky. Napríklad prejazdom amerického tanku cez túto mínu v kombinácii s malým spínačom s detekciou nastavenou na jednotky strany WEST.
mina = createMine ["MineMine", position player, [], 0];
- mína sa vytvorí presne na pozícii hráča
Zobrazenie nesených zbraní a munície
Pre zobrazenie informácie aké zbrane a muníciu si hráč nesie so sebou, využijeme dva jednoduché príkazy s intuitívnym znením:
hint format ["Nesene zbrane: %1", weapons aP];
- pomocou príkazu hint zobrazíme pole ktoré bude obsahovať názvy všetkých nesených zbraní jednotky s názvom "aP"
hint format ["Nesena municia: %1", magazines aP];
- zobrazí sa pole so všetkými zásobníkmi ktoré si nesie jednotka s názvom "aP" so sebou
Má vojak danú zbraň alebo muníciu ?
Kontrola nesenej zbrane
Ak ste postave (hráčovi) určili presne danú zbraň a vyžadujete po nej aby túto zbraň aj neustále mala vo svojej výbave, použite príkaz hasWeapon.
Pomocou neho môžete neustále kontrolovať stav, či má stále jednotka vami vybranú zbraň vo svojom itinerári.
Príklad:
if ( not(player hasWeapon "AK74") ) then { hint "Nemas pridelenu zbran !"; aP addWeapon "AK74"; } else { hint "Presiel si kontrolou zbrane !"; };
- kontrolujeme stav, či má hráč vo svojej výbave zbraň s názvom "AK74" - ak áno, zobrazí sa správa "Presiel si kontrolou zbrane !" - ak ale nie, napríklad si ju zamenil počas boja, alebo ju len odložil na zem, zobrazí sa varovná správa a pridáme mu novú zbraň toho istého typu
Primárna vs. sekundárna zbraň
Pre rozlíšenie a detekciu primárnej (automatické pušky) a sekundárnej (raketomety) zbrane využijeme dva príkazy ktoré majú opäť intuitívne názvy:
hint format ["Primarna zbran: %1", primaryWeapon aP];
- zobrazí sa názov primárnej zbrane jednotky "aP"
hint format ["Sekundarna zbran: %1", secondaryWeapon aP];
- zobrazí sa názov sekundárnej zbrane jednotky "aP"
Malá ukážka kontroly primárnej zbrane:
if ( primaryWeapon aP == "AK74" ) then { hint "Hrac ma Kalsnikova !"; } else { hint "Hrac NEma Kalsnikova !"; };
- ak má hráč vo svojej výbave primárnu zbraň typu "AK74", zobrazí sa správa "Hrac ma Kalsnikova !", inak sa zobrazí druhá správa
Detekcia streľby
S nasledujúcim príkazom sa možno stretnete častejšie ako by ste čakali. Uplatnenie nachádza hlavne pri rôznych skriptoch slúžiacich pri stealth misiách.
Pomocou tohto príkazu totižto môžete okamžite detekovať či sa zakrádajúca jednotka alebo stráže v okolí prezradili streľbou.
EventHandler "Fired" sme totiž priradili k jednotke hráča a akonáhle hráč vystrelí, alebo hodí granát, EventHandler zachytí túto udalosť a podá nám správu na obrazovku vo forme hint-u.
Vy si potom môžete vo vlastnom skripte nahradiť toto zobrazenie nejakým kódom ktorý bude napríklad spúšťať alarm.
aP addEventHandler ["Fired", {hint format ["%1", _this]}];
- pole prvkov ktoré bude vytvorené EventHandlerom bude obsahovať nasledujúce prvky: * názov strielajúcej jednotky * typ zbrane * typ ústia zbrane * mód streľby * typ guľky
Výsledné riešenie by mohlo vyzerať takto:
hliadka addEventHandler ["fired",{if (_this select 1 in ["M16A2","M16A2","Single","B_556x45_Ball"]) then { PRÍKAZY PRE SPUSTENIE ALARMU }}];
- EventHandler zareaguje (a vykoná príkazy pre spustenie alarmu) v tom okamžiku ako hliadkujúci vojak vystrelí zo svojej M16-ky
- keď už bude raz alarm spustený, čiže bude hráč prezradený, môžeme EventHandler kľudne zmazať, aby sa pri nasledujúcej prestrelke už alarm nespúšťal znova a znova
hliadka removeEventHandler ["fired", 0];
- týmto príkazom odstánime jednotke s názvom "hliadka" aktuálny EventHandler
Natočenie zbrane
Nasledujúcim príkazom môžeme sledovať pohyb hlavne danej zbrane a to všetkých troch osiach. Výsledkom tohto príkazu je totiž pole obsahujúce dáta zo súradníc X, Y a Z.
Takže pre jednoduchosť:
hint format ["Smer: %1", player weaponDirection "AK74"];
- zobrazené bude kompletné pole
- nenachajte sa zmýliť meniacimi sa číslami aj pri nehybnej zbrani (aj má kontrolovanú zbraň vojak) - každému sa totiž trocha trasú ruky
Ak by ste chceli ale kontrolovať - merať pozíciu zbrane iba v danom smere, použite nasledujúci príklad:
hint format ["Vyska zbrane: %1", player weaponDirection "AK74" select 2];
- meraná bude iba osa Z
- pre osu X použite "select 0" a pre Y "select 1"
Určenie cieľa a jeho eliminácia
Dostávame sa k obľúbenej téme. Poprava zajatca. Nič zložitého, chce to len správny výber a zoradenie príkazov v rozumnom časovaní. Mrknite sa na tento malý príklad:
poprava.sqf
strelec reveal zajatec; titleText ["ZAMIERIT !","PLAIN"]; strelec doTarget zajatec; sleep 3; titleText ["PAL !","PLAIN"]; while { alive zajatec } do { strelec doFire zajatec; }; strelec doFire objNull; sleep 1; titleText ["ZLOZIT ZBRAN !","PLAIN"]; sleep 3; titleText [" ","PLAIN"];
Popis:
V prvom rade je potrebné (niekedy proste pre istotu) prezradiť (reveal) popravčej čate prítomnosť jednotky, ktorá má byť zastrelená. Ak by sme totiž hneď zapísali príkaz na streľbu na daný cieľ a strielajúca jednotka by o cieľovej už popredu nevedela, mohlo by jej niekoľko sekúnd trvať než by našla svoj cieľ, zamierila naň a nakoniec vystrelila.
Ďalším príkazom (doTarget) je donútená strielajúca jednotka zamieriť na daný cieľ.
Potom už len nasleduje jednoduchá slučka ktorá kontroluje stav (život) cieľovej jednotky. Strielajúca jednotka totiž obdržala príkaz (doFire) na streľbu do cielovej jednotky a to dovtedy pokiaľ táto nebude mŕtva.
Teda ak je cieľová jednotka mŕtva, podmienka v cykle (while) sa splní a začnú sa vykonávať ďalšie príkazy.
Hneď ďalší je na zastavenie streľby. Jednoducho sa iba strielajúcej jednotke zadá príkaz na streľbu na neexistujúcu jednotku (objNull), na čo samozrejme strelec zastaví streľbu.
A je to ... nič zložité, nie ?
Cvičné strelby
V prípade že potrebujete od nejakej jednotky iba jeden cvičný výstrel "jen tak na zdař bůh", využite príkaz fire:
vojak fire "M16A2";
- jednotka s názvom "vojak" vystrelí jednu ranu zo svojej zbrane a to bez mierenia na akýkoľvek cieľ
Na záver tu ešte uvediem pár zaujímavých príkladov:
special fire ["PipebombMuzzle", "PipebombMuzzle", "Pipebomb"];
- jednotka položí časovanú nálož
granatnik fire ["M203Muzzle", "M203Muzzle", "1Rnd_HE_M203"];
- z podveseného granátometu bude odpálený jeden granát
osvetlovac fire ["M203Muzzle", "M203Muzzle", "FlareGreen_M203"];
- z podveseného granátometu bude odpálená jedna zelená signalizačná svetlica
bombardak fire ["BombLauncher", "BombLauncher", "6Rnd_GBU12_AV8B"];
- Harrier s názvom "bombardak" zhodí jednu zo svojich bômb
Download
| ! |
Krátka ukážková misia (*.pbo archív a samostatné súbory): Download - nájdete ich ako priložený archív rovnakého tutoriálu v off-line ArmA Helpe |

