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ś:
lub:
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"];
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:
na:
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.