Teraz jest Cz 28 mar, 2024 15:03


Airstrike - skrypt

Dział poświęcony edytorowi ArmA II i Operation Arrowhead, czyli tworzeniu misji.
  • Autor
  • Wiadomość
Offline
Avatar użytkownika

Sejtan

Major

Major

  • Posty: 676
  • Dołączył(a): Pn 19 lip, 2004 21:26
  • Lokalizacja: Starogard Gdański

Airstrike - skrypt

PostŚr 19 maja, 2010 02:21

Witam po długim czasie :) Mam mały problem. Chciałem zrobić sobie reguralne, powtarzające się co kilka minut bombardowanie określonego obszaru przez powiedzmy cztery samoloty. Napisałem sobie cóś takiego:
Kod: Zaznacz cały
#loop
if ((plane1 distance pos1) < 800) then {goto "bomb1"} or if ((plane2 distance w1) < 800) then {goto "bomb2"}

#bomb1
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";
~0.5
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";

#bomb2
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";
~0.5
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";
goto "loop"



I.... oczywiście nie działa :/ W momęcie odpalenia podglądu wszystkie 4 samoloty odrazu zrzucają bomby. Kombinowałem z "{", "[", "(" w różnych miejscach, ale d*pa. Oczywiście zapisywałem to w .sqs, bo na .sqf wogóle się nie znam.... co nie znaczy, że pogardze pożądnym skryptem .sqf. Z góry dzięki i pozdro :)

Rodzaj tematu.... - Mav
Ostatnio edytowano Śr 19 maja, 2010 14:46 przez Sejtan, łącznie edytowano 2 razy
Offline
Avatar użytkownika

tsuki

Porucznik

Porucznik

  • Posty: 491
  • Dołączył(a): Cz 21 sty, 2010 22:33
  • Lokalizacja: z Nienacka

Re: Airstrike - skrypt

PostŚr 19 maja, 2010 07:15

Kod: Zaznacz cały
#loop
if ((plane1 distance pos1) < 800) then {goto "bomb1"} or if ((plane2 distance w1) < 800) then {goto "bomb2"}

#bomb1
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";
~0.5
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";

#bomb2
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";
~0.5
plane1 fire "BombLauncherF35";
plane2 fire "BombLauncherF35";
goto "loop"


Nie znam się na sqs, ale w sqf poprawnie wygladałoby to tak:
Kod: Zaznacz cały
while {true} do
{
  if ((plane1 distance pos1) < 800) then
   {
     plane1 fire "BombLauncherF35";
     plane2 fire "BombLauncherF35";
     sleep .5;
     plane1 fire "BombLauncherF35";
     plane2 fire "BombLauncherF35";
   };
  if ((plane2 distance w1) < 800) then
  {
    plane1 fire "BombLauncherF35";
    plane2 fire "BombLauncherF35";
    sleep .5 ;
    plane1 fire "BombLauncherF35";
    plane2 fire "BombLauncherF35";
  };
  sleep .5;
};


2 możliwe przyczyny:
1) Nie wuem, czy w .sqs poprawne jest:
if ((plane1 distance pos1) < 800) then {goto "bomb1"} or if ((plane2 distance w1) < 800) then {goto "bomb2"}

OR to operator logiczny (logiczna suma), która zwraca true, gdy choć jeden składnik jest true.
2) Nie wiem jakiego typu jest zmienna w1 i pos1. Jeżeli są to markery, to musisz użyć funkcji getMarkerPos "nazwamarkera". Jeżeli są to waypointy - użyj getWpPos waypoint.
Funkcja distance zwraca odległość pomiędzy obiektem, pozycją, lub dowolną kombinacją powyższych. Nie działa na markery, ani nawaypointy. A więc poprawny kod dla markerów wygląda:
Kod: Zaznacz cały
if ((plane1 distance (getMarkerPos "pos1") < 800) then
{
  ...
};
if ((plane2 distance (getMarkerPos "w1")) < 800) then
{
  ...
};


Dla waypointów użyj getWpPos pos1 i getWpPos w1.
Wszystko pisane z czapki, niesprawdzone. Jeżeli się nie odpali to powiedz jaki był błąd.

Aha, .sqf odpalasz poprzez komendę execVM "ścieżka skryptu";
Obrazek
Offline
Avatar użytkownika

Sejtan

Major

Major

  • Posty: 676
  • Dołączył(a): Pn 19 lip, 2004 21:26
  • Lokalizacja: Starogard Gdański

PostŚr 19 maja, 2010 16:53

Działa jak trzeba :] Jeszcze tylko małe sprostowanie... "pos1" i "w1" to nie markery tylko wyzwalacze :) Thx anyway.

EDIT:
Jeszcze jesdna sprawa. Chciałbym dodać do tego skryptu wpisy odpowiadające za respawn uzbrojenia kilka sekund po bombardowaniu. Miałem na to inny sposób, który wiązał się z obecnością samolotu w określonym wyzwalaczu, ale... chyba nie był to za dobry sposób, bo raz działało, raz nie... i wogóle. Da rade? :D
Offline
Avatar użytkownika

tsuki

Porucznik

Porucznik

  • Posty: 491
  • Dołączył(a): Cz 21 sty, 2010 22:33
  • Lokalizacja: z Nienacka

PostŚr 19 maja, 2010 17:51

Napisz co było w polu "przy aktywacji" triggera respawnującego uzbrojenie.
Obrazek
Offline
Avatar użytkownika

Sejtan

Major

Major

  • Posty: 676
  • Dołączył(a): Pn 19 lip, 2004 21:26
  • Lokalizacja: Starogard Gdański

PostŚr 19 maja, 2010 19:16

Już to zrobiłem... Teraz problem polega na tym, że samoloty "zbierają" bomby, a nie zrzucają ich ponownie kiedy znajdą się nad wskazanym obszarem. Skrypt wygląda tak:

Kod: Zaznacz cały
while {true} do
{
   if ((plane1 distance w1) < 1550) then
   {
     plane1 fire "BombLauncher";
     plane1 fire "BombLauncher";
     sleep .3;
     plane1 fire "BombLauncher";
     plane1 fire "BombLauncher";
     sleep .3;
     plane1 fire "BombLauncher";
     plane1 fire "BombLauncher"; 
     sleep 2;
     plane1 addMagazine "6Rnd_GBU12_AV8B";
  };
  sleep 1;
};


Aaa jeszcze jedno. w chwili obecnej plane1 zrzuca jednorazowo tylko trzy bomby. Żeby zrzucił sześć muszę między każdą linijką dać sleep x?
Offline
Avatar użytkownika

tsuki

Porucznik

Porucznik

  • Posty: 491
  • Dołączył(a): Cz 21 sty, 2010 22:33
  • Lokalizacja: z Nienacka

PostCz 20 maja, 2010 09:29

Już to zrobiłem... Teraz problem polega na tym, że samoloty "zbierają" bomby, a nie zrzucają ich ponownie kiedy znajdą się nad wskazanym obszarem. Skrypt wygląda tak:

Ekhmm... możesz przetłumaczyć to na polski? :) Co to znaczy "zbierają"?

Co do Twojego pytania - zrzuca 3 bomby, a jest 6 komend, Są dwa sleepy, a więc twój wniosek wydaje się być poprawny.
Obrazek
Offline
Avatar użytkownika

Sejtan

Major

Major

  • Posty: 676
  • Dołączył(a): Pn 19 lip, 2004 21:26
  • Lokalizacja: Starogard Gdański

PostCz 20 maja, 2010 10:25

To znaczy, że np po 15 min. gry samoloty mają powiedzmy ok. 20 bomb mimo, że maksymalnie powinny mieć tylko 6 (AV8B) :D Problem udało mi się częściowo rozwiązać.... Wszystkie samoloty zrzucają bomby tak jak powinny, ale... zaraz po bombardowaniu skrypcik doładowuje im uzbrojenie i bombki lecą powtórnie co troche nienaturalnie wygląda.
Offline
Avatar użytkownika

tsuki

Porucznik

Porucznik

  • Posty: 491
  • Dołączył(a): Cz 21 sty, 2010 22:33
  • Lokalizacja: z Nienacka

PostCz 20 maja, 2010 12:26

Mała podpowiedź:

Zrób warunek sprawdzający, czy ilość amunicji "6Rnd_GBU12_AV8B" jest mniejsza niż 6. Jezeli tak - dodaj bombę.
Obrazek
Offline
Avatar użytkownika

Sejtan

Major

Major

  • Posty: 676
  • Dołączył(a): Pn 19 lip, 2004 21:26
  • Lokalizacja: Starogard Gdański

PostPt 21 maja, 2010 16:38

Teraz wszystko działa jak należy. Poniżej wklejam skrypt, może w przyszłości się komuś przyda.
@tsuki - jeszcze raz dzięki ;)

Kod: Zaznacz cały
while {true} do
{
   if ((plane1 distance w1) < 800) then
   {
     plane1 fire "BombLauncher";
     sleep .3;
     plane1 fire "BombLauncher";
     sleep .3;
     plane1 fire "BombLauncher"; 
     sleep 2;

   if (plane1 ammo "BombLauncher" < 1) then
    {
       hint "Orzeł1: Amunicja uzupełniona";
            plane1 addMagazine "6Rnd_GBU12_AV8B";
       reLoad plane1
    };
  };

  if ((plane2 distance w1) < 800) then
  {
     plane2 fire "BombLauncher";
     sleep .3;
     plane2 fire "BombLauncher";
     sleep .3;
     plane2 fire "BombLauncher"; 
     sleep 2;

   if (plane2 ammo "BombLauncher" < 1) then
    {
       hint "Orzeł2: Amunicja uzupełniona";
            plane2 addMagazine "6Rnd_GBU12_AV8B";
       reLoad plane2
    };
  };

  if ((plane3 distance w1) < 800) then
  {
     plane3 fire "BombLauncher";
     sleep .3;
     plane3 fire "BombLauncher";
     sleep .3;
     plane3 fire "BombLauncher"; 
     sleep 2;

   if (plane3 ammo "BombLauncher" < 1) then
    {
       hint "Orzeł3: Amunicja uzupełniona";
            plane3 addMagazine "6Rnd_GBU12_AV8B";
       reLoad plane3
    };
  };

  if ((plane4 distance w1) < 800) then
  {
     plane4 fire "BombLauncher";
     sleep .3;
     plane4 fire "BombLauncher";
     sleep .3;
     plane4 fire "BombLauncher"; 
     sleep 2;

   if (plane4 ammo "BombLauncher" < 1) then
    {
       hint "Orzeł4: Amunicja uzupełniona";
            plane4 addMagazine "6Rnd_GBU12_AV8B";
       reLoad plane4
    };
  };
  sleep 1;
};

Powrót do [ArmA II] Edytor

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 15 gości

cron