Teraz jest Pt 29 mar, 2024 04:29


Zatrzymanie skryptu

Archiwum działów sekcji Operation Flashpoint
  • Autor
  • Wiadomość
Offline

qwer17

Szeregowy

Szeregowy

  • Posty: 22
  • Dołączył(a): Wt 27 lut, 2007 17:14

Zatrzymanie skryptu

PostSo 27 mar, 2010 01:35

Mam małe pytanie do szerokiego grona mędrców tego forum. Czy jeśli jednostka (np. żołnierz jakiś) wykonuje założenia skryptu to czy jest taka możliwość aby zatrzymać wykonywanie tego skryptu w dowolnym momencie, czy trzeba czekać aż się wykona?

Np. taka sytuacja

x1-żołnierz
obj1-obiekt 1
obj2-obiekt 2
obj3-obiekt 3

W ramach sqs1, x1 biegnie do punktu obj1 potem do obj2, natomiast w sqs2 dostaje rozkaz dotrzeć do obj3

A Więc czy jest taka możliwość, że jeśli x1 jeszcze jest pomiędzy obj1 i obj2 i zostanie uruchomiony sqs2, a wtedy x1 pobiegnie do obj3 i oleje obj2. Jeśli taka możliwość jest to ja nie wiem jak to zrobić.
Ostatnio edytowano N 28 mar, 2010 15:56 przez qwer17, łącznie edytowano 4 razy
"Cave tibi a cane muto"
Offline
Avatar użytkownika

alderous

Pułkownik

Pułkownik

  • Posty: 1784
  • Dołączył(a): Cz 19 sie, 2004 13:20
  • Lokalizacja: Łódź

PostSo 27 mar, 2010 14:20

Pewnie na sqf jest to prostsze do zrobienia, ale na nich się nie znam. Jeśli chodzi o sqs to rozwiązaniem jest pętla sprawdzająca czy nie został uruchomiony sqs2. Czyli w sqs1 byłoby coś takiego:

sol1 dostaje polecenie marszu do obj2

pętla sprawdzająca co sekundę czy sqs2 nie został uruchomiony (wtedy exit), mieląca tak długo aż sol1 nie dotrze do obj2 (sprawdzane np. przez distance)

sol1 dostaje polecenie marszu do obj3

exit
Offline

qwer17

Szeregowy

Szeregowy

  • Posty: 22
  • Dołączył(a): Wt 27 lut, 2007 17:14

PostSo 27 mar, 2010 16:01

Ok pętla dobry pomysł, tylko jest jeden mały babol. Mianowicie jeśli sqs1 zostanie zatrzymany i uruchomiony zostanie sqs2 (w momencie gdy x1 jest w połowie drogi do obj2) to żołnierz mimo wszystko i tak biegnie do tego punktu (obj2) czyli skrypt się zatrzyma, ale wydana już komenda nie. A więc jak anulować wykonywanie rozkazu natychmiast, aby jednostka mogła przystąpić do wykonywania procedur sqs2.

sqs1:
Kod: Zaznacz cały
x1 domove getpos obj1
#CHECK0
?(stat):EXIT
?((x1 distance obj1)>5):Goto "CHECK0"
x1 domove getpos obj2
#CHECK1
?(stat):EXIT
?((x1 distance obj2)>5):Goto "CHECK1"
EXIT


zmienna stat jest zainicjowana jako false, w momencie wydania rozkazu startu sqs2, dostaje wartość true, ale zanim zostanie uruchomiony sqs2.

komenda x1 stop true nie daje żadnych efektów
Ostatnio edytowano N 28 mar, 2010 15:47 przez qwer17, łącznie edytowano 1 raz
"Cave tibi a cane muto"
Offline
Avatar użytkownika

Kadryl

Major

Major

  • Posty: 883
  • Dołączył(a): Cz 14 wrz, 2006 14:04
  • Lokalizacja: Wa-wa

PostSo 27 mar, 2010 18:56

Jeżli sterujesz waypointami za pomocą skryptu (nie w edytorze) to spróbuj tak:

Kod: Zaznacz cały
x1 domove getpos obj1
@((unitReady x1) or (stat))
? (stat) : x1 domove getpos obj3; exit
x1 domove getpos obj2
@((unitReady x1) or (stat))
x1 domove getpos obj3
exit
Offline

qwer17

Szeregowy

Szeregowy

  • Posty: 22
  • Dołączył(a): Wt 27 lut, 2007 17:14

PostSo 27 mar, 2010 19:14

Hehe sytuacja którą przedstawiłem jest tylko poglądowa w rzeczywistości zależy mi na tym aby sqs2 wykonywał znacznie bardziej złożone operacje niż tu podana jedna komenda.

Problem opiera się tylko o to czy można przerwać działanie sqs1 w danym momencie (w sensie dosłownym) czy trzeba poczekać do wykonania aktualnie wykonywanego polecenia (w ramach zatrzymywanego sqs1).

Bo może nie można tak zrobić wtedy ok. Raczej nie znam komendy na reset zadań wykonywanych przez jednostkę. Ale może ktoś wie jak to zrobić dlatego pytam :smile:
"Cave tibi a cane muto"
Offline
Avatar użytkownika

Kadryl

Major

Major

  • Posty: 883
  • Dołączył(a): Cz 14 wrz, 2006 14:04
  • Lokalizacja: Wa-wa

PostN 28 mar, 2010 10:54

A o jakie operacje / komendy chodzi ?
Offline

qwer17

Szeregowy

Szeregowy

  • Posty: 22
  • Dołączył(a): Wt 27 lut, 2007 17:14

PostN 28 mar, 2010 13:47

Ruch, wsiadanie i wysiadanie z pojazdów, warunki na dystans, zmiana stanu gotowości, warunki dystansowe i takie tam... dlatego potrzebny mi jest jest drugi skrypt nie mogę wszystkiego załatwiać jednym.

Z resztą to rozwiązanie które jest z grubsza już wystarczy. Ale jeśli można by było to zrobić tak jak chcę to był by lepszy efekt po prostu.

Czyli nie ma możliwości anulowania aktualnie wykonywanego rozkazu?
"Cave tibi a cane muto"
Offline
Avatar użytkownika

reyhard

Pułkownik

Pułkownik

  • Posty: 1455
  • Dołączył(a): So 12 mar, 2005 09:56
  • Lokalizacja: wielkiego brata

PostN 28 mar, 2010 15:17

ruch można przerwać komenda doStop, tak jak Aldi wskazał, w pętli sprawdzasz warunek wyjścia i zatrzymania skryptu po czym coś tam robisz i wychodzisz ze skryptu.Czyli z grubsza rzecz biorąc, wychodzi na to, co zrobił Kadryl, z tą różnicą, że ja bym korzystał jednak z goto - @ ma częstotliwość sprawdzania warunku w czasie rzeczywistym (czy coś takiego), więc ma to tendencje generalanie do zapychania procesora, jeżeli warunek jest jakis skomplikowany.
Po prostu przyjmij do wiadomości, że nadciąga rewolucja proletariacka, lada dzień Chavez z Castro i Bin Ladenem nadjadą na białym traktorze i uwolnią ciemiężony lud polski spod władzy międzynarodowego kapitału.
Offline

qwer17

Szeregowy

Szeregowy

  • Posty: 22
  • Dołączył(a): Wt 27 lut, 2007 17:14

PostN 28 mar, 2010 15:22

Wszystko spoko tylko komenda dostop ma mały feler
DoStop unit

Opis:
Nakazuje zatrzymać się (bez komunikatu radiowego). Uwaga! - komenda DoStop nigdy nie ulega zakończeniu tj. jednostka nigdy nie będzie gotowa (komenda UnitReady da wynik: false)


Już się tym bawiłem...
Ostatnio edytowano N 28 mar, 2010 15:25 przez qwer17, łącznie edytowano 1 raz
"Cave tibi a cane muto"
Offline
Avatar użytkownika

Kadryl

Major

Major

  • Posty: 883
  • Dołączył(a): Cz 14 wrz, 2006 14:04
  • Lokalizacja: Wa-wa

PostN 28 mar, 2010 15:24

Rzecz w tym że opisane komendy zmieniają się poprzez ich NADPISANIE np. : wsiadanie/wysiadanie, warunki na dystans, zmiany stanu gotowości etc. o ile nie są zdefiniowane w edytorze (na mapie).
Czyli problem nie jest w przerwaniu skryptu ale zmianie przypisanych wcześniej w "sqs1" wartości i zablokowaniu ich nadpisania w dalszej części skryptu "sqs1".
Np.
1) uruchamiamy "sqs1" i przypisujemy: _a = 1, _b = 1 ,...
2) skrypt "sqs1" kończy działanie więc : _a = 2, _b = 2, ...
w między czasie coś sie dzieje i autor programu oczekuje że:
1-2) skrypt "sqs1" przypisze: _a = 3, _b = 3, ... i będą to wartości już nie zmienione w fazie (2)
W tym wypadku potrzebujesz jedynie blokera typu
Kod: Zaznacz cały
? (stat) : [] exec "sqs2.sqs"; exit

który uniemozli zakończenie skryptu sqs1 natomiast uruchomi przypisanie nowych wartości.
Offline

qwer17

Szeregowy

Szeregowy

  • Posty: 22
  • Dołączył(a): Wt 27 lut, 2007 17:14

PostN 28 mar, 2010 15:39

No to dowiedziałem się dziś czegoś nowego :grin:

sqs1
Kod: Zaznacz cały
x1 domove getpos obj1
#CHECK0
? (stat) : [] exec "sqs2.sqs"; exit
?((x1 distance obj1)>5):Goto "CHECK0"
x1 domove getpos obj2
#CHECK1
? (stat) : [] exec "sqs2.sqs"; exit
?((x1 distance obj2)>5):Goto "CHECK1"
EXIT


Teraz działa niezawodnie ! Wielkie dzięki, sam bym się długo bawił :twisted:
"Cave tibi a cane muto"
Offline
Avatar użytkownika

Kadryl

Major

Major

  • Posty: 883
  • Dołączył(a): Cz 14 wrz, 2006 14:04
  • Lokalizacja: Wa-wa

PostN 28 mar, 2010 15:44

Dodaj czasową zwłokę bo skrypt bedzie młócił blokujac inne procesy:

Kod: Zaznacz cały
x1 domove getpos obj1
#CHECK0
~1
? (stat) : [] exec "sqs2.sqs"; exit
?((x1 distance obj1)>5):Goto "CHECK0"
x1 domove getpos obj2
#CHECK1
~1
? (stat) : [] exec "sqs2.sqs"; exit
?((x1 distance obj2)>5):Goto "CHECK1"
EXIT
Offline

qwer17

Szeregowy

Szeregowy

  • Posty: 22
  • Dołączył(a): Wt 27 lut, 2007 17:14

PostN 28 mar, 2010 15:51

OK. Też racja, ale to już wyjdzie w praniu. Dzięki jeszcze raz!

Temat do zamknięcia
"Cave tibi a cane muto"

Powrót do Operation Flashpoint

Kto przegląda forum

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

cron