Brtův eventHandler tutoriál

v.1.0 pro OFP v.1.91cz

Použití: nositel addEventHandler ["event",{akce po spuštění}]
event: Killed, Hit, Engine, GetIn, GetOut, Fired, IncomingMissile, Dammaged, Gear, Fuel, Init
Eventhandlery umožňují tvůrci mise (od verze 1.85) spustit nějakou akci, právě tehdy, když se stane určitá událost (angl. event). Všechny eventhandlery (EH) vrací pole parametrů. V akci po spuštění se na něj odkazuje podobně jako ve scriptech pomocí _this . Jako první v poli (_this select 0) je vždy název jednotky, ke které je EH přirazen (nositel).
Na jedné jednotce může byt i vícero EH. Většina EH se po smrti nositele stane nepoužitelnou. EH se dají odstranit příkazy removeAllEventHandlers a removeEventHandler. V MP zustávají EH na mrtvole, nepřenáší se na respawnutého vojáka. Ale dá se využít toho, že si respawnutý voják ponechává svoje jméno.
EH jsou v případech, které ošetřují, výhodnější než běžné příkazy editoru. Např. se nemusí celou hru monitorovat zda je jednotka živá, zda je prázdná nadrž apod. Eventhandler se spustí právě tehdy, když daná situace nastane a navíc poskytne parametry, které by se jinak těžko zjišťovaly. Např. kdo koho zabil nebo zasáhnul a kam, kdo vystoupil z určité pozice ve vozidle, kdo jakou zbraní vystřelil.
Ale EH se, do verze 1.91cz, bohužel stávají nepoužitelnými, pokud je mise uložena a později nahrána. Tato chyba je opravena až ve verzi 1.94beta.

událost: parametr0[typ], parametr1[typ], parametr2[typ] ...

Spuštění: co spustí akci daného EH
Popis EH:
událost: Killed, Hit, Engine, GetIn, GetOut, Fired, IncomingMissile, Dammaged, Gear, Fuel, Init
typ: objekt - objekt ve hře (voják, vozidlo, budova)
       řetězec - text (ohraničený uvozovkami)
       bool - true/false (pravda/nepravda)
       číslo - reálné číslo
Příklad:
nositel addEventHandler ["event",{akce po spuštění}]
Podmínka editoru: Jaká jednoduchá podmínka by se musela kontrolovat v editoru, aby ošetřila stejnou událost bez použití EH. Takto podmínka je však dost nepružná. Je u ní potřeba znát, nebo zajistit, určitý výchozí stav. EH je díky parametrům pružný.
 

Killed: nositel[objekt], zabiják[objekt]

Spuštění: zabití/zničeni nositele
Pomocí tohoto EH se dá zjistit, kdo byl vrahem (zabil/zničil) nositele.
Příklad:
kdo zabil rukojmí?
rukojmi addEventHandler ["killed",{_this exec "vrah.sqs"}]
vrah.sqs
_mrtvy=_this select 0
_vrah=_this select 1
?_mrtvy!=rukojmi:exit
cutText [format ["%1 zabil rukojmí!",name _vrah],"plain down"]
Podmínka editoru: !alive (nositel)
 

Hit: nositel[objekt], střelec[objekt], poškozeni[číslo]

Spuštění: zasažení nositele
Zjištěni, jak moc střelec poškodil nositele. Za poškozeni se bere jen zásah, který může jednorázově nositeli způsobit znatelnější zranění (určitě větši jak 0.016 . Takže na člověka to je jakákoli zbraň, ale u aut (až na trabant) a lehčí obrněné techniky je ignorována střelba z ručních zbrani. U těžké techniky jsou ignorovány i granáty.
Pokud bude jednotka poškozena zásahem za 0.3, tak ji bude zbývat 0.7 života (příkaz damage).
Příklad:
ohlášeni poraněni vojáka ve skupině:
vojak addEventHandler ["hit",{_this exec "zasah.sqs"}]
zasah.sqs
_ja=_this select 0
_ja groupChat format ["Dostal jsem to!"]
Podmínka editoru: damage nositel > X
 

Engine: nositel[objekt],motor[bool]

Spuštění: zapnuti/vypnuti motoru u vozidla (nositele)
Detekce zapnutí (motor=true) nebo vypnutí (motor=false) motoru vozidla.
Příklad: 
Spuštění bomby po otočení klíčku (nastartováni motoru)
vozidlo addEventHandler ["engine",{_this exec "bum.sqs"}]
bum.sqs
_vozidlo=_this select 0
_nastartoval=_this select 1
?nastartoval:_vozidlo setdamage 1
Podmínka editoru: fuel vozidlo < X
 

GetIn: nositel[objekt], pozice[řetězec], nasedající[objekt]

Spuštění: kdokoli nastoupil do vozidla (nositele)
Detekuje, zda někdo nastoupil do vozidla a udává na jakou pozici (driver, cargo, gunner) nasednul. Ale už nezahlásí, jestliže člověk uvnitř vozidla změní svoji pozici. Jednoduše proto, že neprovede akci nastoupeni, ale akci změna pozice, pro kterou EH není.
Příklad:
když hráč vleze do tanku jinam, než na pozici střelce, tak je z tanku vyhozen a je mu dána hláska, ať nastoupí jako střelec.
tank addEventHandler ["getin",{_this exec "padej.sqs"}]
padej.sqs
_tank=_this select 0
_pozice=_this select 1
_kdo=_this select 2
?_kdo!=player:exit
?_pozice=="gunner":exit
hint "Vlez si ke kanónu!"
~1
player action["eject", _tank]
unassignVehicle player
Podmínka editoru: count crew nositel > X
 

GetOut: nositel[objekt], pozice[řetězec], vysedající[objekt]

Spuštění: vystoupeni z vozidla (nositele)
Obdoba EH GetIn, ale pro vystupováni. Detekuje vystoupeni z vozidla a z jaké pozice (driver, cargo, gunner) se vystoupilo.
Podmínka editoru: count crew nositel < X
 

Fired: nositel[objekt], zbraň[řetězec], hlaveň[řetězec], mód střelby[řetězec], střela[řetězec]

Spuštění: Když nositel vystřelí. Za výstřel se bere i hozeni granátu či  dýmovnice a i položení miny nebo nálože.
 zbraň: název zbraně. Throw pro hození ručního granátu nebo dýmovnice; Put pro pokládání min a výbušnin
 hlaveň: většinou shodná s názvem zbraně. Jiná je snad jen u střelby z podvěšeného granátometu.
 mód střelby: Single, Burst, FullAuto pro ruční zbraně; HandGrenade pro ruční granát; Flare pro vystřeleni světlice
 střela: název projektilu ve hře. Tzn. ne název zásobníku používaného příkazem addMagazine. Využitelné pro detekci střely pomoci příkazu nearestObject.
Pokud se má kontrolovat střelba z techniky, tak je potřeba dát EH technice a ne jejímu střelci. Výstřel provede technika, střelec "jen" mačká spoušť.
Na přesné zjišťování všech hodnot, zvláště u addonovych zbrani a techniky, doporučuji přiklad:
player addEventHandler ["fired",{hintC format ["%1",_this]}]
Podmínka editoru: nositel ammo "Y" < X
 

IncomingMissile: nositel[objekt], střela[retezec], střelec[objekt]

Spuštění: vystřelení řízené střely (angl. missile) nebo neřízené rakety (angl. rocket) na zaměřeného nositele.
Zaměřením se rozumí to, že má střelec cíl v zaměřovacím rámečku. Není potřeba na cíl mířit (čtverec doplněn kosočtvercem).
V obtížnosti kadet (cadetmode) tento EH detekuje i výstřel raketometčíka, jelikož je mu umožněno automatické zaměřeni raketometu Carl Gustav a AT4.
 střela: název projektilu ve hře - stejně jako u EH Fired
Příklad:
upozornění na vystřelení rakety (samozřejmě po zaměřeni) na tank
tank addEventHandler ["incomingmissile",{_this exec "raketa.sqs"}]
raketa.sqs
_terc=_this select 0
_strela=_this select 1
_strelec=_this select 2
hint format["%3 vystřelil %2 na %1 !",_terc,_strela,_strelec]
Podmínka editoru: neexistuje
 

Dammaged : nositel[objekt], poškozená část[řetězec], poškození části[číslo]

Spuštění: poškození nějaké části jednotky. Využitelné hlavně u lidských jednotek.
Poškozená část je třeba u džípu "pravý zadní tlumič". Jeho poškození může mít hodnotu 0 až 1. Podobně tak jako poškození celé jednotky. Ale úplně zničený tlumič (hodnota 1) neznamená úplně zničený džíp. Ten je jako celek poškozený třeba jen na hodnotu 0.2. Ale u vojáka je kompletní poškození hlavy ("hlava",1) zároveň jeho smrti.
EH dammaged zůstává aktivní i po smrti jednotky. Nepoužitelným se stává, až když jsou všechny části nositele zničeny (poškozeny na uroveň 1).
Příklad:
objeví se hláška, když je voják zasažen do hlavy
vojak addEventHandler ["dammaged",{_this exec "headshot.sqs"}]
headshot.sqs
_vojak=_this select 0
_kam=_this select 1
?_kam!="hlava":exit
cuttext [format["%1 byl zasažen do hlavy!",_vojak],"plain down"]
Podmínka editoru: neexistuje
 

Gear: nositel[objekt], podvozek[bool]

Spuštění: zatáhnutí nebo vysunuti podvozku u letounu.
Když letoun podvozek vysune, parametr podvozek je nastaven na true. Naopak, když letoun podvozek zasune, nastaví se hodnota false.
Příklad:
Ohlášení vysunuti/zasunuti podvozku
letadlo addEventHandler ["gear",{_this exec "podvozek.sqs"}]
podvozek.sqs
_let=_this select 0
_pod=_this select 1
_jak="Zasunul"
?_pod:_jak="Vysunul"
_let sideChat _jak+" jsem podvozek."
Podmínka editoru: neexistuje
 

Fuel: nositel[objekt], nádrž[bool]

Spuštění: vyprázdnění nádrže vozidla (nádrž=false), nebo změna z nulového stavu nádrže (nádrž=true) tzn. do prázdné nádrže se dostalo palivo
Příklad:
vozitko addEventHandler ["fuel",{_this exec "dno.sqs"}]
dno.sqs
_vozidlo=_this select 0
_nadrz=_this select 1
?_nadrz:goto "plneni"
_vozidlo vehicleChat "Došlo nám palivo."
exit
#plneni
(driver _vozidlo) sideChat "Plnou!"
Podmínka editoru: fuel nositel == 0
 

Init: nositel[objekt]

Tento EH pravděpodobně slouží tvůrcům addonů - jednotka (model) ho musí nějakým způsobem podporovat.Funkci má asi podobnou jako init řádek u jednotky.
Příklad spuštění (jen má domněnka): podporovaná jednotka objeví na mapě (začátek mise, createUnit, respawn)



nositel removeEventHandler ["event",index]

Odebere nositeli jeden určitý EH. Index je celé číslo, které vrací addEventHandler. Po odebrání se indexy všech ostatních EH stejného typu, které mají vyšší index než ten odebraný, sníží o jedničku.
Příklad:
přidání třech EH a uložení jejich indexů do globálních proměných eh1, eh2, eh3 (0, 1, 2)
eh1=nositel addEventHandler ["killed",{akce1}]
eh2=nositel addEventHandler ["killed",{akce2}]
eh3=nositel addEventHandler ["killed",{akce3}]

a později odebrání druhého EH:
nositel removeEventHandler ["killed",eh2]
Po odebrání EH2, se index prvního EH nezmění (0), ale index třetího EH se sníží o jedna (2->1) a je potřeba snížit o jedna proměnou eh3, protože v ní zůstává stále původní hodnota (2). Použití už neplatné hodnoty v eh3 sice nevyvolá chybu, ale také se třetí EH nevymaže (protože už se fakticky stal druhým).

nositel removeAllEventHandlers "event"

Odebere nositeli všechny EH daného typu.

Použité zdroje:
Operation Flashpoint - Resistance: Scripting Commands (comref_102002) z www.flashpoint1985.com angl. sekce editace
EventHandler tutoriál od Aliho z http://ofp.ruprt.cz/ sekce tutoriály

Vytvořil Brt. Srpen 2003