Skrypt działa, ale mam pytanie - dlaczego doWatch nie ustawia kierunku, tj. getDir, getFormDir, direction (zarówno dla _gun jak i dla _gunner) zwracają zawsze zero (jeżeli nie ma setFormDir)? Co sprawdziłem metodą prób i błędów. Wydawałoby się, że wystarczy samo doWatch - a działka same nakierują się na określony punkt (i tak jest) oraz będzie ustawiony kierunek dla getFormDir (ale tak nie jest). Para setDir/getDir - jak rozumiem - raczej do niczego się nie nadaje, bo określa kierunek lawety, tj. kręci/odczytuje kierunek w jakim laweta została ustawione po odprzodkowaniu - a nie kierunek w którym jest wycelowane (a są kierunki w których ustawione są osie luf, być może lekko zbieżnie). Polecenia setDir/getDir mogłyby się przydać do "przestawiania" broni o ograniczonym kącie ostrzału... ale wygląda to trochę nienaturalnie z bliska. Samo setFormDir też działa... lecz wtedy lufy są cały czas poziomo, a przecież to działko przeciwlotnicze. Dlatego dałem doWatch, co ma jeszcze i to pozytywne znaczenie, że stojąc przy takim działku słychać komendy obsługi. Na wszelki wypadek jest też setFormDir - nie wiem czy potrzebne (?!), ale być może ma to jakieś znaczenie - rezultat getFormDir jest sensowny. Wersja ulepszona rozpoznaje "behaviour" i odpowiednio kręci albo bardziej żywiołowo... albo raz na kilka(naście) minut.
Jeszcze o skrypcie - jeżeli sleep trwa bardzo krótko, np. sleep(1.), to chyba przeszkadza w wykrywaniu wroga (skrypt bez przerwy wtrąca się, nie dając czasu na "normalne" AI).
Kod: Zaznacz cały
////////////////////////////////////////////////////////////////////////////////
// Function file ZU-23-2-animation.sqf for Armed Assault
// Created by: smar
//
// handle = [this] execVM "ZU-23-2-animation.sqf";
////////////////////////////////////////////////////////////////////////////////
_gun = _this select 0;
_direction = 1; // +1 is clockwise, -1 is counterclockwise
_angle = 0;
while {damage _gun < 1} do {
_gunner = gunner _gun;
if ((!isNull _gunner) && (alive _gunner)) then {
if (isNull (_gunner findNearestEnemy _gunner)) then {
_elevation = 10 + random 30;
_angle = _angle + _direction * (60 + random 60);
if (1 > random 10) then {
_angle = _angle + 170 + random 20;
};
if (_angle > 360) then {
_angle = _angle - 360;
};
if (_angle < 0) then {
_angle = _angle + 360;
};
if (1 < random 10) then {
_direction = (-_direction);
};
_p = getPos _gun;
_x = 100*(sin _angle) + (_p select 0);
_y = 100*(cos _angle) + (_p select 1);
_z = 100*(tan _elevation) + (_p select 2);
_gunner setFormDir _angle;
_gunner doWatch [_x,_y,_z];
};
};
sleep(4 + random 4);
};