Komenda SetVehicleVarName

Moderator: Inkwizytor

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

Komenda SetVehicleVarName

Post autor: Trance »

Witam.
Mam problem z komendą SetVehicleVarName.
Robie wszystko zgodnie z instrukcjami podanymi na stronie z komendami, ale cos tu sie krzaczy.
Fragment skryptu:
while {true} do
{
if ((damage _pojazd)==1) then
{
_obiekt = _klasa createVehicle (_pozycja);
_obiekt setVehicleVarName (format ["%1",_pojazd]);
_pojazd setPos _pozycja;
_pojazd setDir _kierunek;
};
sleep 0.3;
};
Przy wsadzeniu kilku komend hint format ["%1",_pojazd] mogłem zaobserwowac jak zmienia sie zmienna _pojazd. Wyglada to tak, ze dopoki skrypt wykonuje to co jest w warunku "if" _pojazd rzeczywiscie ma odpowiednia nazwe, ale juz po wysciu z warunku _pojazd to ObjNull. Ma ktos pomysł jak temu zaradzic?
Obrazek
Awatar użytkownika
aszek
Posty: 133
Rejestracja: 11 lipca 2008, 06:17
ID Steam:
Numer GG: 8568774
ID gracza: 0

Re: Komenda SetVehicleVarName

Post autor: aszek »

U Ciebie zmienna '_pojazd' jest wskaźnikiem na jakiś objekt o danej nazwie. Przy tworzeniu nowego objektu o takiej samej nazwie jak '_pojazd' powinienieś dostać błąd (trochę mnie dziwi, że tego nie sygalizujesz), lub Arma automatycznie nazywa nowy objekt dodając do nazwy surfix "_1", czyli (identycznie jak przy wstawianiu jednostek w edytorze - copy&paste), np:

Kod: Zaznacz cały

_pojazd = "westPojazd";
_nowypojazd = setVehicleVarName format ("%1", _pojazd);
_nowypojazd == "westPojazd_1";
Co prowadzi do wniosku, że '_nowypojazd' <> '_pojazd'. Ale to nieważne. U Ciebie nowy '_objekt' również nie zostaje zastąpiony przez nowo tworzony (gubisz NOWY '_objekt'), np:

Kod: Zaznacz cały

_objekt = ... createVehicle ...
_pojazd = _objekt; <- trzeba go zapamiętać w zmiennej którą testujesz, i na podstawie której tworzysz NOWY
Oczywiście to i tak prowadzi do stracenia referencji do '_pojazd' (możliwości odwołania się do starego objektu), ale zapewniłoby aktualizację '_pojazd' i możliwość (poprawność) testów 'czy żyje'. Pozatym '_pojazd' nie będzie tożsamy NOWEMU '_objekt', bo '_pojazd' to wzłoki/wrak, a '_objekt' NOWA jednoska (całkiem inny wkażnik - nazwa nie ma zanaczenia) ! Ale to nieważne.

Po ponownym odpaleniu kodu skryptu '_pojazd' (i '_objekt') będzie ObjNull - bo to zmienne lokalne i tracisz ich zawratość po opuszczeniu skryptu. Ale widze, że skrypt się nie zakańcza i pętla ma działać w nieskąńczonośc, tyle że w .sgf iteracja jest ograniczona, dlatego sugerowałbym Ci (dla pojedynczej '_pojazd') zamienić IF..THEN na takie coś:

Kod: Zaznacz cały

WaitFor (damage _pojazd == 1) - .sgf
lub:

Kod: Zaznacz cały

@(damage _pojazd == 1) - .sqs

Dla każdego '_pojazdu' (przynajmniej obecnie 'żyjącego'), musisz sobie jakoś go zapamiętać w zmiennej globalnej (i zozgłosić jeśli to MP).

Proponuje taki automat dla wszystkich jednostek (odpalony w inicie):

Kod: Zaznacz cały

Objects = ["pojazd1", "żołnierz10", "budynek100" ... "cokolwiek ma się rezpawąć z tą samą nazwą"]
publicvariable ["Objects"];

Kod: Zaznacz cały

[] exec "rename.sqs";

Pisane z palca, więc pewnie będą błedy:

rename.sqs

Kod: Zaznacz cały

goto "selectObject";



#wait
~1
_index = 0;
goto "selectObject";



#selectObject
_count = count Objects;

? (_count == 0) : goto "wait";
? (_index > _count) : goto "wait";
? (_index < 0) : goto "wait";

_object = call compile (Objects select _index);
_index = _index + 1;
goto "checkObject";


#checkObject
? (isNull _object) : Objects = Objects - [_object]; _index = _index - 1;  goto "selectObject";
? (damage _object == 1) : goto "respawnObject";
goto "selectObject";


#respawnObject
; _newObjectName = format ["pojazd_%1", (count Objects) + 1]; <- nowa nazwa
_newObjectName = format ["%1", _object]; <- aktualana nazwa
_newObjectPos = getPos _object;  

_newObject = (typeOf _object) createVehicle [0,0,0];
_newObject setDir getDir _object;

hidebody _object;
deletevehicle _object;

_newObject setPos _newObjectPos;
_newObject setVehicleVarName _newObjectName;

Objects = Objects + [_newObject] - [_object];
publicvariable ["Objects"];
goto "selectObject";

exit;
Za sugestią Kondor'a, odwołania do tablicy jednostek są robione 'call compile' (nie miałem sposobności używać tego, ale pewnie będzie to wskazane):

Kod: Zaznacz cały

_object = call compile (Objects select _index);
Pewnie należałoby też zamienić wszystkie modyfikację w tablicy 'Objects' typu:

Kod: Zaznacz cały

Objects = Objects - [_object]
na:

Kod: Zaznacz cały

Objects = Objects - ["_object"]
ale może się bez tego już obejdzie - jak się 'Objects' nie będzie rozgłaszał/aktualizował - to wiesz co robić - dołożyć cudzysłowy wszędzie gdzie coś się z 'Objects' dodaje/udejmuje.
"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”