Optimización de misiones

Factores que influyen en el rendimiento de la misión, en los fps que percibe el jugador online:

  • El número de IAS que hay en el escenario en promedio durante las diferentes fases de la misión. Cuanto mayor número de IAS hay en el mapa menor número de frames per second.
  • El número de objetos en el escenario y cómo está distribuidos.
  • El tipo de objetos que hay en el escenario. Hay objetos que sus texturas tiran más de nuestra tarjeta gráfica , algunos mal optimizados , nos puede pasar con objetos de addons adicionales que usamos en nuestra misión. En general los objetos propios del juego están bien optimizados.
  • La concentración de la IA en una zona concreta influye en los FPS porque a la vez se están ejecutando cientos de hilos que comen recursos en el servidor, memoria y CPU. Cuando se concentra mucha IA en una zona , todas se activan a la vez y se fuerza al uso de muchos recursos.
  • El uso excesivo de addons disminuye el rendimiento de la misión y hace que el número de FPS disminuya.
  • El uso de scripts, si se usan scripts deben ser el mínimo necesario para no consumir recursos no necesarios y asegurarse que funcionan bien. Cuanto más scripts se usan menos fps tiene la misión en general.
  • Quizá el más importante, las prestaciones del servidor que usa el grupo que juega la misión. Cuanto más altas , mejor irá la misión .

Cómo optimizar una misión del ARMA 3 y conseguir un alto número de frames por segundo:

A veces para misiones con muchos jugadores podemos encontrarnos misiones con 170 enemigos puestas en el mapa y muchos objetos añadidos aparte del entorno propio del escenario….

Se tiene comprobado por experiencia que :

1. Tener tantas IAS hace que el servidor no puede sincronizarlas adecuadamente , muchas estarán paradas o reaccionarán lentamente por lo que quita emoción.

2. Tener las IAS localizadas en sólo una zona concreta es un error a no ser que sea la misión de un solo objetivo porque se activarán muchas a la vez cuando lleguemos a la zona caliente y no reaccionarán bien, el servidor no podrá moverlas, serán lentas o no se moverán.

Lo mejor es tener las IAS en diferentes zonas u objetivos convenientemente separados para que se activen una fracción de ellas poco a poco.

3. No se puede tener tantos enemigos (170) patrullando o estáticos, existen muchos scripts de generación de enemigos, algunos muy sencillos que ayudan a que pueda mantenerse pocas IAS movidas por el servidor y tener la sensación de enemigos inteligentes. Lo ideal sería quizá tener 30 a 40 enemigos constantes en el mapa, es decir que gracias a los script ese número, ese rango se mantenga en diferentes etapas de la misión. (cuanto menos IAS mejor)


Para ello tenemos varias opciones usando scripts, ¡¡¡ ojo !!!, siempre usando el mínimo número de scripts posibles y lo más sencillos y cortos en su funcionamiento :


a) Scripts que crean patrullas en las zonas donde se insertan los jugadores.


b) Scripts que insertan unidades enemigas en edificios cuando los jugadores se insertan en una zona.


c) Scripts que generan patrullas enemigas hasta un número determinado y que van sustituyéndose a medida que es eliminada alguna.

4. Se sabe que otra forma de optimizar una misión sin la necesidad de scripts o al menos los mínimos es aumentar la dificultad de una misión colocando bien a los enemigos estratégicamente, posiciones escondidas, cubriéndose, en emboscadas que no se esperan, edificios etc…Usando diferentes roles como granaderos , ametralladoras que harán que la misión sea más difícil sin necesidad de mucha IA.

5. Están de acuerdo muchos editores en que quitar los cuerpos caídos de los enemigos mejora el rendimiento del servidor y aumenta los fps.

6. Usar un número grande de objetos no propios del mapa disminuye los fps sobre todo si se concentran en un lugar concreto.

Hay jugadores que tienen muy buenos ordenadores y notan poco el número de objetos y texturas añadidas, ojo, hay addons que tienen texturas que cargan más la partida que otros, pero hay otros jugadores que no los tienen tan buenos.


Usar demasiados objetos y tantas IAS junto al gran número de jugadores en las partidas masivas cooperativas sobrecarga al servidor, aumenta excesivamente la información en las comunicaciones entre nuestros pcs y el servidor y provoca caídas, provoca IA muy tonta, o movimientos a pocos frames.


Conclusión:

La misión más optimizada para un mismo servidor será aquella que tenga las siguientes características:

  • mínimo número de addons añadidos
  • mínimo número de IAS en el escenario en un rango de tiempo
  • mínimo uso de scripts posibles y si se usan deben ser scripts cortos y sencillos que tengan una vida media temporal muy pequeña para apenas influir en los recursos del servidor.
  • aquella que tenga el mínimo número de objetos posible en el escenario y aquella con mínimos objetos de otros addons.
  • que no concentre muchos objetos en una sola zona.
  • Distribución de enemigos en el escenario en más de una zona para evitar que se activen todas y muchas a la vez. Sugerencia tener mínimo dos objetivos a una distancia determinada para uso de algún script de respaneo o para evitar que se activen todas.
  • Que no tenga apenas patrullas enemigas en movimiento puestas en el escenario, todas las posibles deben ser respaneadas.
  • Una misión muy bien optimizada será aquella que ronda entre los 40 a 60 fps en toda la partida.
  • Un misión aceptablemente optimizada será aquella mayor de 30 fps. Las misiones con menos fps son misiones que no se han optimizado por los puntos anteriores expuestos y se pueden considerar mal optimizadas.

Si uno edita usando estas directrices conseguirá un alto número de F.P.S y un gran rendimiento para partidas masivas de muchos jugadores.

¿ cuáles son los errores más habituales de los editores?

Poner demasiada IA inicialmente y no respanear.

Poner demasiados objetos juntos en una misma zona.

Usar scripts que controlan demasiados aspectos o recursos permanentemente sin necesitarlos realmente. Los scripts deben usarse sólo en momentos precisos.

Cargar repositorios con muchos addons o más de los necesarios, cuanto más addons , más fps pueden bajar.

No cuidar las combinaciones de addons porque algunos no son compatibles y pueden bajar mucho los fps.

Concentrar los objetivos en una misma zona.

PARTIDAS COOPERATIVAS MASIVAS DE MUCHOS JUGADORES

La pregunta que siempre un editor o jugador del Arma 3 se hace es si es posible hacer batallas masivas de muchos jugadores, auténticas batallas donde hay muchos roles diferentes distribuidos.

Por ejemplo en una misma cooperativa de muchos jugadores tendría:

  • Roles de médicos, una unidad para curar, operar, trasladarse apoyados por un blindado.
  • Roles de pilotos, varios pilotos que puedan utilizar aviones para bombardear objetivo. helicópteros para trasladar tropas, helicóptero para médicos, helicópteros de combate.
  • Roles para blindados, caballería mecanizada.
  • Roles de infantería.
  • Roles de paracaidistas.
  • Roles de operaciones especiales o de francotiradores.
  • Roles de mando, VANT, escoltas, policía militar.

¿ sería posible hacer una cooperativa con mucha acción para 60 roles englobados en esos tipos?

La respuesta es que sí , se puede jugar una partida de 60 roles mientras esté bien optimizada.

¿Pero cuántos jugadores pueden estar conectados realmente en una partida ?

Según la experiencia en el Arma 3 de extranjeros y en servidores y la propia de algunos editores, pueden estar conectados sin IAS unas 80 a 120 personas perfectamente.

¿ se podría jugar una partida cooperativa de 60, 80 , 100 o 120 personas ?

Actualmente hay un clan que ha creado a veces partidas de 80 a 120 personas.

Se recomienda no pasar de 60 jugadores para un servidor medio en características de hardware y software en una partida cooperativa.

Pero si uno tiene un servidor con altas prestaciones se puede jugar a partidas con más slot siempre que sea un misión optimizada.

El editor que asegure que el Arma 3 no da para más y que no se puede jugar partidas masivas de muchos jugadores es porque no edita optimizando las misiones o no edita con inteligencia. Para hablar del rendimiento de un juego en una misión uno tiene que haber comprobado y editado de diferentes formas para confirmar su propia teoría.

Arma 3 es un juego que tiene sus defectos pero muchas veces somos los editores los que no evitamos sus defectos editando inadecuadamente sin optimizar las misiones.

Hay editores que se conforman con un sólo script de generación de enemigos que van dando errores en la RPT del servidor pero mientras funciona no les importa.

Hay editores que usan scripts que lo hacen todo pero el problema es que scripts que lo hacen todo conlleva a que el editor no controla los recursos utilizados por ese script totalmente disminuyéndose el rendimiento muchas veces cuando no es necesario durante la partida.

El editor siempre tiene que ser humilde, tener una apertura en conocimiento y diferentes formas,compartir y aprender, ganas de renovarse y cambiar sus métodos siempre que el cambio mejore la calidad de la partida .

Formas y detalles de hacer diferente tu misión y aumentar su dificultad:

a) Forzar a las IAS a permanecer en una posición estática determinada.

La mayoría de las veces , cuando se entabla un combate la mayoría de las IAS se agachan o se tumban si están posicionadas estáticas en algún lugar como por ejemplo bunkers. Se recomienda que se use el comando

This setunitpos “up”;

This setunitpos “middle”;

para evistar que se agachen o se tumben teniendo siempre visión desde el búnker y así establecer resistencia al ver a los jugadores.

También hay otra instrucción que pone a los tangos tumbados.

This setunitpos “down”;

b) Introducir granadas de fragmentación y humo en las IAS cuando se crean o ya creadas en el escenario

Para aumentar la dificultad de la misión hacemos el siguiente truco, damos a las IAS la posibilidad de usar con alguna frecuencia las granadas de humo y fragmentación. Para ello deben tenerlas en su equipamiento y las usarán sin necesidad de scripts. Podemos proceder de la siguiente forma:

Teniendo en cuenta todas las IAS del escenario ya puestas a mano por el editor, siendo éstas del este, usamos este fragmento de código en nuestro archivo init.sqf , en el lado del servidor, es decir…

if (isserver ) then

{

{

 

// esta parte da dos granadas de fragmentación y humo al antibalas de la ia

for “_i” from 1 to 2 do {_x addItemToVest “HandGrenade”;};

for “_i” from 1 to 2 do {_x addItemToVest “SmokeShell”;};

// esta parte da dos granadas de fragmentación y humo al uniforme de la ia

for “_i” from 1 to 2 do {_x addItemToUniform “HandGrenade”;};

for “_i” from 1 to 2 do {_x addItemToUniform “SmokeShell”;};

} forEach (allUnits select {side _x isEqualTo EAST});

};

c) Modificación de la inteligencia de la IA

Una de las formas de aumentar la dificulta de la IA en la partida es definir sus características.

if (isserver ) then {

{

_x setskill 1;

_x setskill [“general”,1];

_x setskill [“Endurance”,1];

_x setskill [“aimingAccuracy”,0.15];//define la puntería

_x setskill [“aimingShake”,1];

_x setskill [“aimingSpeed”,1];

_x setskill [“endurance”,1];

_x setskill [“spotDistance”,1];

_x setskill [“spotTime”,1];

_x setskill [“courage”,0.5];//define el valor, un valor alto , la Ia no se posicionará //en un lugar concreto.

_x setskill [“reloadSpeed”,1];

_x setskill [“commanding”,1];

} forEach (allUnits select {side _x isEqualTo EAST});

};

El parámetro “aimingAccuracy” y el parámetro spotDistance” es uno de los más importantes para establecer un equilibrio entre las condicones de la misión y la dificultad.

Por ejemplo, una misión con niebla o con tormenta de arena o con tormenta de nieve, la visibilidad del jugador es muy poca por lo que se debe compensa con valores bajos del “aimingAccuracy”.

Un valor de 0.30 es soportable pero implica una gran dificultad.

Se aconseja usar un valor de 0.15 para hacer que las misiones sean más asequibles.

c) Añadir diferentes roles en la misión , antitanques y sobre todo granaderos.

Hay que asegurarse que las existan granaderos enemigos y tengan munición de lanzagranadas suficiente para ello. Las IAS según sus roles no dudarán de usar los lanzagranadas con frecuencia en función de la munición que tienen y harán que la misión suba de dificultad.

Nociones básicas para empezar. Campo init del objeto, descripción

Todos los objetos que se van a usar por scripting deben llamarse de alguna forma, por ejemplo aquí , el jefe de patrulla , no tiene nombre pero se podría poner uno en el campo “ Nombre de la variable “.

Es importante que en el campo de texto “Descripción de la función “ especifiquemos el rol de cada slot que abramos para la partida, por ejemplo aquí es Líder Grupo Alpha pero se podría poner, fusilero o antitanque o lo que fuese ese slot.

En el campo texto “inic” se añade el código que se quiere ejecutar referido a ese objeto la mayor parte de las veces.

En este ejemplo, se inica grpalpha=group this

que signifca que el grupo del que forma parte esta unidad se llamará grpalpha y se podrá manipular por scripting.

Todos los grupos que queramos manipular de una forma específica se deberán diferenciar de la forma anterior.

Los objetos o IAS que se quieran también manipular se deberán llamar con un nombre en el campo “Inic”

En este ejemplo, se inica grpalpha=group this

que signifca que el grupo del que forma parte esta unidad se llamará grpalpha y se podrá manipular por scripting.

Todos los grupos que queramos manipular de una forma específica se deberán diferenciar de la forma anterior.

Los objetos o IAS que se quieran también manipular se deberán llamar con un nombre en el campo “Inic”

Cómo insertar las unidades en el editor

  • Las unidades se deben insertar con coherencia, no pegadas a los muros y paredes para que éstas al tumbarse no bugueen con éstos últimos.
  • Para aumentar la calidad de la partida se aconseja meterlas en edificios, delante de las ventanas o en puertas, cerca de esquinas o en bunkers o posiciones defensivas.
  • Se aconseja siempre poner posiciones defensivas en las cotas más altas que serán usadas con seguridad por los jugadores. En la guerra, las zonas más altas con mejor visión son valoradas.
  • Se aconseja poner algunos grupos y no todos en guardia, porque se pondrán a buscar a los atacantes con rapidez y responderán buscándolos hasta acabar con ellos.
  • Se aconseja poner a los enemigos mirando algunas puertas o entradas, algunas tumbadas cubriendo sectores que lógicamente son de gran importancia para acceder al objetivo. La realidad es que el enemigo no va corriendo por la calles sino permanece lo más oculto posible esperando ver la posición del enemigo.

Uso de marcadores y lógicas . Diferencias.

Tanto marcadores como lógicas se usan para designar posiciones para respanear , indicar objetivos, momivientos de la IA etc…

La diferencia sustancial es en dos aspectos.

Las lógicas se pueden situar a una altura determinada y los marcadores no.

Las lógicas se pueden usar como objeto y por tanto se usan los mismos comandos que para un objeto, posición etc….

Ejemplo de lógica en altura

Ejemplo de una lógica que se puede utilizar de respawn.Hay que tener cuidado con el respaneo en lógicas porque si no están en el suelo, la ia se creará en una altura y caerá por gravedad hiriéndose o matándose en la caída.

Ejemplo de un marcador vacío que se puede utilizar como respawn

Cuidado cuando manipulamos objetos o marcadores.

Para conseguir las coordenadas de un objeto, lógicas también es getpos NombreDelObjeto;

Para conseguir las coordenasde un marcador es getmarkerpos “nombreDelMarcador”;

Para mover un objeto NombreDelObjeto setpos position _posicion;

Para mover un marcador NombreDelObjeto setmarkerpos position _posicion;

Uso de eventhandles.Tipos.

Algunos ejemplos de uso de los eventhandlers:

_x addeventhandler [“firednear”, {_this execVM “SCRIPTS_DPD\firednear.sqf”}];

_soldier = _this select 0; // el soldado que recibe disparos cerca,,se ejecuta cuando esa unidad recibe disparos

_enemigosoldier= _this select 1; // el que dispara al soldado que lleva el evenhandler y al que se dispara cerca

_x addeventhandler [“fired”, {_this execVM “SCRIPTS_DPD\firescript.sqf”}];

_soldier = _this select 0; // soldado que dispara , se pone este evenhandler al soldado y se ejectua cuando éste dispara a enemigos.

_enemigosoldier= _soldier findNearestEnemy (position _soldier);


_x addeventhandler [“dammaged”, {_this execVM “SCRIPTS_DPD\dammage.sqf”}];

soldier = _this select 0;// el que recibe el daño,se ejecuta cuando esa unidad es herida

_enemigosoldier= _this select 1;

_x addeventhandler [“Killed”, {_this execVM “SCRIPTS_DPD\RemoveDead.sqf”}];

_unit = _this select 0;//unidad que ha muerto, se ejecuta cuando esa unidad muere

Uso de cámaras. Un ejemplo de intro.

Se puede llamar al script intro.sqf con el siguiente código:

titleText [“Loading mission…Before Battle Battle of Khe Sanh, CHAPTER 1….edited by DPD “, “BLACK FADED”]; //pantalla en negro con el titulo unos segundos

SLEEP 3;

//efecto borroso

titleCut [“”, “BLACK FADED”, 999];

“dynamicBlur” ppEffectEnable true;

“dynamicBlur” ppEffectAdjust [0];

“dynamicBlur” ppEffectCommit 0;

“dynamicBlur” ppEffectAdjust [0.0];

“dynamicBlur” ppEffectCommit 0;

titleCut [“”, “BLACK IN”, 12];

sleep 6;

//colour

//”colorCorrections” ppEffectEnable true;

// “colorCorrections” ppEffectAdjust [1, 1, 0, [0.5, 0.5, 0.5, 0], [0.5, 0.5,0.5, 0.2], [0.5,0.5, 0.5, 0.0]];

// “colorCorrections” ppEffectCommit 1;

//Camera Create

_c = “camera” camcreate position camara2;// se crea una camara en la posicion de la logica //camara2

_c cameraeffect [“internal”, “back”];

showcinemaborder True;

//scene 1

_c camPrepareTarget position camara2;

_c camPreparePos position camara2;//0

_c camPrepareFOV 0.740;

_c camCommitPrepared 0;

titleCut [“”,”BLACK IN”,3];

sleep 5;

sleep 3.5;

titleCut [“”,”BLACK OUT”,2];

sleep 1;

//scene 2

_c camPrepareTarget position camara1;

_c attachto [camara1,[-2,-5,5]];

_c camPrepareFOV 0.740;

_c camCommitPrepared 0;

titleCut [“”,”BLACK IN”,3];

sleep 3.5;

titleCut [“”,”BLACK OUT”,2];

commander1 sideChat “here the team bravo: Go,go, team alpha and charlie, we wait you here.remember alpha,charlie take the enemy position.go together.”;

sleep 3.5;

leader grpalpha sideChat “Copy, team!!,column , secure.Go,go.”;

//scene 3

_c camPrepareTarget position camara1;

_c attachto [camara1,[-3,-3,3]];

_c camPrepareFOV 0.740;

_c camCommitPrepared 0;

titleCut [“”,”BLACK IN”,3];

sleep 12;

sleep 0.4;

titleCut [“”,”BLACK OUT”,2];

sleep 1;

//scene 4

_c camPrepareTarget position camara1;

_c camPreparePos position camara1;//0

_c camPrepareFOV 0.740;

_c camCommitPrepared 0;

titleCut [“”,”BLACK IN”,3];

sleep 3.5;

_c camCommit 0;

sleep 0.4;

_c cameraEffect [“Terminate”, “Back”];

camDestroy _c;

Cómo crear argumentos iniciales en el briefing:

En el archivo init.sqf sin estar en el lado del servidor:

player createDiaryRecord[“Diary”, [“historia”,”Sabemos la localización de algunas patrullas del Vietnam y pensamos que hay una pequeña base en la zona marcada en rojo, debemos pues ir a localizarla y destuirla. No dejar ningún enemigo en la zona. “]];

Herramientas para optimizar las misiones cooperativas. Funciones de bohemia interactive del propio juego y algunos comandos:

  • Función BIS_fnc_spawnGroup

GrupoEnemigo1= [position objetivo, EAST, 5] call BIS_fnc_spawnGroup ;

Crea en la posición de la lógica llamada objetivo , un grupo del ESTE que está formado por

5 integrantes de la CSAT.

GrupoEnemigo1= [position objetivo, EAST, unidadesE] call BIS_fnc_spawnGroup ;

Crea en la posición de la lógica llamada objetivo , un grupo del ESTE que está formado por

los integrantes que forman las clases de las IAS entre comillas dentro del vector unidadesE.

El vector unidadesE puede ser llamado de cualquier forma pero debe estar definido previamente antes de ser usando por la función BIS_fnc_spawnGroup .

  • Función bis_fnc_taskPatrol

[ GrupoEnemigo1, getPos objetivo, 200 ] call bis_fnc_taskPatrol;

El grupo llamado GrupoEnemigo1 ya previamente puesto en el escenario o creado con la función BIS_fnc_spawnGroup patrulla alrededor de la lógica llamada objetivo haciendo puntos de ruta distanciados de 200 metros.

  • Función BIS_fnc_taskDefend;

[GrupoEnemigo1, position objetivo] call BIS_fnc_taskDefend;

El grupo llamado GrupoEnemigo1 ya previamente puesto en el escenario o creado con la función BIS_fnc_spawnGroup defiende su entorno, si hay defensas estáticas como ametralladoras, morteros etc… se meterá en ellas para usarlas en un radio de 50 metros. El resto quedará tranquila hasta que detecte al enemigo y entonces empezará a defender su posición.

Uso del for each

Para referirnos a los elementos que forman un grupo ya creado utilizamos este código. Es importante saber el poder que tiene este comando con el que se puede hacer diferentes cosas, añadir granadas de fragmentación y de humo, vertirlos como queremos, añadir a cada uno diferentes eventhandlers y más cosas

{

//codigo. Para referirse a cada elemento del grupo se debe usar _x
//vestir a cada uno como queramos

// poner a cada uno diferentes eventhandlers

//definir la inteligencia de cada elemento de la patrulla

} foreach units grupoenemigo1;

Ejemplo 1:

{

for “_i” from 1 to 2 do {_x addItemToVest “HandGrenade”;};

for “_i” from 1 to 2 do {_x addItemToVest “SmokeShell”;};

for “_i” from 1 to 2 do {_x addItemToUniform “HandGrenade”;};

for “_i” from 1 to 2 do {_x addItemToUniform “SmokeShell”;};

} foreach units grupoenemigo1;

Ejemplo 2:

{

_x setskill 1;

_x setskill [“general”,1];

_x setskill [“Endurance”,1];

_x setskill [“aimingAccuracy”,0.10];

_x setskill [“aimingShake”,1];

_x setskill [“aimingSpeed”,1];

_x setskill [“endurance”,1];

_x setskill [“spotDistance”,1];

_x setskill [“spotTime”,1];

_x setskill [“courage”,0.5];

_x setskill [“reloadSpeed”,1];

_x setskill [“commanding”,1];

} foreach units grupoenemigo1;

Ejemplo 3:

{

handle=[_x] execvm “SCRIPTS_DPD\vestimenta.sqf”;// se llama a un script que viste aleatoriamente a la unidad.

handle=[_x] execvm “SCRIPTS_DPD\eventhandlers.sqf”;// se llama a un script que introduce eventhandlers en cada miembro de la patrull

} foreach units grupoenemigo1;

Ejemplo 4:

Se puede usar el for each para poner sólo a un porcentaje de los miembros de la patrulla algunas características especiales como un turbante, un antibalas….

grpmalo7= [position objetivo4, EAST, 5] call BIS_fnc_spawnGroup ;

{

handle=[_x] execvm “SCRIPTS_DPD\vestimenta.sqf”; // se viste al enemigo de talibanes

if ((random 1)<=.4) then // solo al 25 por ciento se le asigna un antibalas

{

_x addVest “V_PlateCarrier2_blk”;

} ;

if ((random 1)<=.5) then // solo al 50 por ciento se le asigna un turbante

{_x addHeadgear “H_Shemag_olive”;} ;

} foreach units grpmalo7;

Ejemplos de uso de las funciones elementales de bohemia interactive:

Ejemplo 1:


Código de bohemia interactive para respanear un grupo de unidades llamado handle1 enemigas en la posición del objeto respawngr1 usando varias clases que nosotros queremos usar en el vector UNIDADESE1. Si el vector tiene 4 unidades se respaneará una patrulla de 4.

handle1= [position respawngr1, EAST, UNIDADESE1] call BIS_fnc_spawnGroup ;

Código que viste al enemigo del grupo creado handle1 como queremos, se obtiene el código desde el editor, se viste como queráis, luego le dáis al contro+C y se copia un código parecido pero en vez de _x tendréis la variable this. Se cambia this por _x y obtenemos este código siguiente:

{comment
"Exported from Arsenal by <A2>DPD";

comment
"Remove existing items";
removeAllWeapons
_x;
removeAllItems _x;
removeAllAssignedItems
_x;
removeUniform _x;
removeVest _x;
removeBackpack
_x;
removeHeadgear _x;
removeGoggles _x;

comment "Add
containers";
_x forceAddUniform "TRYK_U_B_PCUHsW";
_x
addItemToUniform "FirstAidKit";
for "_i" from
1 to 2 do {_x addItemToUniform "30Rnd_65x39_caseless_mag";};
_x
addVest "TRYK_V_Bulletproof";
_x addBackpack
"TRYK_Winter_pack";
_x addItemToBackpack
"30Rnd_65x39_caseless_mag";

comment "Add
weapons";
_x addWeapon "arifle_MXM_F";
_x
addPrimaryWeaponItem "optic_Aco";
_x addWeapon
"hgun_ACPC2_F";

comment "Add items";
_x
linkItem "ItemMap";
_x linkItem "ItemCompass";
_x
linkItem "ItemWatch";
_x linkItem "ItemRadio";

comment
"Set identity";
_x setFace "GreekHead_A3_03";
_x
setSpeaker "Male05GRE";


}
foreach units handle1;

código para que la patrulla enemiga handle1 patrulle aleatoriamente alrededor de respawngr1 en un radio de 200.

[handle1,
getPos respawngr1, 200] call bis_fnc_taskPatrol;

El problema de hacerlo así, es que vestimos sólo de una forma a todos los miembros de una patrulla por lo que necesitaremos varias opciones de vestirlos y una probabilidad asociada a cada una de ellas para nuestro código lo haga aleatoriamente y los vista de diferentes formas.

Ejemplo 2: Este ejemplo es más completo que el ejemplo 1 porque da variedad de uniformes para los enemigos y ayuda a acortar el código que se repite.

grpmalo212= [position respawn3, EAST, 5] call BIS_fnc_spawnGroup ;

{

handle=[_x] execvm “SCRIPTS_DPD\vestimenta.sqf”;// script que los viste

} foreach units grpmalo212;

[grpmalo212,position respawn3] call BIS_fnc_taskDefend; // el grupo malo212 mantiene las estáticas en la zona de la lógica llamada respawn3 y defiende la zona si es atacada.

El script vestimenta.sqf tiene el siguiente código:

El script se basa en una instrucción switch (funcionquerealiza1) que evalúa el valor de la variable funcionquerealiza1. El valor de la variable es aleatorio entre el 1 al 5 y según su valor, se ejecutará el código que hay en case 1: { }; si su valor es 1 y lo mismo en los demás casos.

Esto hace que se vista aleatoriamente cada miembro de la patrulla enemiga, teniendo en cada caso la vestimenta de un rol específico, por ejemplo, un granadero, un antitanque, un fusilero, un médico etc…

private [ “_r”,”_funcionquerealiza1″];

_r = _this select 0;

/////////////////////////vestimenta

_r setskill 1;

_r setskill [“general”,1];

_r setskill [“Endurance”,1];

_r setskill [“aimingAccuracy”,0.30];

_r setskill [“aimingShake”,1];

_r setskill [“aimingSpeed”,1];

_r setskill [“endurance”,1];

_r setskill [“spotDistance”,1];

_r setskill [“spotTime”,1];

_r setskill [“courage”,0.5];

_r setskill [“reloadSpeed”,1];

_r setskill [“commanding”,1];

_r addmagazine “HandGrenade”;

_r addmagazine “HandGrenade”;

_r setSpeedMode “full”;

_r addmagazine “SmokeShell”;

_r addmagazine “SmokeShell”;

funcionquerealiza1=ceil(random 5);

switch (funcionquerealiza1) do {

case 1: {

comment “Exported from Arsenal by <A2>DPD”;

comment “Remove existing items”;

removeAllWeapons _r;

removeAllItems _r;

removeAllAssignedItems _r;

removeUniform _r;

removeVest _r;

removeBackpack _r;

removeHeadgear _r;

removeGoggles _r;

comment “Add containers”;

_r forceAddUniform “TRYK_ZARATAKI”;

_r addItemToUniform “FirstAidKit”;

for “_i” from 1 to 3 do {_r addItemToUniform “30Rnd_545x39_Mag_F”;};

_r addVest “V_HarnessO_gry”;

for “_i” from 1 to 2 do {_r addItemToVest “16Rnd_9x21_Mag”;};

for “_i” from 1 to 2 do {_r addItemToVest “HandGrenade”;};

for “_i” from 1 to 2 do {_r addItemToVest “SmokeShell”;};

_r addItemToVest “SmokeShellRed”;

for “_i” from 1 to 2 do {_r addItemToVest “Chemlight_red”;};

for “_i” from 1 to 4 do {_r addItemToVest “30Rnd_545x39_Mag_F”;};

_r addHeadgear “H_ShemagOpen_tan”;

comment “Add weapons”;

_r addWeapon “arifle_AKS_F”;

_r addWeapon “hgun_Rook40_F”;

comment “Add items”;

_r linkItem “ItemMap”;

_r linkItem “ItemCompass”;

_r linkItem “ItemWatch”;

_r linkItem “ItemRadio”;

comment “Set identity”;

_r setFace “PersianHead_A3_03”;

_r setSpeaker “male02per”;

};

case 2: {

comment “Exported from Arsenal by <A2>DPD”;

comment “Remove existing items”;

removeAllWeapons _r;

removeAllItems _r;

removeAllAssignedItems _r;

removeUniform _r;

removeVest _r;

removeBackpack _r;

removeHeadgear _r;

removeGoggles _r;

comment “Add containers”;

_r forceAddUniform “TRYK_ZARATAKI”;

_r addItemToUniform “FirstAidKit”;

_r addItemToUniform “30Rnd_545x39_Mag_F”;

_r addVest “V_HarnessO_gry”;

for “_i” from 1 to 2 do {_r addItemToVest “HandGrenade”;};

for “_i” from 1 to 2 do {_r addItemToVest “SmokeShell”;};

_r addItemToVest “SmokeShellRed”;

for “_i” from 1 to 2 do {_r addItemToVest “Chemlight_red”;};

_r addBackpack “TAC_BP_Butt_Khaki”;

for “_i” from 1 to 2 do {_r addItemToBackpack “RPG7_F”;};

_r addHeadgear “H_ShemagOpen_tan”;

comment “Add weapons”;

_r addWeapon “arifle_AKS_F”;

_r addWeapon “launch_RPG7_F”;

_r addWeapon “hgun_Rook40_F”;

comment “Add items”;

_r linkItem “ItemMap”;

_r linkItem “ItemCompass”;

_r linkItem “ItemWatch”;

_r linkItem “ItemRadio”;

comment “Set identity”;

_r setFace “PersianHead_A3_03”;

_r setSpeaker “male02per”;

};

case 3: {

comment “Exported from Arsenal by <A2>DPD”;

comment “Remove existing items”;

removeAllWeapons _r;

removeAllItems _r;

removeAllAssignedItems _r;

removeUniform _r;

removeVest _r;

removeBackpack _r;

removeHeadgear _r;

removeGoggles _r;

comment “Add containers”;

_r forceAddUniform “TRYK_ZARATAKI”;

_r addItemToUniform “FirstAidKit”;

_r addItemToUniform “1Rnd_SmokeRed_Grenade_shell”;

_r addItemToUniform “1Rnd_SmokeOrange_Grenade_shell”;

_r addItemToUniform “1Rnd_SmokeYellow_Grenade_shell”;

_r addItemToUniform “30Rnd_762x39_Mag_F”;

_r addItemToUniform “HandGrenade”;

_r addItemToUniform “SmokeShell”;

_r addVest “V_HarnessOGL_brn”;

for “_i” from 1 to 2 do {_r addItemToVest “16Rnd_9x21_Mag”;};

for “_i” from 1 to 2 do {_r addItemToVest “HandGrenade”;};

for “_i” from 1 to 3 do {_r addItemToVest “MiniGrenade”;};

for “_i” from 1 to 5 do {_r addItemToVest “1Rnd_HE_Grenade_shell”;};

for “_i” from 1 to 2 do {_r addItemToVest “SmokeShell”;};

_r addItemToVest “SmokeShellRed”;

for “_i” from 1 to 2 do {_r addItemToVest “Chemlight_red”;};

for “_i” from 1 to 2 do {_r addItemToVest “1Rnd_Smoke_Grenade_shell”;};

for “_i” from 1 to 2 do {_r addItemToVest “30Rnd_762x39_Mag_F”;};

_r addHeadgear “TRYK_H_pakol”;

comment “Add weapons”;

_r addWeapon “arifle_AK12_GL_F”;

_r addWeapon “hgun_Rook40_F”;

comment “Add items”;

_r linkItem “ItemMap”;

_r linkItem “ItemCompass”;

_r linkItem “ItemWatch”;

_r linkItem “ItemRadio”;

comment “Set identity”;

_r setFace “PersianHead_A3_03”;

_r setSpeaker “male01per”;

};

case 4: {

comment “Exported from Arsenal by <A2>DPD”;

comment “Remove existing items”;

removeAllWeapons _r;

removeAllItems _r;

removeAllAssignedItems _r;

removeUniform _r;

removeVest _r;

removeBackpack _r;

removeHeadgear _r;

removeGoggles _r;

comment “Add containers”;

_r forceAddUniform “TRYK_ZARATAKI”;

_r addItemToUniform “FirstAidKit”;

_r addItemToUniform “1Rnd_SmokeRed_Grenade_shell”;

_r addItemToUniform “1Rnd_SmokeOrange_Grenade_shell”;

_r addItemToUniform “1Rnd_SmokeYellow_Grenade_shell”;

_r addItemToUniform “30Rnd_762x39_Mag_F”;

_r addItemToUniform “HandGrenade”;

_r addItemToUniform “SmokeShell”;

_r addVest “V_HarnessOGL_brn”;

for “_i” from 1 to 2 do {_r addItemToVest “16Rnd_9x21_Mag”;};

for “_i” from 1 to 2 do {_r addItemToVest “HandGrenade”;};

for “_i” from 1 to 3 do {_r addItemToVest “MiniGrenade”;};

for “_i” from 1 to 5 do {_r addItemToVest “1Rnd_HE_Grenade_shell”;};

for “_i” from 1 to 2 do {_r addItemToVest “SmokeShell”;};

_r addItemToVest “SmokeShellRed”;

for “_i” from 1 to 2 do {_r addItemToVest “Chemlight_red”;};

for “_i” from 1 to 2 do {_r addItemToVest “1Rnd_Smoke_Grenade_shell”;};

for “_i” from 1 to 2 do {_r addItemToVest “30Rnd_762x39_Mag_F”;};

_r addHeadgear “TRYK_H_pakol”;

comment “Add weapons”;

_r addWeapon “arifle_AK12_GL_F”;

_r addWeapon “hgun_Rook40_F”;

comment “Add items”;

_r linkItem “ItemMap”;

_r linkItem “ItemCompass”;

_r linkItem “ItemWatch”;

_r linkItem “ItemRadio”;

comment “Set identity”;

_r setFace “PersianHead_A3_03”;

_r setSpeaker “male01per”;

};

case 5: {

comment “Exported from Arsenal by <A2>DPD”;

comment “Remove existing items”;

removeAllWeapons _r;

removeAllItems _r;

removeAllAssignedItems _r;

removeUniform _r;

removeVest _r;

removeBackpack _r;

removeHeadgear _r;

removeGoggles _r;

comment “Add containers”;

_r forceAddUniform “TRYK_ZARATAKI2”;

_r addItemToUniform “FirstAidKit”;

for “_i” from 1 to 2 do {_r addItemToUniform “16Rnd_9x21_Mag”;};

for “_i” from 1 to 2 do {_r addItemToUniform “HandGrenade”;};

_r addItemToUniform “SmokeShell”;

_r addVest “V_HarnessO_brn”;

for “_i” from 1 to 2 do {_r addItemToVest “Chemlight_red”;};

for “_i” from 1 to 2 do {_r addItemToVest “SmokeShell”;};

for “_i” from 1 to 2 do {_r addItemToVest “150Rnd_762x54_Box”;};

for “_i” from 1 to 2 do {_r addItemToVest “HandGrenade”;};

_r addHeadgear “TRYK_H_pakol2”;

comment “Add weapons”;

_r addWeapon “LMG_Zafir_F”;

_r addWeapon “hgun_Rook40_F”;

comment “Add items”;

_r linkItem “ItemMap”;

_r linkItem “ItemCompass”;

_r linkItem “ItemWatch”;

_r linkItem “ItemRadio”;

_r linkItem “TRYK_Shemagh_G_NV”;

comment “Set identity”;

_r setFace “PersianHead_A3_02”;

_r setSpeaker “male01per”;

};

};

¿ cómo sacamos la vestimenta o el uniforme de cada rol y su código ?

Es fácil. Vestimos a cada rol que queramos en nuestras patrullas, habrá que hacerlo tantas veces como roles queramos. Hay que aprovechar para ponerles granadas de humo, de fragmentación y abundancia munición para que puedan darnos guerra en el juego. Cuando lo tengamos vestido en la pantalla de edición tendremos lo siguiente y copiamos el código asociado con Control Izquierdo + C. Os saldrá un mensaje “ Guardado en el portapapeles “ . Se abre el block de notas del Windows y se pega en el archivo el código con control izquierdo + V

Por ejemplo yo he obtenido este código, si os fijáis en vez tener la variable _x tiene la variable this que hay que cambiar:

comment “Exported from Arsenal by DPD”;

comment “Remove existing items”;

removeAllWeapons this;

removeAllItems this;

removeAllAssignedItems this;

removeUniform this;

removeVest this;

removeBackpack this;

removeHeadgear this;

removeGoggles this;

comment “Add containers”;

this forceAddUniform “U_BG_Guerilla3_1”;

this addItemToUniform “FirstAidKit”;

this addItemToUniform “30Rnd_65x39_caseless_green”;

this addItemToUniform “Chemlight_red”;

for “_i” from 1 to 3 do {this addItemToUniform “HandGrenade”;};

this addVest “V_HarnessOGL_brn”;

for “_i” from 1 to 3 do {this addItemToVest “30Rnd_65x39_caseless_green”;};

for “_i” from 1 to 2 do {this addItemToVest “16Rnd_9x21_Mag”;};

for “_i” from 1 to 2 do {this addItemToVest “HandGrenade”;};

for “_i” from 1 to 2 do {this addItemToVest “MiniGrenade”;};

for “_i” from 1 to 5 do {this addItemToVest “1Rnd_HE_Grenade_shell”;};

this addItemToVest “SmokeShell”;

this addItemToVest “SmokeShellRed”;

this addItemToVest “Chemlight_red”;

this addItemToVest “1Rnd_Smoke_Grenade_shell”;

this addItemToVest “1Rnd_SmokeOrange_Grenade_shell”;

this addItemToVest “1Rnd_SmokeYellow_Grenade_shell”;

this addHeadgear “H_ShemagOpen_khk”;

comment “Add weapons”;

this addWeapon “arifle_Katiba_GL_F”;

this addPrimaryWeaponItem “optic_ACO_grn”;

this addWeapon “hgun_Rook40_F”;

comment “Add items”;

this linkItem “ItemMap”;

this linkItem “ItemCompass”;

this linkItem “ItemWatch”;

this linkItem “ItemRadio”;

comment “Set identity”;

this setFace “PersianHead_A3_03”;

this setSpeaker “male03per”;

En el menú edición y luego seleccionando Reemplazar podremos sustituir todos los this por _x y este código convertido se pega en el script vestimenta. sqf en cada caso.

Por ejemplo el rol del granadero en el case 1 , el rol del fusilero automático en el case 2 así sucesivamente hasta tener completo nuestro script de vestimenta.

Parece largo el proceso pero en realidad es vestir a nuestro rol, es un copiar , pegar y convertir this por _x. Es sencillo y se repite para cada rol.

Ventajas de este método:

Se hace la misión independiente de los addons porque un editor puede usar unidades de la CSAT en el escenario estáticas y patrullando y luego vestirlos. Si sólo usa infantería la única dependencia con los addons será el script vestimenta.sqf y éste variará según los addons que se usen. La misión podrá ser cambiada o actualizada fácilmente porque esta forma permite hacerla bastante independiente.

Ejemplo 4:

grpmalo212= [position respawn3, EAST, 5] call BIS_fnc_spawnGroup ;

{

handle=[_x] execvm “SCRIPTS_DPD\vestimenta.sqf”;// script que los viste

} foreach units grpmalo212;

[grpmalo212, getPos zona4, 500] call bis_fnc_taskPatrol; // el grupo malo212 patrulla alrededor de la lógica llamada zona4 con puntos de ruta de 500 metros .

Ejemplo 5:

grpmalo212= [position respawn3, EAST, 5] call BIS_fnc_spawnGroup ;

{

handle=[_x] execvm “SCRIPTS_DPD\vestimenta.sqf”; // script que los viste

} foreach units grpmalo212;

grpmalo212 move position zonaobjetivo; // mueve el grupo a la posicion de la logica zonaobjetivo

grpmalo212 setSpeedMode “FULL”; // hace que se muevan con rapidez

grpmalo212 setBehaviour “COMBAT”;// hace que las ias se cubran con efectividad

Ejemplo 6: Crear una patrulla con clases de addons con sus características predefinidas y no con la Csat.

Lo primero es tener un grupo de enemigos como modelo de clases en el escenario definido como grpmalo.

En el archivo init.sqf en el lado del servidor se usará el código

unidadesE = [];

{unidadesE = unidadesE+ [typeOf _x]; deletevehicle _x} foreach (units grpmalo);

En el vector unidadesE se guardan las clases de la patrulla de los enemigos cuando se inicia la misión.

Se borrará el grupo grpmalo inmediatamente después de cogerlo como referencia.

Luego deberá usarse en la función BIS_fnc_spawnGroup en vez de un número, se usará ese vector. La función creará una patrulla idéntica en número y clases que la que contiene el vector unidadesE y serán del bando del ESTE como pone en el siguiente código.

grpmalo212= [position respawn3, EAST, unidadesE] call BIS_fnc_spawnGroup ; // se crea el grupo grpmalo212 en la posición respawn3

{
handle=[_x] execvm “SCRIPTS_DPD\vestimenta.sqf”;
// script que los viste

} foreach units grpmalo212;

[grpmalo212,position respawn3] call BIS_fnc_taskDefend;// el grupo defiende posición respawn3

Cómo crear vehículos con IAS

Agrupando este código en un script llamado enemigos.sqf que se invoque mediante un activador en el lado del servidor o se llama desde otro script siempre en el lado del servidor if (isserver) then {};

Primero creamos un grupo llamado gr62 en la posición de la lógica llamada respawn5aire del bando del oeste que consiste en un vehículo B_Plane_Fighter_01_F y sus tripulantes

gr62=[getPos respawn5aire, west, [“B_Plane_Fighter_01_F”],[],[],[],[],[],180] call BIS_fnc_spawnGroup;

sleep 5;

Lo ponemos en combate para que ataque nada más ver enemigos.

gr62 setBehaviour “COMBAT”;

Hacemos que el grupo llamado gr62 se ponga a patrullar con waypoints de 1000 metros, es bastante porque son aviones y necesitan bastante distancia.

[gr62, getPos medio, 1000] call bis_fnc_taskPatrol;

Cómo simular un ataque aéreo , unos aviones contra otros

Creamos dos grupos gr62 y gr63 con sus tipos de aviones correspondientes, ojo, estas líneas utilizan un addon de alienígenas.Es cambiar la clase por clases de aviones. Las dos naves las hacemos patrullar alrededor de la lógica medio en modo combate para que ataquen lo que vean.

gr62=[getPos respawn5aire, west, [“sab_uncom_jet_2x”],[],[],[],[],[],180] call BIS_fnc_spawnGroup;

sleep 5;

gr62 setBehaviour “COMBAT”;

[gr62, getPos medio, 1000] call bis_fnc_taskPatrol;

sleep 25;

gr63=[getPos respawn5aire, west, [“sab_uncom_xian2”],[],[],[],[],[],180] call BIS_fnc_spawnGroup;

sleep 5;

gr63 setBehaviour “COMBAT”;

[gr63, getPos medio, 1000] call bis_fnc_taskPatrol;

//////////////////////////////////////////////////////////////////////

Creamos dos grupos gr64 y gr65 con sus tipos de aviones correspondientes, ojo, estas líneas utilizan un addon de alienígenas.Es cambiar la clase por clases de aviones. Las dos naves las hacemos patrullar alrededor de la lógica medio en modo combate para que ataquen lo que vean.

Observamos que éstos son del este por lo que se enfrenarán a a las unidades del oeste y además patrullan alrededor de la misma lógica por lo que el enfrentamiento es seguro entre ellas.

sleep 5;

gr64=[getPos respawn4aire, east, [“sab_ext_plane”],[],[],[],[],[],180] call BIS_fnc_spawnGroup;

sleep 5;

gr64 setBehaviour “COMBAT”;

[gr64, getPos medio, 700] call bis_fnc_taskPatrol;

sleep 15;

gr65=[getPos respawn4aire, east, [“sab_ext_heli”],[],[],[],[],[],180] call BIS_fnc_spawnGroup;

sleep 5;

gr65 setBehaviour “COMBAT”;

[gr65, getPos medio, 700] call bis_fnc_taskPatrol;

Cómo simular un ataque aéreo , unos aviones contra unidades terrestres

Es exactamente igual que el ejemplo anterior pero un bando son del aviones o helicópteros . No hace falta crear las unidades terrestres si ya hay puestas en el escenario. Los aviones si son del oeste atacarán a las unidades del este que son las terrestres. Y las terrestres se defenderán como puedan.

Crear un vehículo y vestir sus unidades como queremos

Primero creamos un grupo llamado grpmalote3 en la posición de la lógica llamada iniciogrupo que consiste en un vehículo rhs_bmp1d_vmf y sus tripulantes

grpmalote3=[getPos iniciogrupo, east, [“rhs_bmp1d_vmf”],[],[],[],[],[],180] call BIS_fnc_spawnGroup;

Demoramos 5 segundos:

sleep 5;

Los ponemos en combate, así se cubrirán continuamente en su trayecto y estarán atentos:

grpmalote3 setBehaviour “COMBAT”;

Hacemos que el grupo grpmalote3 empiece a patrullar alrededor de la lógica llamada centro con waypoints de 150 metros

{grpmalote3, getPos centro, 150] call bis_fnc_taskPatrol;

{

handle=[_x] execvm “SCRIPTS_DPD\vestimenta.sqf”; // los vestimos como queremos

handle=[_x] execvm “SCRIPTS_DPD\eventhandlers.sqf”; // ponemos los eventhandler que queramos

} foreach units grpmalote3;

478 total views, 2 views today

503total visits,1visits today