Respawn de IAs

Sección para misiones y edición ArmA III

Moderador: C. Misiones & Noticias

Avatar de Usuario
BBTheHeartPainkiller
Visitante
Mensajes: 701
Registrado: 30 May 2021, 00:13

Respawn de IAs

Mensaje por BBTheHeartPainkiller »

Llevo tiempo intentando encontrar alguna guía o script con el que poder hacer reaparecer a los enemigos, y de esa manera reducir los enemigos totales de la partida.

Buscando en Google no encuentro lo que busco, o las maneras en la que lo explican no me funciona; así que podría alguien compartir conmigo alguna guía, script o comentario de como poder poner respawns de IAs en misiones?

Gracias por vuestra atención.
En las sabias palabras de The Chieftain:
Imagen

Avatar de Usuario
<A2>Jorge
Soldado A2
Soldado A2
Mensajes: 1930
Registrado: 14 Dic 2017, 21:27

Re: Respawn de IAs

Mensaje por <A2>Jorge »

Hay módulos de ace ,aunque no los use aun, pero te dejo un video que los explica.
“Una vez que están unificados, el valiente no puede actuar solo, ni el tímido puede retirarse solo: ésta es la regla general del empleo de un grupo”
Imagen

Avatar de Usuario
<A2>Flac0
Visitante
Mensajes: 1609
Registrado: 22 Mar 2020, 18:07

Re: Respawn de IAs

Mensaje por <A2>Flac0 »

Descripción: Esta script es válida para generar un respawn de AI's en una o varias posiciones aleatorias que ataquen una posición determinada.
Testado Servidor Dedicado

Coloca un activador en el mapa con la condición deseada (BLUFOR - Presente por ejemplo) y en el init del activador escribe:

Código: Seleccionar todo

null=execvm "respawnAI.sqf"
De esta forma al cumplirse la condición del activador, se activará la script.

Genera un archivo de texto (preferiblemente usar el software notepad++) en la carpeta de la misión y nombra el archivo del siguiente modo "respawnAI.sqf"

Coloca 4 marcadores en el mapa. Haz doble click en cada marcador y pon a 0% la transparencia del marcador (para que sea invisible durante la partida) y nombralos con "marker_1", "marker_2", "marker_3", "marker_4" (puedes utilizar cualquier nombre siempre que sea el mismo de la script). Del 1 al 3 será dónde respawnee la IA y el 4 será el marcador dónde ataque.

Copia la siguiente información en el archivo .sqf generado.

Código: Seleccionar todo

condicion1=true;
publicvariable "condicion1";
if(isServer) then{
while {condicion1 do {
	_grp01Marker = Selectrandom ["marker_1", "marker_2", "marker_3"]; 
	_grp01 = [getmarkerpos _grp01Marker, East, ["I_E_Scientist_F", "I_E_Scientist_F"],[],[],[],[],[],116] call BIS_Fnc_spawnGroup;
	[_grp01, getMarkerPos "marker_4"] call bis_fnc_taskAttack; 
{        _x setskill 0.1;
        _x setskill ["aimingAccuracy",0.01];
        _x setskill ["aimingShake",0.80];
        _x setskill ["aimingSpeed",0.80];
        _x setskill ["spotDistance",0.45];
        _x setskill ["spotTime",0.25];
        _x setskill ["courage",1];
        _x setskill ["reloadSpeed",0.25];
        _x setskill ["commanding",1];
        _x allowFleeing 0;
    } forEach (allUnits select {side _x isEqualTo EAST});
 sleep 60;
};
};

EXPLICACIÓN Y VARIABLES.
Condicion1: es el nombre de variable de la condición para hacer que se cumpla la función de la scripts. Para detener el scripts y que deje de generar unidades, colocar en un activador con cualquier condición deseada lo siguiente (al pasar la variable a "false" deja de cumplirse la condición y se termina la script):

Código: Seleccionar todo

condicion1=false;
publicvariable "condicion1";
Marker_1 / Marker_2 / Marker_3: es el nombre de la variable de los marcadores donde se genera de forma aleatoria.

Marker_4: es el nombre de la variable del marcador donde atacará la AI.

I_E_Scientist_F: La clase (class name) de la unidad que quieres que respawnee. Para saber el class name de una unidad, coloca una unidad deseada en el editor y con el click derecho>herramientas>copiar classname. Puedes colocar tantas AI como desees, pudiendo ser cada una de ellas de distinto class name. Simplemente asegúrate que va entre comillas y separado por comas entre sí (el último no debe llevar coma).

_x setskill 0.1: es el valor de cada parámetro de habilidad de la IA. Valor numérico de 0 a 1.

sleep 60;: es el tiempo en segundos que tarda en respawnear un grupo de ataque. Para que el tiempo sea aleatorio entre los valores indicados (en segundos), se puede sustituir por

Código: Seleccionar todo

sleep (5 + random 10);

ALTERNATIVA: Búsqueda y eliminación (Tracker script)
Si quieres que la AI busque y elimine a los jugadores en un rango deseado:

Sustituye la siguiente línea de la script

Código: Seleccionar todo

[_grp01, getMarkerPos "marker_4"] call bis_fnc_taskAttack; 
por

Código: Seleccionar todo

[_grp01, 2550] execVM "fn_taskHunt.sqf"; 
dónde el valor numérico (2550) es la distancia en metros en la cual la AI realizará la búsqueda de los jugadores.

Genera un archivo de texto (usar preferiblemente software notepad++) en la carpeta de la misión con nombre "fn_taskHunt.sqf" que contenga la siguiente información:

Código: Seleccionar todo

_fn_findTarget = {
    _newDist = _range; 
    _all = (switchableUnits + playableUnits - entities "HeadlessClient_F");
    _all = _all select {side _x != civilian && {side _x != side _group}};
    _target = objNull;
    {
        _distance = (leader _group) distance2d _x;
        if (_distance < _newDist && {getpos _x select 2 < 200}) then {_target = _x;_newDist = _distance;};
        true
    } count _all; 
    _target
};
_fn_flare = {
    _shootflare = "F_20mm_Red" createvehicle ((leader _group) ModelToWorld [0,0,200]);
    _shootflare setVelocity [0,0,-10];
};
_fn_suppress = {
    {
        _x doSuppressiveFire ((getposASL _target) vectorAdd [random 2,random 2,0.5 + random 3]);
        true
    } count units _group;
};
params ["_group",["_range",500],["_cycle",60 + random 30]];
if (!local _group) exitWith {};
if (_group isEqualType objNull) then {_group = group _group;};
_group setbehaviour "SAFE";
_group setSpeedMode "LIMITED";
while {{alive _x} count units _group > 0} do {
    waitUntil {sleep 1;simulationenabled leader _group};
    _combat = behaviour leader _group isEqualTo "COMBAT";
    _onFoot = (isNull objectParent (leader _group));
    _target = call _fn_findTarget;
    if (!isNull _target) then {
        _group move (_target getPos [random 100,random 360]);
        _group setFormDir (leader _group getDir _target);
        _group setSpeedMode "NORMAL";
        _group enableGunLights "forceOn"; 
        _group enableIRLasers true;
        if (!_combat && {_onFoot} && {random 1 > 0.8}) then {[] call _fn_flare;};
        // suppress building BUILDING SUPPRESSION!
        if (_combat && {(nearestBuilding _target distance2d _target < 25)}) then {[] call _fn_suppress;};
    };
    sleep _cycle;
};


__________________________________________________________________________________



Descripción: Esta script es válida para generar un respawn de AI's en una posición determinada que ataquen a los jugadores que entran en el activador en un rango determinado.
Actualiza posicion cada 3 segs de los jugadores que activan el trigger.
Se borran cuando los jugadores se alejan a mas de X mts.
El tamaño del trigger tiene que ser menor a la distancia de abajo. Ejemplo: trigger tamaño 390; distancia abajo 400
Testado Servidor Dedicado
by TURCO_AR

Coloca un activador en el mapa con la condición deseada (BLUFOR - Presente por ejemplo) y en el init del activador escribe:

Código: Seleccionar todo

null = [thistrigger,thislist] execvm "respawnAI_Cazadores.sqf";
De esta forma al cumplirse la condición del activador, se activará la script.

Genera un archivo de texto (preferiblemente usar el software notepad++) en la carpeta de la misión y nombra el archivo del siguiente modo "respawnAI_Cazadores.sqf" y copia la siguiente información:

Código: Seleccionar todo

_PosTrigger = _this select 0;
_objetivos = _this select 1;
_objetivo = _objetivos select 0;
if (isserver) then {
private ["_cazadores", "_Jefecazadores"];
_CuentaEnemigos = {alive _x && side _x == EAST} count allUnits;			
if (_CuentaEnemigos < 600) then {					//Si hay mas de X cantidad de unidades del bando EAST en el mapa no hace el spawn
		_SpawnPos = position _PosTrigger ;
		_cazadores = createGroup EAST;
		_cazadores = [_SpawnPos, EAST, ["O_G_Soldier_TL_F","O_G_Soldier_F","I_C_Soldier_Para_1_F","I_C_Soldier_Para_4_F","I_C_Soldier_Bandit_4_F"],[],[],[],[],[],260] call BIS_fnc_SpawnGroup;
// Equipamiento enemigo
{if (typeof _x == "I_C_Soldier_Para_4_F") then {		//LIDER DE ESCUADRA
				_x addPrimaryWeaponItem "acc_flashlight";
				_x enablegunlights "forceOn";};		
if (typeof _x == "O_G_Soldier_TL_F") then {		//FUSILERO
				_x addPrimaryWeaponItem "acc_flashlight";
				_x enablegunlights "forceOn";};
if (typeof _x == "O_G_Soldier_TL_F"") then {		//FUSILERO
				_x addPrimaryWeaponItem "acc_flashlight";
				_x enablegunlights "forceOn";};				
		_x setskill 1;
		_x setskill ["aimingAccuracy",0.13];
		_x setskill ["aimingShake",0.30];
		_x setskill ["aimingSpeed",0.20];
		_x setskill ["spotDistance",0.40];
		_x setskill ["spotTime",0.35];
		_x setskill ["courage",1];
		_x setskill ["reloadSpeed",0.25];
		_x setskill ["commanding",1];
} forEach units _cazadores;
		_Jefecazadores = leader _cazadores; 
		_Jefecazadores move (position _objetivo);						
		_cazadores setCombatMode "RED"; 
		_cazadores setBehaviour "AWARE";
		_cazadores setSpeedMode "FULL";
		_cazadores allowFleeing 0;
0 = [_cazadores,_objetivo] spawn { while {true} do {
	params ["_cazadores","_objetivo"];
	sleep 3; 
	if ((_objetivo distance (leader _cazadores)) > 400) exitWith {		//DISTANCIA: Si el que activo el trigger se aleja mas de x distancia se borran los cazadores
	{deleteVehicle _x} forEach units _cazadores; }; }; };
while {true} do { 														
   _Jefecazadores = leader _cazadores; 
   if ((unitReady _Jefecazadores) && {(alive _Jefecazadores)}) then { 
       sleep 3; 
       if (({ alive _x} count (units _cazadores)) != 0) then { 
			_Jefecazadores = leader _cazadores; 
			_Jefecazadores move (position _objetivo); 
			_cazadores setCombatMode "RED"; 
			_cazadores setBehaviour "AWARE";
			_cazadores setSpeedMode "FULL";
			_cazadores allowFleeing 0;};};};		
	};
};

EXPLICACIÓN Y VARIABLES.
I_C_Soldier_Para_4_F: La clase (class name) de la unidad que quieres que respawnee. Para saber el class name de una unidad, coloca una unidad deseada en el editor y con el click derecho>herramientas>copiar classname. Puedes colocar tantas AI como desees, pudiendo ser cada una de ellas de distinto class name. Simplemente asegúrate que va entre comillas y separado por comas entre sí (el último no debe llevar coma).

(typeof _x == "I_C_Soldier_Para_4_F": La clase (class name) de la unidad JEFE DE ESCUADRA que quieres que respawnee. Para saber el class name de una unidad, coloca una unidad deseada en el editor y con el click derecho>herramientas>copiar classname.

(typeof _x == "O_G_Soldier_TL_F": La clase (class name) de la unidad ligada al Jefe de Escuadra que quieres que respawnee. Para saber el class name de una unidad, coloca una unidad deseada en el editor y con el click derecho>herramientas>copiar classname.

(_CuentaEnemigos < 600): condición para que las unidades respawneen (cantidad de enemigos).

((_objetivo distance (leader _cazadores)) > 400): Distancia de borrado de las unidades generadas.

sleep 3; : intervalo en segundos de la actualización de la posición de los jugadores.

_x setskill 0.1: es el valor de cada parámetro de habilidad de la IA. Valor numérico de 0 a 1.

if (typeof _x == "O_G_Soldier_TL_F") then {
_x addPrimaryWeaponItem "acc_flashlight";
_x enablegunlights "forceOn";};
:
Comandos que afectaran a la unidad del class name generada. Se puede añadir cualquier otro comando, como por ejemplo retirar la ropa y añadir una vestimenta concreta, arma, accesorio, munición etc...
En este ejemplo, se retira todo el uniforme y armas que vienen por defecto para esa unidad (con su class name) y se añade uniforme, chaleco, mochila, accesorios, inventario, armas y accesorios de arma que el editor desee (se puede saber el class name de cualquier objeto desde el arsenal virtual del ace).
Este ejemplo es para vestir unidades enemigas con uniformes aleatorios de contaminación, mochila de buceo, inventario determinado y un arma concreta:

Código: Seleccionar todo

{if (typeof _x == "O_G_Soldier_TL_F") then {		//LIDER DE ESCUADRA
				removeAllWeapons _x;
				removeUniform _x;
				sleep 0.1;
				_x addVest "V_TacVestIR_blk";
				_x addBackPack "B_SCBA_01_F";
				_x addGoggles "G_AirPurifyingRespirator_01_F";
				_x addUniform Selectrandom ["U_C_CBRN_Suit_01_White_F","U_C_CBRN_Suit_01_Blue_F","U_I_E_CBRN_Suit_01_EAF_F","U_O_R_Gorka_01_F","U_O_R_Gorka_01_brown_F"];
				_x addItemToUniform "ChemicalDetector_01_watch_F";
				for "_i" from 1 to 4 do {_x addItemToVest "30Rnd_45ACP_Mag_SMG_01_Tracer_Red";};
				for "_i" from 1 to 5 do {_x addItemToVest "ACE_M84";};
				_x linkItem "ItemRadio";
				_x addHeadgear SelectRandom ["H_PASGT_basic_white_F","H_PASGT_basic_blue_F","H_PASGT_basic_olive_F","H_PASGT_basic_black_F"];	
				_x addWeapon "SMG_01_F";
				_x addPrimaryWeaponItem "ACE_muzzle_mzls_smg_01";
				_x addPrimaryWeaponItem "30Rnd_45ACP_Mag_SMG_01_Tracer_Red";
				_x addPrimaryWeaponItem "optic_ACO_grn";
				_x addPrimaryWeaponItem "acc_flashlight_smg_01";
				_x enablegunlights "forceOn";};

Avatar de Usuario
BBTheHeartPainkiller
Visitante
Mensajes: 701
Registrado: 30 May 2021, 00:13

Re: Respawn de IAs

Mensaje por BBTheHeartPainkiller »

Muchas gracias chicos. Me pondré a hacer pruebas con esto para intentar ponerlo en la siguiente misión oficial
En las sabias palabras de The Chieftain:
Imagen

Avatar de Usuario
BBTheHeartPainkiller
Visitante
Mensajes: 701
Registrado: 30 May 2021, 00:13

Re: Respawn de IAs

Mensaje por BBTheHeartPainkiller »

Da igual como lo ponga en el sqf, siempre me da este error el intentar ejecutar el trigger:
Imagen

'...ariable "condicion1":
if(isserver) then(#1
while condicion1 do (
grpo1Marker - (...
Error Missing ]
File C:\Users\borja\Documents\Arma 3 - other
Profiles\BBTheHeartPainkiller\missions\ Breach and Clear.Shapur BAF\respawnAI
sqr... line )
En las sabias palabras de The Chieftain:
Imagen

Avatar de Usuario
<A2>Flac0
Visitante
Mensajes: 1609
Registrado: 22 Mar 2020, 18:07

Re: Respawn de IAs

Mensaje por <A2>Flac0 »

Has hecho algún paso mal, o has modificado la sintaxis de lo que te he pasado. El error te está diciendo básicamente que no está bien escrito.

Avatar de Usuario
BBTheHeartPainkiller
Visitante
Mensajes: 701
Registrado: 30 May 2021, 00:13

Re: Respawn de IAs

Mensaje por BBTheHeartPainkiller »

Pues no sé que puedo haber puesto mal porque he intentado prácticamente copiar las instrucciones antes de empezar a probar que podía toquetear, pero me daba ese error desde el principio.

He hecho literal estos pasos para asegurarme que no me saltaba nada:
- Abrir una nueva misión y poner un soldado BLUEFOR y un trigger con la línea que ejecuta el sqf.
- Ir a la carpeta de la misión y crear el sqf copiando el código de arriba (sin editar nada)
- Volver al editor y poner los 4 marcadores necesarios.

He seguido los pasos y aún así no me ha salido ninguna vez, ¿igual estoy interpretando algún paso mal?
En las sabias palabras de The Chieftain:
Imagen

Avatar de Usuario
<A2>Flac0
Visitante
Mensajes: 1609
Registrado: 22 Mar 2020, 18:07

Re: Respawn de IAs

Mensaje por <A2>Flac0 »

BBTheHeartPainkiller escribió: 06 Sep 2022, 20:16 grpo1Marker - (...
Esa línea horizontal es un error. Comprueba que esa línea esta escrita así:

Código: Seleccionar todo

grpo1Marker = Selectrandom ["marker_1", "marker_2", "marker_3"]; 
marker_1, marker_2, marker_3
Esto deben ser nombres de variables de los marcadores en la misión.

Avatar de Usuario
BBTheHeartPainkiller
Visitante
Mensajes: 701
Registrado: 30 May 2021, 00:13

Re: Respawn de IAs

Mensaje por BBTheHeartPainkiller »

Buscar en el log del editor he podido encontrar mas exacto que error me da cuando intento poner en marcha el script de respawn

Código: Seleccionar todo

22:10:16 Error in expression <ariable "condicion1";
if(isServer) then{
while {condicion1 do {
_grp01Marker = S>
22:10:16   Error position: <
while {condicion1 do {
_grp01Marker = S>
22:10:16   Error Missing }
22:10:16 File C:\Users\borja\Documents\Arma 3 - Other Profiles\BBTheHeartPainkiller\missions\Breach%20and%20Clear.Shapur_BAF\respawnAI.sqf..., line 3
En las sabias palabras de The Chieftain:
Imagen

Avatar de Usuario
TURCO_AR
Visitante
Mensajes: 2274
Registrado: 15 Ene 2015, 02:16

Re: Respawn de IAs

Mensaje por TURCO_AR »

Estuve revisando el script y le falta cerrar una llave y un punto y coma al final.
Agrega una }; y listo.
Saludos.
Todos los días hay que preguntarse:
Soy un buen compañero? Pienso en mis compañeros y mi Grupo?
Si la respuesta es SI, frente en alto, orgulloso y a seguir igual.
Si la respuesta es NO....tranquilo, que acá no pasa nada.

Responder