Autor : Ruprt Ukázka není k dispozici
Zpět na Tipy & Triky
Opatření proti hráčům MP misí, kteří střílejí na nepřátele v místě jejich respawnu.
Harrier mně položil dotaz, zda-li je možné udělat ochranu v MP misi proti hráčům, kteří střílejí do protihráčů na místě jejich respawnu. Představoval si to tak, že v případě, že hráč zastřelí protihráče na respawnu, tak by mu byli odebrány všechny zbrane, 5 minut by byl jako mrtvý a pak by se "probral" na svém respawnu.
Vzhledem k tomu, že počet a prodleva respawnu se nastavuje pro všechny hráče MP mise stejně a ještě k tomu v description.ext, nelze takové řešení úplně přesně provést, protože description.ext v průběhu hry prostě změnit nelze.

Vymyslel jsem ale jiné řešení. Pro hry udělané ve verzi 1.90 je již k dispozici EvenHandler (Obsluha událostí). Pro starší verze mám však také řešení.

1) MP mise pro verzi 1.90 - Příklad
Mise bude mít 4 hráče WEST a 4 hráče EAST. Na místě respawnu hráčů WEST umístíme jakýkoli objekt (doporučuji Logický člen), který pojmenujeme "respawnWest". Na místě respawnu hráčů EAST umístíme opět objekt - Logický člen a pojmenujeme ho "respawnEast".
Ve vzdálenosti od "respawnWest"(ve směru dozadu od herní oblasti), kterou by voják beze zbraně uběhl asi tak za 5 minut umístíme další logický člen, který pojmenujem třeba "badBoyPointWest". To samé uděláme pro stranu EAST s tím rozdílem, že ten druhý logický člen pojmenujem "badBoyPointEast". No a teď už ke scriptu.
V závislosti na tom, zda-li chcete provinilce potrestat pouze za to, že protihráče trefil, ale ještě nezabil, nebo ho chcete potresta jenom když protihrače nedovoleně zabije, zvolíte EventHandler.
a) pouze strefa - protihrac na respawnu je pouze zraněn :
do init.sqs zapiste nasledujici kód
hracEast1 addEventHandler ["Hit",{_this exec "badboywest.sqs"}]
hracEast2 addEventHandler ["Hit",{_this exec "badboywest.sqs"}]
hracEast3 addEventHandler ["Hit",{_this exec "badboywest.sqs"}]
hracEast4 addEventHandler ["Hit",{_this exec "badboywest.sqs"}]

hracWest1 addEventHandler ["Hit",{_this exec "badboyeast.sqs"}]
hracWest2 addEventHandler ["Hit",{_this exec "badboyeast.sqs"}]
hracWest3 addEventHandler ["Hit",{_this exec "badboyeast.sqs"}]
hracWest4 addEventHandler ["Hit",{_this exec "badboyeast.sqs"}]
(pozn. pokud jsou hraci jedne strany ve stejne skupine muzete samozrejme pouzit prikaz ForEach :
"_x addEventHandler [""Hit"",{_this exec ""respointwest.sqs""}]" ForEach Units Group hracEast1
"_x addEventHandler [""Hit"",{_this exec ""respointeast.sqs""}]" ForEach Units Group hracWest1 )

Poté si vytvoříte ony dva scripty badboywest.sqs a badboyeast.sqs kde bude náledující kód ;
soubor badboywest.sqs :
_mrtvola = _this Select 0
_kdozabil = _this Select 1

? (_mrtvola Distance respawnEast) < 20: _kdozabil SetPos GetPos badBoyPointWest; RemoveAllWeapons _kdozabil; _mrtvola SetDamage 0
Exit

no a soubor badboyeast.sqs pak bude obsahovat tento kód :
_mrtvola = _this Select 0
_kdozabil = _this Select 1

? (_mrtvola Distance respawnWest) < 20: _kdozabil SetPos GetPos badBoyPointEast; RemoveAllWeapons _kdozabil; _mrtvola SetDamage 0
Exit

A to je vše. Hráč, který se proviní tím, že zraní protihráče ve vzdálenosti do 20 metrů od jeho respawnu, pak bude přemístěn na pozici objektu BadBoyPointStrana a bude muset beze zbraně běžet 5 minut na místo svého respawnu, kde si vezme z beden s municí novou zbraň a munici a příště už si rozmyslí, zbaběle střílet do nepřátel na respawnu. Navíc postižený hráč bude "opraven" příkazem " _mrtvola SetDamage 0".

b) V případě, že chcete hráče potrestat jenom za zabití protihráče na respawnu, použijte v init.sqs EventHandler "Killed" namísto "Hit" a ze souborů badboystrana.sqs odeberete za RemoveAllWeapons _kdozabil toto : "; _mrtvola SetDamage 0".


2) MP mise pro verzi nižší než 1.90 - Příklad
Zde lze použít pouze trest za zabití protihráče nikoli za pouhé zranění. Takže ... objekty umístíte stejně jako u předchozího příkladu a stejně je také pojmenujete.
Soubor init.sqs nemusí obsahovat nic. Musíte však vytvořit soubor onPlayerKilled.sqs, který bude obsahovat následující kód :
_mrtvola = _this Select 0
_kdozabil = _this Select 1

? (_mrtvola Distance respawnWest) < 20 AND (Side _mrtvola) == West: Goto "ResPointEast"
? (_mrtvola Distance respawnEast) < 20 AND (Side _mrtvola) == East: Goto "ResPointWest"

#ResPointWest
_kdozabil SetPos GetPos badBoyPointWest
RemoveAllWeapons _kdozabil
Exit

#ResPointEast
_kdozabil SetPos GetPos badBoyPointEast
RemoveAllWeapons _kdozabil
Exit

A toť vše. Mějte na paměti, že každý script lze v OFP spustit ve více instancích a EvenHandlery "Hit" a "Killed" a soubor onPlayerKilled.sqs jsou vykonávány pouze lokálně a nehrozí tedy kolize kódu scriptu ani v případě, že by byli zabiti třeba všichni hráči najednou. Je to prostě bezpečné a pro provinilce dostatečně zpruzující.