Skocz do zawartości
pietia87

Skrypt regulujący zasięg otwarcia ognia przez AI

Rekomendowane odpowiedzi

Witam, od kilku dni testuję działanie moda UNSUNG z ACE (działa !!).

Potrzebuje pomocy ze skryptem, który uniemożliwiałby AI prowadzenie ognia z dużej odległości.

W założeniu AI ma otwierać ogień dopiero gdy znajdzie się blisko gracza ok 10m (w UNSUNG wysoka trawa nie pozwala graczom widzieć dalej).

Skrypt ma wyrównać szanse w walce w dżungli przeciw AI.

 

Do tej pory testowałem z pozytywnym skutkiem, na hostowanym serwerze coś takiego:

 

Są 2 wyzwalacze (st1 i st2). AI ma ustawione combat mode w 1 wp na "Hold fire, engane at will". Gdy gracz znajduję się w odległości większej niż 10m i zostanie zauważony, AI stara się skrócić dystans do mniej niż 10m, nie otwiera ognia.

Gdy odległość jest mniejsza niż 10m, AI otwiera ogień. Wszystko pięknie ładnie, ale:

- taki rodzaj "detekcji" na pewno nie będzie działał przy większej ilości AI i graczy

- w "x distance player" parametr "x" odnosi się do jednego AI (po jego śmierci wyzwalacze nie działają), nie mam pojęcia, jak zrobić, żeby oznaczał dowolnego AI w obrębie wyzwalacza.

- próbowałem to przerobić na skrypt .sqf (jak na razie na kolanie, bo jestem w pracy :/) i nie wiem, czy moja koncepcja jest poprawna.

 

Wyzwalacz st1

name: st1

Acct: opfor

radius: 500m

condition: x distance player >10

onAcct: if{(side _x== east) then {_x setcombatmode "white"; _x doWatch objNull};} foreach allunit;

onDeact: st2=true

 

Wyzwalacz st2

name: st2

Acct: opfor

radius: 500m

condition: x distance player <10

onAcct: if{(side _x== east) then {_x setcombatmode "RED"};} foreach allunit;

onDeact: st1=true

 

***********************

Skrypt .sqf

 

wyzwalacz

onAcct: null=execVM "dystans1.sqf" foreach units thislist;

dystans1.sqf

_x=this select 1;

 

if{

(side _x == east; _x distance player > 10) then {_x setCombatMode "WHITE"} else {_x setCombatMode "RED"};

};

 

Byłbym bardzo wdzięczy na jakiekolwiek propozycje i uwagi.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

condition: x distance player >10

- a co oznacza ten "x" w warunku wyzwalacza ?

Problem jest że trudno stworzyć warunek dla zależności między dwoma tablicami (gracze i AI) podczas gdy nie ma Event Handlera dla funkcji dystans (a szkoda) :eh:

 

Można spróbować tak.

Wstawić wyzwalacz o zasięgu całej mapy, uruchomiany przez AI, o nazwie "lista_ai" - w celu stworzenia tablicy jednostek AI.

W Init.sqf uruchomimy sobie skrypt, który co jakiś czas sprawdza relacje między tymi dwoma tablicami:

 

if (!isServer) exitwith {};
ak = [];

while {true} do {
for "_i" from 0 to (count playableUnits) -1 do {
{if (_x distance (playableunits select _i) < 10) then {ak set [count ak, _x];} } foreach (list lista_ai);
{_x setCombatMode "RED"; _x doWatch (playableunits select _i)} foreach ak;
sleep 0.5;
ak = [];
};
sleep 5;
{_x setCombatMode "WHITE"} foreach (list lista_ai);
};

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wielkie dzięki Kadryl.

a co oznacza ten "x" w warunku wyzwalacza ?

"x" to nazwa AI, które służyło do mierzenia odległości.

 

Walka w gęstej dżungli nabrała klimatu (AI podchodzi blisko z każdej strony), tylko jest jeden problem, gdy pojedynczy AI znajdzie się w odległości <10m, to ogień otwierają wszystkie pozostałem niezależnie od odległości. Podobnie, gdy gracz strzela do AI, które znajdują się dalej niż 10 m, po trafieniu wszystkie rozpoczynają ostrzał (swoją drogą to jest jeszcze zrozumiałe).

Zastanawiam się, czy jest możliwe przerobienie tego skryptu, żeby zmieniał combat mode na "RED" tylko dla jednostki znajdującej się najbliżej gracza.

 

Czy zmienienie "foreach ak" na foreach (_x distance (playableunits select _i) < 10) jest dopuszczalne ?

 

if (!isServer) exitwith {};

ak = [];

 

while {true} do {

for "_i" from 0 to (count playableUnits) -1 do {

{if (_x distance (playableunits select _i) < 10) then {ak set [count ak, _x];} } foreach (list lista_ai);

{_x setCombatMode "RED"; _x doWatch (playableunits select _i)} foreach (_x distance (playableunits select _i) < 10);

sleep 0.5;

ak = [];

};

sleep 5;

{_x setCombatMode "WHITE"} foreach (list lista_ai);

};

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Lepiej nie nazywac swoich zmiennych jako "x" ponieważ jest ona zarezerwowana dla działania niektórych funkcji w Armie np. dla "foreach".

 

W skrypcie dażyłem aby status na "red" zmienia się tylko dla AI wzbudzonego przez warunek zbliżenia do danego gracza, tzn. tworzona jest tablica "ak" na której dokonujesz działania (sterowania).

 

Prawdopodobnie masz zgrupowane AIs, z czego wynika, że przyjmują taki sam status jak lider grupy.

 

Czy zmienienie "foreach ak" na foreach (_x distance (playableunits select _i) < 10) jest dopuszczalne ?

Nie ponieważ za "foreach" nie moze być nic innego jak tylko tablica elementów, a w żadnym wypadku warunek.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×