Problem z serii addEventHandler

Moderator: Inkwizytor

ODPOWIEDZ
Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Problem z serii addEventHandler

Post autor: Trance » 02 września 2008, 19:40

Witam! Mam problem ze stworzeniem kar za strzelanie do i z respawnow...
Otoz chce go zrobic przy uzyciu komendy addEventHandler. I tu pojawia sie moje pytanie (jako ze nigdy nie korzystałem z tego wynalazku). Otóż, trzeba takie addEventHandlerka odpalac na kazdym z graczy? jakos to zapetlac? (czytalem ze ta komenda dziala nawet po respawnie).
Probowalem cos takiego:

wp1 addEventHandler ["killed", {_this exec "playerKilled.sqs"}]

i tak dalej dla kazdego gracza (w pliku init.sqs)
a w pliku playerKilled.sqs:

_ktodostal = _this select 0
_ktozabil = _this select 1
?(_ktodostal==_ktozabil):exit

?(_ktodostal in (list respawn)):_ktozabil setdammage 1
?(_ktozabil in (list respawn)):_kto zabil setdammage 1

itd


Jednak ten kod niestety nie dziala, nie wiem czy nie robie tego w jakis sposob zle czy cos, tak jak mowie, z eventhandlerow korzystam poraz pierwszy, na stronie BISu tez jakis szczegolnie istotnych informacji nie znalazłem, wiec zwracam sie z pytaniem do Was. Bede baaardzo wdzieczny jesli ktos mi pomoze z tym.
Obrazek

Awatar użytkownika
kondor
Posty: 1503
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Problem z serii addEventHandler

Post autor: kondor » 03 września 2008, 11:53

a podaj cytat z init.sqs, gdzie dodajesz eventHandler (bo jeśli dodajesz poprzez komendę player to nie zadziała)

Awatar użytkownika
Trance
Posty: 1090
Rejestracja: 20 maja 2007, 19:06
ID Steam:
ID gracza: 0

Re: Problem z serii addEventHandler

Post autor: Trance » 03 września 2008, 18:39

Kurcze własnie zmienilem nawe edytorowa jednostki na player i teraz dziala... Chociaz nie wiem jeszcze czy w 100% tak jak ja tego chce.

A dodaje eventhandlera poprostu kazdej jednostce w grze np :
wp1 addEventHandler...
wp2 addEventHandler...
itd...
Obrazek

Awatar użytkownika
kondor
Posty: 1503
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Problem z serii addEventHandler

Post autor: kondor » 03 września 2008, 19:29

moje osobiste 2 rady:
1. dobrym zwyczajem jest wywoływanie skryptu initPlayer.sqs(f ), gdzie komenda player jest juz dostepna i przeznaczenie skryptu jest czytelne:

Kod: Zaznacz cały

waitUntil{ not(isNull player) }; //to dla JIP, bo w JIP komenda player sie jeszcze pozniej ładuje

//komendy z uzyciem player, np player addEventHandler...
2. skrypt, o ktorym mowa będzie bardzo często wywoływany - sqs jest interpretowany linijkami, sqf po skompilowaniu nie ma tej spowalniającej własności, ale potrzebuje kompilacji. Dobrze jest więc skompilować takiego sqf-a raz na początku, a później uruchamiać szybki, skompilowany kod:
init.sqs(f):

Kod: Zaznacz cały

...
ptrKilled = compile preprocessFile "playerKilled.sqf";
...
[] execVm "initPlayer.sqf";
...
initPlayer.sqf:

Kod: Zaznacz cały

waitUntil{ not(isNull player) };
...
player addEventHandler ["killed", { _this spawn ptrKilled }]; 

fdd
Posty: 26
Rejestracja: 10 czerwca 2010, 20:20
ID Steam:
ID gracza: 0

Re: Problem z serii addEventHandler

Post autor: fdd » 14 marca 2013, 18:04

Witam,

Sry za podbijanie starego tematu, ale tytuł też idealnie pasuje do mojego problemu.

Do rzeczy - tworzę sobie (ArmA2 bez oa) prosty tryb multi. 4 graczy bluefor broni się w bazie w losowym miejscu na mapie przeciwko do 64 jednostek opfor, w przeznaczeniu niebiescy-gracze, czerwoni-ai. Wszystko działa elegancko, już nawet całkiem ładnie rozbudowałem i wczoraj, grając w środku nocy, przyszedł mi pomysł, że fajnie byłoby żeby gracz został poinformowany o fakcie zlikwidowania przeciwnika, ze względu na charakter gry.

Każdy z czerwonych jest playable ze względu na to, że respawnują się w losowo ustawianych markerach dookoła obiektu centrum. Każda jednostka dostała w init skrypt 'enemyinit.sqf'

Kod: Zaznacz cały

//
// enemyinit=[this] execVM "enemyinit.sqf";
//
//

_enemy				=	_this select 0;
_enemy addEventHandler ["killed", {_this exec "killedby.sqs"}];

if (!isServer) exitWith {OminieteSkrypty = OminieteSkrypty +1;};

sleep 0.7;

// *************************************
// dalej jest podpięte jeszcze kilka skryptów, ale to działa ok więc ucinam
a w killedby.sqs jest

Kod: Zaznacz cały

ofiara 	= _this select 0; 
ofiaraimie 	= name ofiara;
zabojca 	= _this select 1;
zabojcaimie = name zabojca;

scoremssg = format["--- %1 have killed: %2 ! ---", zabojcaimie, ofiaraimie];];
zabojca groupChat scoremssg;  
I działa pięknie, ale tylko dla gracza u którego stoi serwer. Testowałem na dwóch komputerach pc1 (serwer) pc2 (klient).
Gdy grając niebieskim na pc1 zabiję czerwonego ładnie pojawia się groupchat wszystko ok, ale grając na pc2 i zabijając czerwonego nie dostaję takiego komunikatu. Co więcej, nie wiem czy dokładnie przy powyższym kodzie bo próbowałem na różne sposoby, ale raz uzyskałem taki efekt, że gdy pc2 zlikwidował czerwonego, pc1 napisał groupchat jako pc2, ale pc2 tego nie widział nawet :lol:

Pewnie prosta sprawa, coś przeoczyłem, ale brak mi nerwów do tego już, dlatego proszę o pomoc :)

Awatar użytkownika
kondor
Posty: 1503
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Problem z serii addEventHandler

Post autor: kondor » 14 marca 2013, 19:47

Zdebuguj na pc2 jak są dodawane eventhandlery; w 'enemyinit.sqf' daj:

Kod: Zaznacz cały

//
// enemyinit=[this] execVM "enemyinit.sqf";
//
//

_enemy            =   _this select 0;
_enemy addEventHandler ["killed", {_this exec "killedby.sqs"}];
_enemy globalChat format["added handler for %1", name _enemy];

if (!isServer) exitWith {OminieteSkrypty = OminieteSkrypty +1;};

sleep 0.7;

// *************************************
// dalej jest podpięte jeszcze kilka skryptów, ale to działa ok więc ucinam
może handlery nie są dodawane, albo dodawane wielokrotnie do tej samej jednostki albo coś jeszcze innego

fdd
Posty: 26
Rejestracja: 10 czerwca 2010, 20:20
ID Steam:
ID gracza: 0

Re: Problem z serii addEventHandler

Post autor: fdd » 15 marca 2013, 00:32

Przetestowałem i efekt jest taki, że globalchat 'added handler' wyświetla się na obydwu. Natomiast groupChat z killedby.sqf wyświetla się tylko i wyłącznie na pc1.

Jeśli pc1 zabije czerwonego pojawia się groupChat na pc1.
Jeśli pc2 zabije czerwonego pojawia się groupChat również tylko na pc1, chociaż wygląda jakby nadawcą był pc2.
Pozostali niebiescy (2) jeśli są pod kontrolą AI i kogoś zabiją, komunikat zobaczy też tylko pc1.

Podmieniając groupChat na globalChat efekt jest taki sam.

Może problem rozwiązuje funkcja addMPEventHandler dostępna z tego co czytam na tutaj w OA ? Niestety nie mam tego jak sprawdzić, jeszcze nie kupiłem OA.

edit: Załączam zrobiony na szybko scenariusz w którym można zobaczyć jak to wygląda.

edit2: tymczasowo rozwiązałem to w ten sposób, w killedby.sqs

Kod: Zaznacz cały

titleText [scoremssg, "PLAIN DOWN", 0.2];
zamiast

Kod: Zaznacz cały

zabojca groupChat scoremssg;
do playerinit.sqf dodałem

Kod: Zaznacz cały

if (!isServer) then 
{
	"scoremssg" addPublicVariableEventHandler {_tmptxt0=format["%1", _this select 1]; titleText [_tmptxt0, "PLAIN DOWN", 0.2];};
};
addPublicVariableEventHandler działa tylko na pc2, natomiast addEventHandler tylko na pc1 więc nawzajem się uzupełniają :lol: Udało mi się to nawet upchać w sumie w dwóch linijkach wszystko, bez pliku sqs. Minusem tego rozwiązania jest to, że komunikat o wyeliminowaniu gracza trafia do wszystkich, a nie tylko do gracza który jest zabójcą, jak w wersji z groupChat. Niebieskie AI będą spamować.
Załączniki
killedhandler_test_titletext.utes.rar
(3.43 KiB) Pobrany 107 razy
killedhandler_test.utes.rar
(3.26 KiB) Pobrany 105 razy

ODPOWIEDZ

Wróć do „Edytor - tworzenie misji, skrypty oraz programowanie”