Teraz jest Cz 05 mar, 2026 18:36


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

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ą."
Offline
Avatar użytkownika

gremdek

Porucznik

Porucznik

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

PostPt 05 mar, 2010 11:14

zawsze rozwiązanie z dwoma triggerami i knowsabout.

Kod: Zaznacz cały
private[...];
_opfory = list trigger_opforow
_blu = list trigger_bluforow

_bool = false;
{_opfor = _x; { if (_opfor knowsAbout _x > 0.105) then {_bool = true;}; } forEach _blu;} forEach _opfory;
_bool


nie jestem do końca pewien czy tak można zagnieżdzać forEach, ale chyba tak. no i trzeba sprawdzić wartość knowsAbout, ja dałem tą z bikipedii jeszcze dla ofp.



nie musisz robić dla każdego KRONa kolejnych wyzwalaczy.
albo topornie
Kod: Zaznacz cały
KRON1 = true; KRON2 = true; ...

albo
Kod: Zaznacz cały
call compile {{format[{KRON%1 = true},_x];} forEach [1, 2, 3, 4, ...]};
:(
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostPt 05 mar, 2010 11:55

A co się stanie jak OPFOR uruchomi trgger będąc w pojeździe ?

Kod: Zaznacz cały
...
{_opfor = _x; { if (_opfor knowsAbout _x > 0.105) then {_bool = true;}; } forEach _blu;}...

prawdopodobnie skrypt wogóle nie zadziała.


Ze swojej strony proponuje tylko jeden wyzwalacz ze skryptem :
Kod: Zaznacz cały
/*
wywołanie w wyzwalaczu
_alarm = [trigger, czas, "MAN", odległość od trigera, "KRON1", "KRON2", "KRON3"] execVM "OP.sqf" (możliwość wstawienia dowolnej ilości KRONx)
KADRYL
*/
private["_nr","_i","_K"];
_nr = count _this;
_i = 4;
_K = false;
sleep (_this select 1);
{_c = _x; if (({((_x knowsAbout _c) > 0) and (alive _x)} count (nearestObjects [(_this select 0), [(_this select 2)], (_this select 3)] - (list (_this select 0)))) > 0) then {_K = true;} } foreach (list (_this select 0));
while {_i < _nr} do {call compile format ["%1 = _K", (_this select _i)]; _i=_i+1;};

W wywołaniu można regulować obszar z ktorego beda wczytywane jednostki OPFOR i sprawdzanie czy coś wiedzą o BLUFOR w rejonie wyzwalacza TR.
Parametr "MAN" zabezpiecza przed wproawdzeniem błedu do działania skryptu czyli. trigger uruchomiony przez pojazd który nie działa z funkcją knowsAbout.
Offline
Avatar użytkownika

gremdek

Porucznik

Porucznik

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

PostPt 05 mar, 2010 12:56

mała uwaga:
kompilacji nie robimy w pętlach ani innych takich. po co kompilować parę razy ten sam kod?



co do zagnieżdżenia:
In ArmA2, the variable _x is always local to the foreach block so it is safe to nest foreach commands.

więc kod prawdopodobnie zadziała.


a z tym pojazdem to nie widziałem, cenna uwaga.
:(
Offline
Avatar użytkownika

Kadryl

Major

Major

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

PostPt 05 mar, 2010 16:01

kompilacji nie robimy w pętlach ani innych takich. po co kompilować parę razy ten sam kod?

Chodzi o kompilacje kodu dla wielu zmiennych.
Osobiscie nie jestem zwolennikiem tego rozwiązania ponieważ obciąża pamieć.
Poprzednia strona

Powrót do [ArmA II] Edytor

Kto przegląda forum

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