Skrypt dla ZU-23-2

Edytor Arma (Arma, Arma2, Arma2OA)

Moderatorzy: kondor, Inkwizytor

ODPOWIEDZ
smar
Posty: 63
Rejestracja: 23 stycznia 2010, 14:38
ID Steam:
ID gracza: 0

Skrypt dla ZU-23-2

Post autor: smar »

Poniżej jest skrypt do ożywienia działek ZU-23-2 - chodziło o uniknięcie sytuacji, w której działko z obsługą cały czas jest nieruchome a lufy "wiszą" płasko, choć to działko przeciwlotnicze.

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);
};
ODPOWIEDZ

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