Alarm po detonacji ładunku.

Edytor Arma (Arma, Arma2, Arma2OA)

Moderatorzy: kondor, Inkwizytor

krzysiek2222
Posty: 77
Rejestracja: 31 grudnia 2009, 14:51
ID Steam:
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: krzysiek2222 »

No nie ma prawa działać faktycznie. W skrypcie init.sqf też walnąłem literówkę

Kod: Zaznacz cały

[...]
obj1 addEventHandler ["firedNear", {[_this select 2, [b]_[/b]this select 6] execVM "bomb.sqf";}];
[...]
No i w bomba.sqf zupełnie to samo :oops:

Kod: Zaznacz cały

_pocisk = _this select 1;
_dystans = _this select 0;
if (_dystans < 50) {
if ((_pocisk == "PipeBomb")) then
  {
    ambsh = true;
    publicVariable "ambsh";
  };
};
Pzdr i sry za literówki
Awatar użytkownika
Vari
Posty: 46
Rejestracja: 15 stycznia 2010, 16:50
ID Steam:
Numer GG: 1022354
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: Vari »

No i nic. Nie chce działać. Już nawet skończyły mi się pomysły, co może być źle.
krzysiek2222
Posty: 77
Rejestracja: 31 grudnia 2009, 14:51
ID Steam:
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: krzysiek2222 »

Sry, że nie edytuje, ale byś nie zauważył. Po prostu chciałem ten znak "_" pogrubić i wyszło _. Mam nadzieję, że w tym był problem, bo resztę napisałem według BIS Wiki. Upewnij się, że odległość od tego obiektu wynosi nie więcej niż 50m. Sprawdź też, czy flary działają. Jeśli nie działa tylko ładunek i nawet jak podłożysz go pod obj1, to musi być jakiś błąd w bomb.sqf. Najlepiej napisz dokładnie co się dzieje.

Pzdr
Awatar użytkownika
Vari
Posty: 46
Rejestracja: 15 stycznia 2010, 16:50
ID Steam:
Numer GG: 1022354
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: Vari »

Te nawiasy z [ b ] zauważyłem i wywaliłem od razu, więc niestety nie w tym leżał problem. A co się dzieje? czy to flarą czy to bombą, hammer z warunkiem ambsh nie jedzie dalej. Kazałem też hintnąć sobie tekst, ale się nie pojawia, więc problem leży gdzieś w skrypcie, a nie w waypointach. Strzelałem pod samym nosem obj1. Zarówno flarą, jak i PipeBomb. Próbowałem zmieniać skrypt na:

Kod: Zaznacz cały

_pocisk = _this select 1;
_dystans = _this select 0;
if ((_dystans < 50) and (_pocisk == "PipeBomb")) then
  {
    ambsh = true;
    publicVariable "ambsh";
  };
};
bo wydaje mi się poprawniejszy (nie wiem, nie znam się, próbuję myśleć), ale dalej coś zgrzyta. Może to nie w bomb jest problem, a w init i bomb w ogóle nie jest odpalane?
krzysiek2222
Posty: 77
Rejestracja: 31 grudnia 2009, 14:51
ID Steam:
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: krzysiek2222 »

Problem jest w tym, że "fired" działa już wtedy, gdy podkładamy bombę a nie w momencie wybuchu. Podobnie jest z firednear. Postaram się coś wykombinować, ale niestety ten skrypt bomba.sqf i ten eventhandler idzie chyba do kosza.
Awatar użytkownika
Vari
Posty: 46
Rejestracja: 15 stycznia 2010, 16:50
ID Steam:
Numer GG: 1022354
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: Vari »

Jak widać, nie działał. W przeciwnym wypadku hammer odjechałby. Mimo wszystko przydałoby się sprawdzić, co źle zrobiliśmy w tym skrypcie (albo, czy to ja popełniłem jakiś błąd). Sprawdzałeś to u siebie w edytorze? Działało?

EDIT: Poprawka. Wyczytałem, że to musi być pojazd albo jednostka, nie wyzwalacz i... Zadziałał w momencie podłożenia, jak mówiłeś... Ale czy nie da się tego jakoś obejść?
Swoją drogą nieźle to niedorobione, że za wystrzał uważamy już podłożenie ładunku ;/
krzysiek2222
Posty: 77
Rejestracja: 31 grudnia 2009, 14:51
ID Steam:
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: krzysiek2222 »

Już wiem jak to należy zrobić. Najpierw wlepie kody skryptów.
init.sqf

Kod: Zaznacz cały

NULL = player addEventHandler ["fired",{NULL = [_this select 4, _this select 0] execVM "bomba.sqf";}];
bomba.sqf

Kod: Zaznacz cały

_pocisk = _this select 0;
_pozycja = [0, 0, 0];
_gracz = _this select 1;
if (_pocisk == "PipeBomb") then { 
_bomba = nearestObject [_gracz, "Pipebomb"];
_pozycja = position _bomba;
waitUntil {_bomba != _pozycja nearestObject "PipeBomb"};
alarm = true;
}
Tak mam i mi wszystko działa. Teraz wyjaśnię: eventHandler "Fired" włącza się w przypadku bomby wtedy, gdy położymy ją na ziemi (wystrzał z broni o klasie "Put"). Ale ta bomba jest obiektem i w momencie wybuchu przestaje istnieć. Czyli jak zapamiętamy jej pozycje, to przed detonacją najbliższym obiektem typu "PipeBomb" od tej pozycji będzie sama bomba. Jak ją zdetonujemy, to już jej nie będzie, więc najbliższa bomba będzie inna. I właśnie tak działa ten skrypt.

pzdr, mam nadzieję, że pomogłem
Awatar użytkownika
Vari
Posty: 46
Rejestracja: 15 stycznia 2010, 16:50
ID Steam:
Numer GG: 1022354
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: Vari »

Tylko trzeba by dodać jakiś warunek, żeby skrypt działał tylko w określonym obszarze, ech. Bo wcześniej też będę coś wysadzał, ale nie chcę, żeby wtedy uaktywniła się ta zmienna ambsh. Wiem, że komplikuję, ale wystarczy, że dam wyzwalacz, który aktywuje się po wejściu jednostki w jego obręb. I powiedzmy, że skrypt ma działać tylko wtedy, kiedy zostanie uaktywniony wyzwalacz cel. Tylko nie bardzo wiem, w którym miejscu to wcisnąć.
Skrypt jako tako świetnie działa, pozostał tylko ten jeden mankament :)
Próbowałem wcisnąć do warunków TriggerActivated ambsh, ale wtedy się coś sypało. To już pewnie nie jest problem, ale (głupio mi to przyznać) nie wiem, jak to zrobić. Pomożesz jeszcze ten ostatni raz?
Skrypt ma działać tylko wtedy, jeśli jednostka przekroczyła już dany wyzwalacz (idealnie byłoby, gdyby bomby były wysadzane w danym regionie, ale tym razem wystarczy mi przekroczenie wyzwalacza). Bardzo ci dziękuję mimo wszystko :)

Można by też odpalać ten skrypt dopiero, kiedy bomba zostanie podłożona te 50 metrów od objct1, jak w poprzednim skrypcie.

EDIT: Działa! Zrobiłem :D Zaraz opiszę jak, gdyby ktoś kiedyś potrzebował.


init.sqf

Kod: Zaznacz cały

ambsh = false;
obj1 addEventHandler ["firedNear", {[_this select 2, _this select 6] execVM "pipebomb.sqf";}];
pipebomb.sqf

Kod: Zaznacz cały

_pocisk = _this select 1;
_dystans = _this select 0;
if ((_dystans < 50) and (_pocisk == "PipeBomb")) then
  {
NULL = player addEventHandler ["fired",{NULL = [_this select 4, _this select 0] execVM "bomb.sqf";}];
  };
};
bomb.sqf

Kod: Zaznacz cały

_pocisk = _this select 0;
_pozycja = [0, 0, 0];
_gracz = _this select 1;
if (_pocisk == "PipeBomb") then {
_bomba = nearestObject [_gracz, "Pipebomb"];
_pozycja = position _bomba;
waitUntil {_bomba != _pozycja nearestObject "PipeBomb"};
ambsh = true;
hint "alarm";
}
Robimy sobie jakiś nierzucający się w oczy obiekt ( w moim przypadku stara opona leżąca pod płotem) i nazywamy obj1. Dla upewnienia się, ile to jest 50 metrów od opony możemy sobie na niej umieścić wyzwalacz o obrębie 50x50(potem możemy go usunąć). Teraz, kiedy w obrębie 50 metrów od opony zostanie położona bomba PipeBomb, uruchamia się skrypt bomb.sqf, dzięki któremu po wybuchu bomby zmienna ambsh dostaje wartość true. Dodałem jeszcze hint "alarm" dla sprawdzenia ;) Żadna bomba położona wcześniej nie uruchomi tego alarmu.
krzysiek2222
Posty: 77
Rejestracja: 31 grudnia 2009, 14:51
ID Steam:
ID gracza: 0

Re: Alarm po detonacji ładunku.

Post autor: krzysiek2222 »

Albo wyzwalacz w grupie z graczem i przy aktywacji może być

Kod: Zaznacz cały

ev = player addEventHandler ["fired",{NULL = [_this select 4, _this select 0] execVM "bomba.sqf";}];
A przy dezaktywacji

Kod: Zaznacz cały

player removeEventHandler ["fired", ev];
Tylko w init.sqf musisz dodać ev =0;
Jak gracz będzie w strefie to eventhandler zadziała, a jeśli z niej wyjdzie zostanie usunięty.
Zdaje się, że rozbrajając bombę także uruchomimy alarm, ale nie mogę na razie tego sprawdzić.
ODPOWIEDZ

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