Teraz jest Pt 29 mar, 2024 14:13


Trigger, BLUFOR detected by OPFOR kiedy zadziala,

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

Rafalsky

Major

Major

  • Posty: 748
  • Dołączył(a): Cz 21 sty, 2010 23:27
  • Lokalizacja: Londyn

Trigger, BLUFOR detected by OPFOR kiedy zadziala,

PostPn 01 mar, 2010 18:19

Prosze o wytlumacznie kiedy zadziala taki trigger ?

TRIGGER:
kolo 100x100
activation: BLUFOR [once]
[detected by OPFOR]

Kiedy zadziala taki trigger:
kiedy BLUFOR zostanie wykryty przez OPFOR
1.niezalaznie gdzie sie znajduja byle jakis BLUFOR zostal wykryty przez OPFOR
2 BLUFOR (wykrywana jednostka) musi byc w tym czasie w obrebie triggera
3 wykrywajace jednostki BLUFOR i OPFOR musza byc w obrebie triggera
4 OPFOR (wykrywajaca jednostka) musi byc w obrebie triggera
Ostatnio edytowano Cz 04 mar, 2010 10:44 przez Rafalsky, łącznie edytowano 1 raz
- "Nigdy nie mów ludziom, jak mają wykonywać swe zadania. Powiedz im tylko, co mają robić, a będziesz zdziwiony ich pomysłowością."
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostPn 01 mar, 2010 19:04

Wyzwalacz aktywuje się gdy są spełnione 3 warunki:
1) BLUFOR jest w rejonie wyzwalacza
2) ... *
3) OPFOR "widzi" BLUFOR (OPFOR KnowsAbout BLUFOR > 0)
4) Gracz nie jest jednostką OPFOR ponieważ wtedy nie działa funkcja "KnowsAbout"


*EDIT: 2) OPFOR jest w rejonie wyzwalacza - nie musi
Ostatnio edytowano Śr 03 mar, 2010 01:33 przez Kadryl, łącznie edytowano 2 razy
Offline
Avatar użytkownika

Rafalsky

Major

Major

  • Posty: 748
  • Dołączył(a): Cz 21 sty, 2010 23:27
  • Lokalizacja: Londyn

PostPn 01 mar, 2010 19:18

Znaczy ta
Kadryl napisał(a):3) OPFOR "widzi" BLUFOR (OPFOR KnowsAbout BLUFOR > 0)

rozumiem aby trigger zadzialal ta sytuacja musi zaistniec w triggerze pomiedzy jednostkami ktore sie znajduja w trigerze.

Po za trigerem rozne jednostki opfor blufor moga walczyc ze soba, ale jezeli w trigerze beda jednoski, ktore nie wiedza wzajemnie o sobie to NIE odpala triggera.
- "Nigdy nie mów ludziom, jak mają wykonywać swe zadania. Powiedz im tylko, co mają robić, a będziesz zdziwiony ich pomysłowością."
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostPn 01 mar, 2010 19:34

Po za trigerem jednostki opfor blufor moga walczyc ze soba ale nie odpala triggera.

Tak. Wyzwalacz nie uruchomi się nawet gdy jednostki połączone są w grupy i przekazują sobie wzajemnie informacje o wrogu.
Np. :
BLUFOR_1 i OPFOR_1 stoją w rejonie aktywacji trigera każdy z innej strony budynku (nie widzą się)
OPFOR_2 jest poza wyzwalaczem ale widzi BLUFOR_1
OPFOR_1 i OPFOR_2 są w jednej drużynie (zgrupowani)
To w tym wypadku wyzwalacz nie uruchomi się.
Offline
Avatar użytkownika

Rafalsky

Major

Major

  • Posty: 748
  • Dołączył(a): Cz 21 sty, 2010 23:27
  • Lokalizacja: Londyn

PostPn 01 mar, 2010 19:52

Dzieki, o to mi chodzilo.

Jeszcze jedno, jak opoznic dzialanie takiego triggera tz.

Jest zmienna globalna KRON=0

Jezeli w triggerze jednostka OPFOR wykryje BLUFOR ale w ciagu 20sek BLUFOR zabije wszystkich OPFOR w tym triggerze to KRON=0, jezeli ktos przezyje z OPFOR to KRON=1.

Zmienna KRON==1 bedzie oznaczala ze wyslano komunikat o ataku na posterunek i bedzie wyslanie posilkow w ten rejon.
- "Nigdy nie mów ludziom, jak mają wykonywać swe zadania. Powiedz im tylko, co mają robić, a będziesz zdziwiony ich pomysłowością."
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostPn 01 mar, 2010 21:58

Jeszcze jedno, jak opoznic dzialanie takiego triggera tz.
Jest zmienna globalna KRON=0
Jezeli w triggerze jednostka OPFOR wykryje BLUFOR ale w ciagu 20sek BLUFOR zabije wszystkich OPFOR w tym triggerze to KRON=0, jezeli ktos przezyje z OPFOR to KRON=1.
Zmienna KRON==1 bedzie oznaczala ze wyslano komunikat o ataku na posterunek i bedzie wyslanie posilkow w ten rejon.


Nazwać nasz triger np.: tr
W aktywacji wpisać:
Kod: Zaznacz cały
[tr] exec "Raf.sqs"


Stworzyć plik o nazwie "Raf.sqs" i wpisać następujący kod:
Kod: Zaznacz cały
;sprawdzenie czy osoby (tutaj aktywacja dla OPFOR) które aktywowały wyzwalacz jeszcze żyja. 
_ob = list (_this select 0)
_K = 0
~20
{if (alive _x) then {_K = 1}} foreach _ob
KRON = _K
exit

Wrzucić plik do katalogu misji.

Następnie wstawić dodatkowy triger alarmu aktywowany:
Kod: Zaznacz cały
Kron == 1


I milej zabawy :mrgreen2:
Offline
Avatar użytkownika

Rafalsky

Major

Major

  • Posty: 748
  • Dołączył(a): Cz 21 sty, 2010 23:27
  • Lokalizacja: Londyn

PostPn 01 mar, 2010 22:49

dzieki

Ta zmienna KRON jest uzywana w skrypcie UPSMON 5.2 tyle ze wprowadzono teraz ze moze byc ich wiecej typu KRON1, KRON2 itd. Wtedy ustawienie 1 w danej KRONx powoduje ze wzywana jest jednostka przypisana do tej zmiennej.

Lepiej dla mnie aby funkcja raf.sqf nie przypisywala sama w srodku wartosci zmiennej KRONx, tylko zwracala TRUE or FALSE (lub 1 albo 0). Nie wiem jak zrovic aby funkcja zwracala wartosc.

W trigerze to chyba potrzebuje cos takiego (poczatki dla mnie, wiec nie wiem czy to poprawnie zapisalem):
Kod: Zaznacz cały
_alarm = nul;
_alarm = [tr,20] execVM "raf.sqf"; //tr to nazwa tego triggera; 20 to czas
if _alarm then KRON1=1;


lub moze lepiej od razu zwrot na 1 lub 0
Kod: Zaznacz cały
KRON1 = [tr,20] execVM "raf.sqf"; //tr to nazwa tego triggera; 20 to czas




jakie zmiany w funkcji raf.sqf ? aby wszystko to zadzialalo.
- "Nigdy nie mów ludziom, jak mają wykonywać swe zadania. Powiedz im tylko, co mają robić, a będziesz zdziwiony ich pomysłowością."
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostŚr 03 mar, 2010 01:39

Sprosotowanie: OPFOR nie musi być w rejonie wyzwalacza.
----
Kod dla pliku sqf będzie taki:
Kod: Zaznacz cały
//sprawdzenie czy obiekty ktore uruchomily wyzwalacz jeszcze zyja
private["_ob","_t","_nrKRON", "_KRON", "_K"];
_ob = list (_this select 0);
_t = _this select 1;
_K = false;
sleep _t;
{if (alive _x) then {_K = true;};} forEach _ob;
alarm = _K;

gdzie alarm to warunek uruchomienia wyzwalacza.

Ta zmienna KRON jest uzywana w skrypcie UPSMON 5.2 tyle ze wprowadzono teraz ze moze byc ich wiecej typu KRON1, KRON2 itd. Wtedy ustawienie 1 w danej KRONx powoduje ze wzywana jest jednostka przypisana do tej zmiennej.

Potrzebny jest więc tu kod uniwersalny - pomyślę
Offline
Avatar użytkownika

Rafalsky

Major

Major

  • Posty: 748
  • Dołączył(a): Cz 21 sty, 2010 23:27
  • Lokalizacja: Londyn

PostŚr 03 mar, 2010 07:29

Kadryl napisał(a):....
{if (alive _x) then {_K = true;};} forEach _ob;
alarm = _K;
czy alarm to jest zmienna globalna, czy tez w raf.sqf do alarm jest przypisywana wartosc jaka funkcja raf.sqf zwroci.

czy jezeli wywolam w trigerze ?
Kod: Zaznacz cały
_alarmek = [tr,20] execVM "raf.sqf"; //tr to nazwa tego triggera 20 to czas
if _alarmek then KRON1=1; // w zaleznosci od trigeera tu moge miec KRON2, KRON3...
to _alarmek przyjmie wartosc tego alarm z funkcji? Chodzi mi aby funkcja zwracala wartosc a nie nadawala jakies globalnej zmiennej juz w sobie, Czy jest to mozliwe w sqf.
- "Nigdy nie mów ludziom, jak mają wykonywać swe zadania. Powiedz im tylko, co mają robić, a będziesz zdziwiony ich pomysłowością."
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostŚr 03 mar, 2010 20:36

Kod: Zaznacz cały
_alarmek = [tr,20] execVM "raf.sqf"; //tr to nazwa tego triggera 20 to czas
if _alarmek then KRON1=1; // w zaleznosci od trigeera tu moge miec KRON2, KRON3...

to _alarmek przyjmie wartosc tego alarm z funkcji? Chodzi mi aby funkcja zwracala wartosc a nie nadawala jakies globalnej zmiennej juz w sobie, Czy jest to mozliwe w sqf.
tak powinno być i nie mam na razie pojęcia dlaczego zamiast tego wyświetla się ścieżka położenia skryptu na dysku :twisted:

Lepiej dla mnie aby funkcja raf.sqf nie przypisywala sama w środku wartości zmiennej KRONx, tylko zwracala TRUE or FALSE (lub 1 albo 0)

Ale nie zmieni to faktu że gdzieś trzeba będzie przyporządkować wartość ALARM do KRON1, KRON2, KRON3, itd.

Ze swojej strony proponuje dwa uniwersalne rozwiązania:
Wersja 1 - automaczyne przyporządkowanie wartości TRUE do wszystkich KRONx wpisanych w instrukcji w wyzwalaczu np. [tr, 20, "KRON1", "KRON2", "KRON3"]
Kod: Zaznacz cały
/*
Uruchomienie alarmu [nazwa trigera, czas, "Zmienne uruchamiane w czasie alarmu", ...]
1) nazwa trigera ktory aktywuje skrypt
2) czas na likwidację jednostek ktore zostaly wykryte zanim uruchomi sie alarm
3) zmienne ktore w momencie alarmu uzyskuja wartosc logiczna TRUE
liczba zmiennych KRON jest dowolna
KADRYL
*/
private["_ob","_t","_nr","_i","_K"];
_ob = list (_this select 0);
_t = _this select 1;
_nr = count _this;
_i = 2;
_K = false;
sleep _t;
{if (alive _x) then {_K = true;};} forEach _ob;
while {_i < _nr} do {call compile format ["%1 = _K", (_this select _i)]; _i=_i+1;};

Wersja 2 - automaczyne wykonuje działanie na wpisanych obiektach (ida tam gdzie jest trigger) np. [tr, 20, zolnierz1, zolnierz2, czolg102]
Kod: Zaznacz cały
/*
Uruchomienie alarmu [nazwa trigera, czas, jednostka1, jednostka2, ...]
1) nazwa trigera ktory aktywuje skrypt
2) czas na likwidację jednostek ktore zostaly wykryte zanim uruchomi sie alarm
3) jednostki ktore w momencie alarmu sa wzywane do miejsca gdzie jest triger
liczba jednostek wzywanych jest dowolna
KADRYL
*/
private["_ob","_t","_nr","_i","_KRON", "_K"];
_ob = list (_this select 0);
_t = _this select 1;
_nr = count _this;
_i = 2;
_KRON = [];
while {_i < _nr} do {_KRON set [count _KRON, (_this select _i)]; _i=_i+1;};
_K = false;
sleep _t;
{if (alive _x) then {_K = true;};} forEach _ob;
{if (_K) then {_x domove (getpos (_this select 0))};} forEach _KRON;
Offline
Avatar użytkownika

gremdek

Porucznik

Porucznik

  • Posty: 428
  • Dołączył(a): Pn 27 lut, 2006 15:02

PostŚr 03 mar, 2010 21:04

Rafalsky napisał(a):
Kadryl napisał(a):....
{if (alive _x) then {_K = true;};} forEach _ob;
alarm = _K;
czy alarm to jest zmienna globalna, czy tez w raf.sqf do alarm jest przypisywana wartosc jaka funkcja raf.sqf zwroci.

czy jezeli wywolam w trigerze ?
Kod: Zaznacz cały
_alarmek = [tr,20] execVM "raf.sqf"; //tr to nazwa tego triggera 20 to czas
if _alarmek then KRON1=1; // w zaleznosci od trigeera tu moge miec KRON2, KRON3...
to _alarmek przyjmie wartosc tego alarm z funkcji? Chodzi mi aby funkcja zwracala wartosc a nie nadawala jakies globalnej zmiennej juz w sobie, Czy jest to mozliwe w sqf.



execVM uruchamia nowy wątek dla tego kodu, _alarmek nie przyjmie wartości zmiennej alarm.



Kod: Zaznacz cały
Syntax:
    Script = argument execVM filename
Parameters:
    argument: Any Value(s)
    filename: String
Return Value:
    Script - script handle, which can be used to determine (via scriptDone) when the called script has finished.



z tego widzisz, że zwróciło ci "script handle"(nie wiem jak to tłumaczą na polski) a nie wartość. bo to ci uruchamia proces(czy jak to się nazywa), a nie funkcję.


---------------------------------


skoro nie chcesz tego KRONa zmieniać to topornie można tak:

w init.sqs/sqf
Kod: Zaznacz cały
skompilowany_kod = compile preprocessfile "dupa.sqf";
ustawKRON = 0;


dupa.sqf:
Kod: Zaznacz cały
//to samo co dał kadryl, ale po co komu milion zmiennych
//wywolanie: [trigger, czas, numerkrona] call skompilowany_kod
sleep (_this select 1);
if (({alive _x} count (list (_this select 0))) > 0) then
{
  ustawKRON = (_this select 2);
};


dodajesz wyzwalacz, powtarzalny, z warunkiem:
Kod: Zaznacz cały
ustawKRON != 0

co robi:
Kod: Zaznacz cały
call compile format["KRON%1 = true",ustawKRON]; ustawKRON = 0;




te skrypciki co ci podał kadryl mają błędy, jednak łatwe do znalezienia.
:(
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostŚr 03 mar, 2010 22:16

Całkiem niezła kompresja gremdek :brawo:

Podajesz jednak skrypt dla jednej zmiennej "numerkrona" natomiast problem jest aby skrypt przesyłał wartość TRUE dla kilku zmienych "ustawKRON".

Jeżeli już to zróbmy to dobrze do końca:
---------------
w init.sqs/sqf Kod:
Kod: Zaznacz cały
skompilowany_kod = compile preprocessfile "dupa.sqf";
ustawKRON = 0;


dupa.sqf: Kod:
Kod: Zaznacz cały
//to samo co dał kadryl, ale po co komu milion zmiennych
//wywolanie: [trigger, czas] call skompilowany_kod
sleep (_this select 1);
if (({alive _x} count (list (_this select 0))) > 0) then
{
  ustawKRON = true;
};


dodajesz wyzwalacze, powtarzalne, z warunkiem: Kod:
Kod: Zaznacz cały
ustawKRON


co robi: Kod:
Kod: Zaznacz cały
KRON1 = true; ustawKRON = false;


i tak dla każdego KRONAx kolejne wyzwalacze

---------------------

te skrypciki co ci podał kadryl mają błędy, jednak łatwe do znalezienia.

Te skrypciki działają ale nic nie stoi na przeszkodzie abyś dopowiedział już jakie błędy znalazłeś. Zawsze chętnie się uczę ;-)
Offline
Avatar użytkownika

Rafalsky

Major

Major

  • Posty: 748
  • Dołączył(a): Cz 21 sty, 2010 23:27
  • Lokalizacja: Londyn

PostCz 04 mar, 2010 00:54

Panowie ?

male nieporozumienie chyba:

list zwraca jednostki ktore aktywuja triger: czyli BLUFOR

A mi przeciez chodzi o liste OPFOR ? To oni mnie wykrywaja, i to ich mam pozabijac.
- "Nigdy nie mów ludziom, jak mają wykonywać swe zadania. Powiedz im tylko, co mają robić, a będziesz zdziwiony ich pomysłowością."
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostCz 04 mar, 2010 09:24

W istocie tak jest :jezor:
Może teraz gremdek jako pierwszy zaproponuje jakieś rozwiązanie :clever:
Swoje prześle na PM.
Offline
Avatar użytkownika

Rafalsky

Major

Major

  • Posty: 748
  • Dołączył(a): Cz 21 sty, 2010 23:27
  • Lokalizacja: Londyn

PostCz 04 mar, 2010 10:23

I to tylko te, ktore aktywuja, czyli jezeli BLUFOR ma 15 osob w triigerze a OPFOR zobaczy pierrwszych trzech to list bedzie miala tylko tych ktorzy zostali zauwazeni.

-----
Problem zrobil mi sie trudniejszy niz myslalem.

Jest pewne dorazne rozwiazanie po konsultacjach z kolega Madmax

Ustawic inny triger obejmujace ten obszar aktywowany OPFOR / present i ten nazwac TR1
Taki triger odpali sie na poczatku misji, i list [TR1] to bedzie tam caly OPFOR z obszaru.

Drugi triger TR2 aktywowany przez BLUFOR / detected by OPFOR , zawiera ta funkcje z list [TR1] czyli bedzie mial wszystkich OPFOR w tym obrzarze.

MINUS.
BLUFOR bedac w tym obszarze triggera nie koniecznie musi byc wykryty przez ten OPFOR z TR1. Ale jezeli brak innych partoli OPFOR w obrzarze i taki OPFOR (z TR1) to tylko posterunek 3-4 statycznych ludzikow i triger jest nie wielki rozmiarami to bedzie OK.


Zrobie testy innego rozwiazania:
Jak wspominalem caly ten KRONx==TRUE potrzebny mi jest do UPSMON skryptu.
Tam moge przypisac np. BRAVO squad ze sa posilkami #1.
Jezeli zmienna globalna KRON1==TRUE to BRAVO wprowadza sie w stan "udziel pomocy" i udaj sie w miejsce "where enemy were".

Jezeli wstawie w trigerze BLUFOR/detected by OPFOR opoznienie aktywacji 20sek, i zabije wszystkich ALFA OPFOR w 10 sek, to po 20 sek triger i tak sie sie aktywuje i ustawi KRON1=TRUE

I to bedzie oznaczalo BRAWO (#1) udaj sie "where enemy were", ale ALFA juz nie istnieje wiec nie moze podac BRAWO gdzie jestesmy. Czyli BRAWO zostanie prze KRON1 wprowadzone w tryb "udziel pomocy" ale nie wie gdzie isc (dokladnie: nie otrzyma info gdzie jest wrog).

DAM znac czy tak jest.

PS. jezeli BRAWO jednach wyruszy w kierunku "ostatnia" znana pozycje BLUFOR to bedzie lipa. Co jest bledem UPSMON, bo niby kto im mialby to przekazac. (odleglosci sa duze , i nie bylo wczesniejszej wymiany info o przeciwniku)
- "Nigdy nie mów ludziom, jak mają wykonywać swe zadania. Powiedz im tylko, co mają robić, a będziesz zdziwiony ich pomysłowością."
Następna strona

Powrót do [ArmA II] Edytor

Kto przegląda forum

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

cron