Przedwczesne spełnienie warunku

Moderator: Inkwizytor

ODPOWIEDZ
Awatar użytkownika
Error 404
Posty: 46
Rejestracja: 24 listopada 2007, 12:21
ID Steam:
Numer GG: 5846891
ID gracza: 0

Przedwczesne spełnienie warunku

Post autor: Error 404 »

Chciałbym ponownie prosić o pomoc. Mianowicie:
Mam kilka wyzwalaczy z ustawionym warunkiem:
((fuel (h1) ==0) or (fuel (h2) ==0))
Przy czym zarówno h1 jak i h2 to HMWVEE.

Po skończeniu się paliwa w jednym z nich, co wynika teoretycznie z warunku, dla pewnej grupy powinien się ustawić waypoint, ruszyć inna jednostka, a także z 5-cio sekundowym opóźnieniem pojawić komunikat radiowy.

Problem w tym, że wszystko to działa, jednak od razu w momencie ruszenia pojazdu z miejsca. Sprawdziłem oba pojazdy, paliwo mają ustawione na full, a także nie ma żadnego wyzwalacza, który by to paliwo mógł zabrać. Co ciekawe, gdy zamiast = wstawiłem znak >, wyzwalacz aktywował się od razu.

Ma może ktoś jakiś pomysł co z tym fantem zrobić i czym to może być spowodowane? Będę wdzięczny za każdą pomoc ;)
Obrazek

давай эа нас, давай эа вас,
и эа десант, и эа спецнаэ,
эа боевыйе ордена,
давай поднимен старина!!!
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Przedwczesne spełnienie warunku

Post autor: aszek »

Warunek w waypoincie (WP) działa dla następnego WP. Innymi słowy grupa nie ruszy do następnego WP dopuki WP w którym OBECNIE się znajduje nie będzie true. Dotyczy to także synchronizacji (F5). Jeśli wyzwalacz synchronizujesz z konkretnym WP grupy, to warunek wywzalacza kontroluje ruch grupy do jej NASTĘPNEGO WP. U Ciebie prawdopodobnie brakuje 'jałowego' WP.

Ja proponuje zrobić to bez wyzwalaczy i synchronizacji (cięzko się potem połapać). Jako, że sam się teraz supportem bawię, to na świeżo podpowiem ;)

Zakładam, że chcesz dowieść paliwo potrzebującej jednostce, więc będzie to ciężarówka z paliwem (wsparcie), te wsparcie nazwijmy sobie, np: (s1). Tylko jedna uwaga, nigdy nie dopuszczaj aby jednostka osiągneła pusty bak, bo trochę paliwa potrzebuje na ustawienie się za cysterną, inaczej jednostka nigdy nie zatankuje (głupie AI...).

Jeśli chcesz, aby wsparcie z paliwem (s1) ruszyło za jakąkolwiek jednostką nie mającą paliwa i wrócić na miejsce startowe, to (s1) musi mieć przynajmniej 3 WP.

Pierwszy WP posłuży za miejsce gdzie (s1) czeka (typ: ruch)
Drugi WP dajesz gdziekolwiek, byle ciut dalej niż pierszy WP, będzie on dynamiczny, a jego położenie określisz w porzebnym momencie (pozycję jednostki potrzebującej paliwa) (typ : ruch, promień: 0),
Trzeci WP daj bardzo blisko pierwszego WP (najlepiej po wstawieniu ustaw go na pierwszym WP), lub ustaw promień tak aby obejmował pierwszy WP (TYLKO pierwszy WP), bo będzie zapętlał całą operację (typ: przełącz).

Pierwszy WP (s1) powinien mieć:
Pojedynczy warunek: true
aktywacja: [[h1, h2], s1] exec "whoneedssupport.sqm";
dezaktywacja:

Jak widać w tablicy parametrów [] jest podtablica [h1, h2] - czyli jednostki którym (s1) dowiezie paliwo.
Można we własnej zmiennej umieścić liste jednostek do obsługi tankowania, np:
tankuj = [h1, h2, h3, h4, h5, 'ile tego chcesz'] + ['inne jednostki jakie chcesz']
i wywołać już skrypt: [tankuj, s1] exec "whoneedssupport.sqm";

Drugi WP (s1) powinien mieć:
Czas: min: 60
Warunek: (isunitneedsupport) and (fuel unitneedsupport > 0.9)
aktywacja: isUnitNeedSupport = false;
dezaktywacja:

W tym WP (s1) daje trochę czasu jednostce 'unitneedsupport' na zatankowanie, a w związku z tym, iż jeśli Twój h1/h2 ma następny WP to prawie nigdy nie bedzie pobierać paliwa do pełna, więc dlatego 0.9.

Trzeci WP (s1) powinien mieć:
Pojedynczy warunek: true
aktywacja:
dezaktywacja:

W pierwszym WP (s1) odpali się skrypt i w końcu coś znajdzie, po czym wyśle (s1) gdzie trzeba i zakończy działanie. (s1) wróci po WPtach, a na ostatnim (trzecim) WP typu przełącz droga się zapętli i znowu aktywny będzie WP pierwszy, który znowu odpali skrypt. I tak w kółko... bez wyzwalaczy, bez synchronizacji ;)

WhoNeedsSupport.sqm

Kod: Zaznacz cały

; WhoNeedsSupport.sqm - kto potrzebuje wsparcia ?
;[_unitsToSupport, _supportUnit] exec "WhoNeedsSupport.sqm";
; np: [[h1,h2]] exec "WhoNeedsSupport.sqm";

; parametry wejściowe:
; _unitsToSupport - tablica jednostek
; _supportUnit - ciężarówka z paliwem

; zmienne globalne, wyjściowe:
; isUnitNeedSupport - czy ktoś chce paliwa ?
; UnitNeedSupport - jednostka która chce paliwa

_unitsToSupport = _this select 0;
_supportUnit = _this select 1;

isUnitNeedSupport = false;
UnitNeedSupport = objNull;

_supportUnit lockWP true;

_index = 0;

#find
_unitA = _unitsToSupport select _index;
_index = _index + 1;

;hint format [" szukanie: %1 \n %2 ", isUnitNeedSupport, UnitNeedSupport];

? (fuel _unitA < 0.2) : isUnitNeedSupport = true; UnitNeedSupport = _unitA; 
? (isUnitNeedSupport) : goto "end";
? (_index <= count _unitsToSupport) : goto "find";

_index = 0;
~10
goto "find";

#end

;hint format [" akcja: %1 \n %2 ", isUnitNeedSupport, UnitNeedSupport];

UnitNeedSupport lockWP true;

[_supportUnit, 2] setWPPos getPos UnitNeedSupport;
_supportUnit lockWP false;

@(UnitReady _supportUnit);

UnitNeedSupport lockWP false;

exit;
Zaczołem bawić się eventami... i chyba tak jest najprościej:

Kod: Zaznacz cały

; refuel.sqm

; w inicie jednostki która ma się sama tankować:
; this addEventHandler ["fuel", {_this+[cysterna] exec "refuel.sqm"}]

_vehicle = _this select 0;
_vehiclePos = getPos _vehicle;
_vehicleTankisFull = _this select 1;
_tanker = _this select 2;

? (_vehicleTankisFull) : goto "end";

;hint format ["\n \n \n  (%1) \n (%2) \n (%3) ", _vehicle, _vehicleTankisFull, _tanker];

_vehicle lockWP true;

_tanker moveTo getPos _vehicle;

@ (abs((_vehiclePos select 0) - (getpos _tanker select 0)) < 20) and (abs((_vehiclePos select 0) - (getpos _tanker select 0)) < 20);

_vehicle setfuel 0.1;

@(UnitReady _tanker);

_vehicle lockWP false;
_tanker moveTo getWPPos [_tanker, 0];

#end
exit;

"True glory consists in doing what deserves to be written, in writing what deserves to be read." - Pliny The Elder
ODPOWIEDZ

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