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í. |