Problem z serii addEventHandler
Moderator: Inkwizytor
Problem z serii addEventHandler
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.
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.

Re: Problem z serii addEventHandler
a podaj cytat z init.sqs, gdzie dodajesz eventHandler (bo jeśli dodajesz poprzez komendę player to nie zadziała)
Re: Problem z serii addEventHandler
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...
A dodaje eventhandlera poprostu kazdej jednostce w grze np :
wp1 addEventHandler...
wp2 addEventHandler...
itd...

Re: Problem z serii addEventHandler
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:
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):
initPlayer.sqf:
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...
init.sqs(f):
Kod: Zaznacz cały
...
ptrKilled = compile preprocessFile "playerKilled.sqf";
...
[] execVm "initPlayer.sqf";
...
Kod: Zaznacz cały
waitUntil{ not(isNull player) };
...
player addEventHandler ["killed", { _this spawn ptrKilled }];
Re: Problem z serii addEventHandler
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'
a w killedby.sqs jest
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
Pewnie prosta sprawa, coś przeoczyłem, ale brak mi nerwów do tego już, dlatego proszę o pomoc
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
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;
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

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

Re: Problem z serii addEventHandler
Zdebuguj na pc2 jak są dodawane eventhandlery; w 'enemyinit.sqf' daj:
może handlery nie są dodawane, albo dodawane wielokrotnie do tej samej jednostki albo coś jeszcze innego
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
Re: Problem z serii addEventHandler
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
zamiast
do playerinit.sqf dodałem
addPublicVariableEventHandler działa tylko na pc2, natomiast addEventHandler tylko na pc1 więc nawzajem się uzupełniają
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ć.
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];
Kod: Zaznacz cały
zabojca groupChat scoremssg;
Kod: Zaznacz cały
if (!isServer) then
{
"scoremssg" addPublicVariableEventHandler {_tmptxt0=format["%1", _this select 1]; titleText [_tmptxt0, "PLAIN DOWN", 0.2];};
};

- Załączniki
-
- killedhandler_test_titletext.utes.rar
- (3.43 KiB) Pobrany 543 razy
-
- killedhandler_test.utes.rar
- (3.26 KiB) Pobrany 514 razy