AI no se mueve una vez spawneada

Sección para misiones y edición ArmA III

Moderador: C. Misiones & Noticias

Responder
Avatar de Usuario
<A2>Dark Darius
Soldado A2
Soldado A2
Mensajes: 980
Registrado: 10 Jun 2014, 23:06

AI no se mueve una vez spawneada

Mensaje por <A2>Dark Darius »

Hola chicos,

tengo un problema con un script, me salta el error de que una variable no ha sido declarada. Obviamente sí que lo está, pero no entiendo por qué el juego no es capaz de recordar que ya la variable existe.

"scriptvehiculos.sqf"

Código: Seleccionar todo

private["_bestplace","_unsorted","_i","_j","_text","_listdriver","_listgunner","_listcommander","_listturret","_jugador","_swp"];

_bestplace = _this select 0;
_unsorted = (position _bestplace) nearEntities [["rhs_t80","rhs_t80bvk","rhs_t72bb_tv","rhs_bmp2k_msv","rhs_zsu234_aa","rhs_bmp1p_msv"], 50];

for "_j" from 0 to count _unsorted - 1 do {

	_i = floor random 1000000;
	_text = formatText ["grpmalo12%1",_i]; //Aquí se declara y se crea un noombre aleatorio para el grupo de la IA que quiero spawnear
	_veh = _unsorted select _j;
	_cargo = _veh emptyPositions "cargo";
	_text = [position _bestplace, EAST, unidadesE1] call BIS_fnc_spawnGroup; //Aquí vuelve a declararse la variable y funciona
	sleep 3;
	{ 
		_x addmagazine "HandGrenade";
		_x addmagazine "HandGrenade"; 
		_x setSpeedMode "full"; 
		_x addmagazine "SmokeShell"; 
		_x addmagazine "SmokeShell"; 
		_x addeventhandler ["Killed", {_this execVM "spawnAI\removedead.sqf"}];
 
		_listdriver = fullCrew [vehicle _veh, "driver"];
		_listgunner = fullCrew [vehicle _veh, "gunner"];
		_listcommander = fullCrew [vehicle _veh, "commander"];
		_listturret = fullCrew [vehicle _veh, "turret"];
		if ((count _listcommander)==0 ) then { _x  moveInCommander _veh;};
		if ((count _listdriver)==0 ) then { _x  moveInDriver _veh;};
		if ((count _listgunner)==0 ) then { _x  moveIngunner _veh;};
		if ((count _listdriver)==0 ) then { _x  moveInDriver _veh;};
		if ((count _listturret)==0 ) then { _x moveInTurret [_veh, [0]];};
		if ((count _listturret)==0 ) then { _x moveInTurret [_veh, [0, 0]] ;};

	} foreach units _text; //_text es la variable que contiene el nombre del grupo spawneado
	
	_text allowFleeing 0;
	_null = _text spawn {
		Hunt_players_fnc = {
			_jugador = "";
			{
				if (isPlayer _x AND alive _x) then {_jugador = _x};
			} foreach (playableUnits + switchAbleUnits);
			_swp = _this addWaypoint [getPos _jugador, 5];
			_swp setWaypointStatements ["true", "_null = (group this) spawn Hunt_players_fnc;"];
			_swp setWaypointType "SAD";
			_swp setWaypointCombatMode "RED";
			_swp setWaypointSpeed "FULL";
		};
	_null = _text spawn Hunt_players_fnc; // no entiendo que _text se quede vacío cuando en ningún momento hago eso
	};
};
sleep 3;

El script se basa en spamear tripulación en los vehículos que existan cerca de una lógica a de radio que yo quiera poner. El spawn funciona correctamente, lo que no funciona es que persigan a los jugadores, no entiendo por qué si lo que le estoy pidiendo simplemente es que el grupo spawneado guardado en la variable "_text" ejecute la pequeña funcion que está dentro del bucle for.

Bueno, mi idea es que los puntos de control que tendrá ese grupo de IA se quede en un bucle infinito persiguiendo a los jugadores. Pero el juego me dice en la línea 50 "_null = _text spawn Hunt_players_fnc;" que "_text" es una variable definida. ¡¡¡¿no está definido desde antes en las primeras líneas del bucle for?!!!
Añadir en amigos de Steam Imagen
Imagen

Avatar de Usuario
<A2>Dark Darius
Soldado A2
Soldado A2
Mensajes: 980
Registrado: 10 Jun 2014, 23:06

Re: AI no se mueve una vez spawneada

Mensaje por <A2>Dark Darius »

He encontrado una solución que funciona. He reeditado el script que spawnea la IA en los vehículos así:

"scriptvehiculos.sqf"

Código: Seleccionar todo

private["_bestplace","_unsorted","_i","_j","_text","_listdriver","_listgunner","_listcommander","_listturret"];

_bestplace = _this select 0;
_unsorted = (position _bestplace) nearEntities [["rhs_t80","rhs_t80bvk","rhs_t72bb_tv","rhs_bmp2k_msv","rhs_zsu234_aa","rhs_bmp1p_msv"], 50]; //Aquí escriben los vehículos que serán ocupados, son el nombre de su clase

for "_j" from 0 to count _unsorted - 1 do {

	_i = floor random 1000000;
	_text = formatText ["grpmalo12%1",_i];
	_veh = _unsorted select _j;
	_cargo = _veh emptyPositions "cargo";
	_text = [position _bestplace, EAST, unidadesE1] call BIS_fnc_spawnGroup; 
	sleep 3;
	{ 
		_x addmagazine "HandGrenade";
		_x addmagazine "HandGrenade"; 
		_x setSpeedMode "full"; 
		_x addmagazine "SmokeShell"; 
		_x addmagazine "SmokeShell"; 
		_x addeventhandler ["Killed", {_this execVM "spawnAI\removedead.sqf"}];
 
		_listdriver = fullCrew [vehicle _veh, "driver"];
		_listgunner = fullCrew [vehicle _veh, "gunner"];
		_listcommander = fullCrew [vehicle _veh, "commander"];
		_listturret = fullCrew [vehicle _veh, "turret"];
		if ((count _listcommander)==0 ) then { _x  moveInCommander _veh;};
		if ((count _listdriver)==0 ) then { _x  moveInDriver _veh;};
		if ((count _listgunner)==0 ) then { _x  moveIngunner _veh;};
		if ((count _listdriver)==0 ) then { _x  moveInDriver _veh;};
		if ((count _listturret)==0 ) then { _x moveInTurret [_veh, [0]];};
		if ((count _listturret)==0 ) then { _x moveInTurret [_veh, [0, 0]] ;};

	} foreach units _text; 
	
	_null = [_text] execVM "huntPlayers.sqf"; //aquí hago la llamada a que busque a los jugadores
	
};
sleep 3;
"huntPlayers.sqf"

Código: Seleccionar todo

private["_cazador","_jugador","_swp"];

_cazador = _this select 0;

_jugador = "";
{
	if (isPlayer _x AND alive _x) then {_jugador = _x};
} foreach (playableUnits + switchAbleUnits); //hacemos que reconozca a los jugadores y saber su posicion

// bucle while en infinito muy sencillo que busque y busque a los jugadores hasta matarlos
while {true} do {
	_swp = _cazador addWaypoint [getPos _jugador, 100];
	_swp setWaypointType "MOVE";
	_swp setWaypointCombatMode "RED";
	_swp setWaypointSpeed "FULL";
	sleep 60; 
};
Añadir en amigos de Steam Imagen
Imagen

Avatar de Usuario
<A2>Pescadorr
Soldado A2
Soldado A2
Mensajes: 6569
Registrado: 09 Sep 2011, 03:28

Re: AI no se mueve una vez spawneada

Mensaje por <A2>Pescadorr »

En la primera parte te faltaba los corchetes antes de spawn para definir los parámetros que le envías a la ejecución paralela al spawn. Es un error de sintaxis.


Por cierto usa variable que definas tu, para evitar incompatibilidades con addons o script, aunque sean variable locales a ese ámbito, imagina que declaras una variable text y hay un script que define esa variable para otra cosa...
Lo suyo es ponerle nombres que tú entiendas o tu nombre delante por ejemplo Darkdarius_text o DD_text cosas así.

Lo que no se porque defines text dos veces, la primera no sirve de nada ya que en la segunda define un grupo que crea como _text.

Cón respecto al script me parece regular, ya que lo que hace es buscar al último jugador de la lista, que es el que le define _jugador, en vez de buscar al más cercano y así sucesivamente y aparte porque una vez que mata a su objetivo se para, en vez de pasar al siguiente.
Caja: DEEP COOL MATREXX 70 3F CPU: Ryzen 7 5800X P. Base: Gigabyte X570 Aorus Elite RAM:Team Group T-Force Dark Z Alpha 2x16 gb ddr4 3600 Mhz CL18
Disipador cpu: Corsair H-100 Hydro series Pasta termica: Thermalright TF8 13.8 W/MK + Coollaboratory Liquid Pro GPU: Asus GeForce TUF Gaming RTX 4070 Ti 12GB GDDR6X
Discos: M2 samsung 970 512 mb 3.0 + M2 Samsung 980 PRO 1 Tb 4.0 + HDD Barracuda 4 Tb Vent: 4 x deep cool RGB pwm + 3 x corsair pwm + 2 x Noctua nf-p12 + controladora rgb + pwm
disipador M2: GLOTRENDS M.2 Alfombrilla: MARSGAMING MMPRGB2 XXL RGB 80x30 Auriculares: Audio-Technica M50x Peines cableado: Uphere 24 pz
Microfono: Boya BY-M1 Raton: Logitech G602 Teclado: Razer Huntsman Elite Switches Optomecánicos Purple
Monitor: Philips 436M6VBPAB 43" 4K HDR1000 AmbiGlow Gsync low input Silla: Diablo X-Horn XL


Avatar de Usuario
<A2>Pescadorr
Soldado A2
Soldado A2
Mensajes: 6569
Registrado: 09 Sep 2011, 03:28

Re: AI no se mueve una vez spawneada

Mensaje por <A2>Pescadorr »

Código: Seleccionar todo

private["_cazador","_jugador","_swp"];

_cazador = _this select 0;
_lidercazador= leader _cazador;
_distancia= 1000000;
Waituntil
{
     {
           If (isplayer _x && Alive _x) then 
           {
              If ( (_x distance _lidercazador) < _distancia) then
              {
                  _jugador = _x;
                  _distancia = (_x distance _lidercazado);
               };
            };
     } Foreach playableunits;
    Sleep 60;
    True
};
// bucle while en infinito muy sencillo que busque y busque a los jugadores hasta matarlos
while {true} do {
	_swp = _cazador addWaypoint [getPos _jugador, 100];
	_swp setWaypointType "MOVE";
	_swp setWaypointCombatMode "RED";
	_swp setWaypointSpeed "FULL";
	sleep 60; 
}; 
Este iría buscando el enemigo más cercanoy vivo. Lo he hecho desde el móvil, lo mismo tiene algún fallo de sintaxis.
Caja: DEEP COOL MATREXX 70 3F CPU: Ryzen 7 5800X P. Base: Gigabyte X570 Aorus Elite RAM:Team Group T-Force Dark Z Alpha 2x16 gb ddr4 3600 Mhz CL18
Disipador cpu: Corsair H-100 Hydro series Pasta termica: Thermalright TF8 13.8 W/MK + Coollaboratory Liquid Pro GPU: Asus GeForce TUF Gaming RTX 4070 Ti 12GB GDDR6X
Discos: M2 samsung 970 512 mb 3.0 + M2 Samsung 980 PRO 1 Tb 4.0 + HDD Barracuda 4 Tb Vent: 4 x deep cool RGB pwm + 3 x corsair pwm + 2 x Noctua nf-p12 + controladora rgb + pwm
disipador M2: GLOTRENDS M.2 Alfombrilla: MARSGAMING MMPRGB2 XXL RGB 80x30 Auriculares: Audio-Technica M50x Peines cableado: Uphere 24 pz
Microfono: Boya BY-M1 Raton: Logitech G602 Teclado: Razer Huntsman Elite Switches Optomecánicos Purple
Monitor: Philips 436M6VBPAB 43" 4K HDR1000 AmbiGlow Gsync low input Silla: Diablo X-Horn XL


Avatar de Usuario
<A2>Dark Darius
Soldado A2
Soldado A2
Mensajes: 980
Registrado: 10 Jun 2014, 23:06

Re: AI no se mueve una vez spawneada

Mensaje por <A2>Dark Darius »

<A2>Pescadorr escribió: 01 Dic 2018, 21:13

Código: Seleccionar todo

private["_cazador","_jugador","_swp"];

_cazador = _this select 0;
_lidercazador= leader _cazador;
_distancia= 1000000;
Waituntil
{
     {
           If (isplayer _x && Alive _x) then 
           {
              If ( (_x distance _lidercazador) < _distancia) then
              {
                  _jugador = _x;
                  _distancia = (_x distance _lidercazado);
               };
            };
     } Foreach playableunits;
    Sleep 60;
    True
};
// bucle while en infinito muy sencillo que busque y busque a los jugadores hasta matarlos
while {true} do {
	_swp = _cazador addWaypoint [getPos _jugador, 100];
	_swp setWaypointType "MOVE";
	_swp setWaypointCombatMode "RED";
	_swp setWaypointSpeed "FULL";
	sleep 60; 
}; 
Este iría buscando el enemigo más cercanoy vivo. Lo he hecho desde el móvil, lo mismo tiene algún fallo de sintaxis.
Hola Pescadorr, en realidad me has dado una super idea, la he probado y veo que la IA viene a buscarme, lo que no me queda claro es que si me muevo él me seguirá buscando a mí o eligirá a otro jugador o IA jugable.

Código: Seleccionar todo

// _null = [group this] execVM "persigue.sqf";
private["_cazador","_jugador","_seguir","_distancia"];

_cazador = _this select 0;

_jugador = "";
_cazador allowFleeing 0;
_distancia = 100000;
_seguir = true;

while {_seguir} do {
	{
		if (isPlayer _x && alive _x) then {
			if ((_x distance leader _cazador) < _distancia) then {
				_jugador = _x;
                		_distancia = (_x distance leader _cazador);
            		};
		};
	} foreach (playableUnits + switchAbleUnits);
	_cazador move (getPos _jugador);
	_cazador setCombatMode "RED";
	_cazador setBehaviour "AWARE";
	_cazador setSpeedMode "FULL";
	if ({(alive _x) && (isPlayer _x)} count playableUnits == 0) then {_seguir = false;};
	sleep 15;
	waitUntil {sleep 0.5; moveToCompleted leader _cazador or moveToFailed leader _cazador or !alive leader _cazador};
};
Añadir en amigos de Steam Imagen
Imagen

Avatar de Usuario
Urza
Visitante
Mensajes: 2159
Registrado: 10 Nov 2015, 19:06

Re: AI no se mueve una vez spawneada

Mensaje por Urza »

<A2>Pescadorr escribió: 01 Dic 2018, 21:13

Código: Seleccionar todo

private["_cazador","_jugador","_swp"];

_cazador = _this select 0;
_lidercazador= leader _cazador;
_distancia= 1000000;
Waituntil
{
     {
           If (isplayer _x && Alive _x) then 
           {
              If ( (_x distance _lidercazador) < _distancia) then
              {
                  _jugador = _x;
                  _distancia = (_x distance _lidercazado);
               };
            };
     } Foreach playableunits;
    Sleep 60;
    True
};
// bucle while en infinito muy sencillo que busque y busque a los jugadores hasta matarlos
while {true} do {
	_swp = _cazador addWaypoint [getPos _jugador, 100];
	_swp setWaypointType "MOVE";
	_swp setWaypointCombatMode "RED";
	_swp setWaypointSpeed "FULL";
	sleep 60; 
}; 
Este iría buscando el enemigo más cercanoy vivo. Lo he hecho desde el móvil, lo mismo tiene algún fallo de sintaxis.
Mola!
¿pero no sería mejor un Search and destroy o SAD?
Así la IA irá a buscar y matar!
“Soldiers have to eat soup together for a long time before they are ready to fight.”
- Napoleon


Avatar de Usuario
<A2>Dark Darius
Soldado A2
Soldado A2
Mensajes: 980
Registrado: 10 Jun 2014, 23:06

Re: AI no se mueve una vez spawneada

Mensaje por <A2>Dark Darius »

Mola!
¿pero no sería mejor un Search and destroy o SAD?
Así la IA irá a buscar y matar!
He modificado el script, porque una vez una escuadra de jugadores sea abatida, la IA no sigue buscando a más jugadores.
Añadir en amigos de Steam Imagen
Imagen

Responder