Вы находитесь на странице: 1из 98

AUTORES DEL MANUAL : DPD

Manual de edicción del ARMA 3 enfocado al scripting.


El manual más completo en español para editar.
VERSIÓN 3.

CONTENIDO:

Primer bloque:

INTRODUCCIÓN

Segundo bloque:

CÓDIGO PARA SCRIPT Y EJEMPLOS QUE SUELE UN EDITOR NECESITAR.


ALGUNOS SCRIPTS RECOPILADOS NO SON DE AUTORÍA PROPIA.

Cambios respecto a la versión 2.

Se han corregido algunos errores.


Se han añadido más explicaciones.
Ha aumentado en tamaño y número de dudas para editores.
Se ha añadido en el bloque 1 más extensión para scripting básico.
Índice:

1. Introducción. Ser editor en el mundo del ARMA.Consejos donde editar.

2. Ámbitos de ejecución de scripts

3. Variables locales y globales

4. Comandos del Arma 3 más usados en esta lección:(Muy usado.)

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

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

7. PARTIDAS COOPERATIVAS MASIVAS DE MUCHOS JUGADORES

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

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

10. Cómo insertar las unidades en el editor

11. Uso de marcadores y lógicas . Diferencias.

12. Uso de eventhandles.Tipos.

13. Uso de cámaras. Un ejemplo de intro.

14. Cómo crear argumentos iniciales en el briefing:

15. Modificación de la inteligencia de la IA

16. Herramientas para optimizar las misiones cooperativas. Funciones de bohemia


interactive del propio juego y algunos comandos:

17. Cómo crear vehículos con IAS


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

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

20. Crear un vehículo y vestir sus unidades como queremos

21. Condiciones necesarias para introducir en los triggers

22. Algunos trucos/códigos sencillos que pueden ayudar y que se pueden usar en activadores
o en otros scripts
23. Cómo contar el número de jugadores online

24. Cómo convertir una partida cooperativa en una single player:

25. mo forzar que una IA dispare a otra o a un jugador:

26. Cómo armar a civiles y provocar una rebelión

27. Como borrar un grupo entero llamado grpcivil1 del escenario:

28. Como borrar todas las unidades de un bando en un activador:

29. Cómo introducir textos en la pantalla

30. Introducir un video de intro:

31. Script para unir una IA a nuestra patrulla:

32. INTRODUCIR UN LOGO QUE SE MUEVE:

33. DIFERENTES FORMAS DE HACER CONVERSACIONES EN LA PANTALLA

34. Variar el volumen del sonido por ejemplo la simulación de la lejanía, se baja el volumen y
luego se aumenta o viceversa

35. Grupo que salta de un vehículo:

36. Como manener la misma hora siempre aproximadamente

37. Pone marcadores en las posiciones de los jugadores

38. Cómo hacer limpieza de una zona y así optimizar la misión en fps

39. Cómo llenar bunkers respaneando unidades


40. Destrucción de la ciudad. (código de otro autor)

41. Terremoto.(código de otro autor)

42. Efectos visión borrosa.(código de otro autor)

43. IEDS.(código de otro autor)

44. Tiempo acelerado.(código de otro autor)

45. Efectos partículas.(código de otro autor)

46. Una simulación de paso con aviones:


47. Una simulación de bombardeo

48. Ataque de aviones

49. Efecto de un helicóptero averiado

50. SCRIPT DE MORTEROS

51. SCRIPT DETELEPORTER

52. ALEATORIEDAD I

53. ALEATORIEDAD II

54. ARSENAL VIRTUAL

55. Cómo quitar los cuerpos de los enemigos caídos . script removedead

56. Cómo hacer que grupos de enemigos acosen a los jugadores script persigue.sqf

57. Cómo imitar un camuflaje de francotirador. Script camuflaje.sqf

58. Script para hacer mover una patrulla en un edificio

59. ZEUS. ¿ para qué sirve ? ¿ cómo usarlo ?


60. ¿Cómo crear una intro con cámara , que tenga logo y hasta video?

61. Script generador de patrullas de enemigos que atacan una zona concreta.

62. ¿ cómo hacer un join in progress sencillo en caso de bug,fallo o caída de un jugador?

1.Introducción. Ser editor en el mundo del ARMA.Consejos donde editar.

En la comunidad de Arma 3 donde coexisten diferentes grupos, clanes y solitarios jugadores, un


papel muy importante es el del editor de misiones. En la mayoría de los clanes y no en todos,
luego expondré dónde, un papel muy relevante con importancia es la del editor. Una o varias
personas van aportando decenas, cientos de horas e incluso algunos miles de horas, creando
escenarios diferentes según su imaginación y sus conocimientos, en diferentes épocas y guerras,
Guerra del Golfo, Guerra de Vietnam, Guerra de Afganistán etc.
Una misión muy bien editada y optimizada puede llevar un mínimo de 40 horas, casi dos días de
la vida del editor. Por lo que cada vez que se juega misión es el fruto de la afición pero también
de la generosidad de esa persona que la ha creado.
Como la actividad de los clanes y grupos se centran en esas misiones creadas por los editores, el
papel del editor es muy importante y éste debe buscar un equilibrio entre lo que se pide por parte
del conjunto del clan o grupo para hacer campañas propias y jugarlas a un estilo determinado,
entre los límites del juego y un equilibrio con los conocimientos propios del editor .
La mayoría de los clanes escuchan a los editores, los miman, muchos de ellos en las cúpulas de
administración porque se busca que la actividad del grupo no ponga dificultades en la labor del
editor. Es lógico.
La experiencia en la edición cuenta mucho pero a la hora de crear una misión es importante
echarle horas y si encuentras manuales o ayudas como el que he escrito te ayudará a ahorrarte
muchas horas.
¿ qué es ser un buen editor ?

Hay muchas formas de editar y siempre descubres cosas nuevas. Siempre eres un niño
aprendiendo en este mundo así que te animo siempre a estar abierto y aprender cosas nuevas de
los demás. Yo siempre lo estoy haciendo y lo que he podido juntar aquí en este manual es para la
comunidad tanto lo que yo sabía como lo que saben otras personas. Un buen editor es aquel que
siempre está renovándose y cambiando parte de su forma de editar. Siempre hay cosas que
aprender. Ser un niño es muy importante así que nunca te creas ni mejor ni peor editor , sólo un
aprendiz.

¿ qué grupos o clanes del Arma 3 existen y dónde podrías estar a gusto como editor ?

Como a todo editor le gusta que jueguen sus misiones,lo primero que debes como editor es mirar
un lugar donde realmente exista democracia y se tenga en cuenta tu opinión, donde no exista
luchas de poderes o cúpulas que impongan su criterio. Un lugar donde se toma en cuenta el
trabajo y la labor del editor y sus muchas horas. No es el único papel importante en un clan o
grupo, también se van muchas horas en la administración , planeo de misiones, soporte
informático de la web, selección de addons pero sin duda en el rol del editor se van más horas y
días que en ningún otro.
Mi consejo es que selecciones aquellos grupos donde existe un sistema democrático de
votaciones y en que te hagan partícipe en la mayoría o todas las decisiones del clan o grupo.
En función de su nivel democrático y compañerismo, te aconsejo grupos como los siguientes
clanes:

ESUS

http://www.clanesus.com/

Se vota a sus administradores cada año.

UST101

www.ust101.com

Se vota a sus administradores cada 6 meses.

¿ qué grupos son mejores para un editor , los grandes o los pequeños?

Existen grupos grandes con una normativa excesiva para la edición, te imponen hasta la
distancia de visión que debes usar u otros detalles que pueden echarte atrás tu idea original ya
que puede chocar con los límites que tiene el propio juego. Como editor en un grupo debes
adecuarte a un mínimo , un uso de addons y algunos parámetros como el de médico o estilos
pero la gran mayoría de los detalles son aportes tuyos según tu imaginación.
El grupo que te impone más de lo necesario que da forma a tu imaginación y no la deja libre y te
hace cambiar proyectos o misiones continuamente no te conviene.
Los grupos pequeños son más adecuados , suele haber pocos editores, está menos organizado,
menos normativa y allí puedes desarrollarte, probar y dar rienda a tu imaginación sobre todo si
ya tienes un estilo propio para editar.
Si estás comenzando , eres nuevo, te da igual si estás en uno pequeño o uno grande, donde te
enseñarán a como editan ellos.
¿ en qué aspectos debería fijarse un editor a la hora de editar ?

Es fustrante a veces crear una misión, algo que nos ha pasado a todos y que no funcione o no
vaya bien en fps. El aspecto fundamental que debe mirar un editor es el número de fps para que
los jugadores, aunque vivan un argumento que no les guste mucho, puedan disfrutar de una
fluidez alta en el juego.

Por mucho que una misión esté trabajada si no va bien en fps , no se vivirá adecuadamente por
los jugadores.

Te invito como editor a editor que uses este código que muchas veces todos buscamos perdiendo
horas. Aquí tienes recopilado bastante que podrá ayudarte. También te invito a que si ves algún
error o si quieres ampliar o modificar toda sugerencia será bienvenida.

3.Ámbitos de ejecución de scripts

Lado del servidor :

if (isserver) then { código; };

Se ejecuta todo lo del servidor, lo que se debe ejecutarse sólo una vez y las variables globales

Por ejemplo , los scripts de respaneo.

Muy importante indicar en los activadores en el editor, que se ejecute en el lado del servidor ,
marcando la casilla “server” o se ejecutará el script tantas veces como jugadores existan en la
partida.

Ámbito local: Es aquello que sólo se ejecuta en cada cliente, en cada ordenador.

Ejemplos: Las presentaciones de las misiones , el briefing, variables globales

Lado del multiplayer : Se puede ejecutar las presentaciones de las misiones y el briefing
if (isMultiplayer) then { código ; };

Se puede ejecutar en el ámbito del servidor y multiplayer a la vez.


Se puede ejecutar en el ámbito del servidor y local.

4. Variables locales y globales

Hay que hacer dos diferencias importantes en el ámbito de las variables que se usan en el
scripting.

Variables locales:
Aquellas que sólo actúan dentro de un script determinado. Para ello deben definirse previamente
con la declaración private[“_variable1”,“_variable2”,“_variable3”];
Se diferencian de las globales dentro de un script a veces porque llevan un guión bajo antes del
nombre. _NombreDeLaVariable

private["_i","_j","_text","_building","_nuevaposicion","_housePos","_patrullon","_allpositi
ons"];
_housePos = _this select 0;
_patrullon= _this select 1;
_j=ceil(random 10000);
_text = formatText ["grpmalo%1",_j];
_text= [position _housePos ,east, _patrullon,[],[],[],[],[],getDir _housePos+180] call
BIS_fnc_spawnGroup ;

Variables globales:

Aquellas que actúan en cualquier ámbito , fuera y dentro de todos los scripts. Se define una
variable asignándole un valor por ejemplo VariableGlobal1= false y luego para hacer que su
valor sea el mismo en todos los ámbitos locales de los jugadores y scripts que lo usan
publicvariable “VariableGlobal1”.

Las variables globales son buenas para usar scripts que dependen de los resultados de otros pero
no debe usarse mucho porque su uso exagerado puede causar disminución de recursos del
servidor.

Por ejemplo, se puede usar para contar el número de jugadores y según el número de jugadores
unas variables globales como número de patrullas, número de integrantes por patrulla ,
habilidad del enemigo, extensión de un marcador etc.... Estas variables globales mediante
publicvariable “variableGlobal” podrán usarse en scripts de respawn de enemigos haciendo que
la misión se adapte al número de jugadores.

BLOQUE 2
Comandos del Arma 3 más usados en esta lección:

GrpAlpha=group this;

Si se pone esta línea en el campo init del líder de un grupo se definirá su grupo como GrpAlpha.

deletevehicle NombreObjeto:

Se elimina el vehículo llamado NombreObjeto.

NombreDelGrupo move position destino;

El grupo llamado NombreDelGrupo va a la posición destino.


grpmalo8 reveal _enemigosoldier;

El grupo llamado grpmalo8, un grupo revela que existe el enemigo _enemigosoldier;

grpmalo8 setSpeedMode "FULL";

El grupo llamado grpmalo8 se mueve a la velocidad máxima posible.

NombreAI addItemToVest "HandGrenade";

A la IA con nombre NombreAI se le añade una granada de fragmentación en su antibalas.

NombreAI addItemToUniform "SmokeShell";

A la IA con nombre NombreAI se le añade una granada de humo en su uniforme de guerra.

_x linkItem "ItemMap";
_x linkItem "ItemCompass";
_x linkItem "ItemWatch";
_x linkItem "ItemRadio";

Se añaden varios utensilios a la IA _x.

_x addWeapon "arifle_MXM_F";

Añade a la IA un arma llamada “ arifle_MXM_F”

NombreObjeto setpos _posicion;

El objeto cuyo nombre es NombreObjeto se teletransporta a la posición _posicion.

sleep 100;

Hay una parada de 100 segundos hasta la siguiente instrucción.

this disableAI "MOVE";

La ia está inhabilitada para moverse. No se moverá si se pone esa línea en su campo init.

this setCaptive true;

La ia está no será reconocida como enemiga por los demás.

[this] join grpnull;

La IA correspondiente a la variable this saldrá de su grup actual.


[_x] join leader general;

Hacer sonar un sonido ya definido en description.ext

playSound "sound1";

La IA correspondiente a la variable _x se hará miembro del grupo de la IA llamada general


que será el líder.
this allowDamage false;

Si se añade en el init del slot player del editor, el enemigo no puede matarte y sirve también
para testea las misiones.

Hint “ Aquí el capitán, tenemos tropas enemigas acercándonos a nuestra posición por el
flanco izquierdo. Tomen posiciones defensivas. Cambio. “

Sirve para escribir un texto en la parte superior derecha que se mantendrá unos segundos
hasta desaparecer.

Hintc “ Acuérdate de ponerte los tapones “

Sirve para crear una ventana con ese mensaje que el jugador debe cerrar interaccionando.

_nombre=player;
hint format ["Bienvenido a la misión jugador : %1",_nombre];

Sirve para crear mensajes con un formato adecuado abierto al uso de variables locales o
públicas.

_soldier switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDl";

Sirve para hacer una animación para cualquier IA.

_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];

Sirve para forzar el disparo al soldado con su arma actual y su modo de disparo actual
designado por la variable local _soldier.

_soldier dotarget _enemigosoldier;


Sirve para hacer que el objeto designado por la variable local _soldier apunte con su arma
al objeto designado por la variable _enemigosoldier

_soldier dowatch _enemigosoldier;

Sirve para hacer que la IA designada por la variable local _soldier apunte mire hacia la
posición de la IA _enemigosoldier

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

Sirve para pegar un objeto a otro. Por ejemplo la cámara _c creada en una presentación se
pega a la lógica cámara1 y la seguirá si ésta se mueve.

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;
_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;

Condiciones necesarias para introducir en los triggers

1.Condición para el trigger saber si el jugador llamado h1 ha llegado y vivo a una posición
abarcada por un trigger. Hay que añadir en el mismo trigger esta condición

alive h1 && h1 in thisList

Condición para controlar la velocidad del vehículo llamado coche1

speed coche1 > 55

3. Condición para el trigger saber si el jugador man1 ha llegado y vivo el una posición abarcada
por un trigger

isplayer Bob;
3. Para comprobar el nivel de daño de una unidad llamada jugador1.

getdammage jugador1 > 0.7;

Para comprobar que un cierto número de unidades están dentro de un vehículo se usa la
siguiente condición en el trigger.

Comprueba que el vehículo llamado coche1 que hay 10 tripulantes

count crew coche1== 10;

Comprueba que hay 10 tripulantes en el vehículo llamado coche1

count crew coche1 > 2;

Para comprobar la distancia entre dos objetos o dos unidades o dos jugadores, se usa la
condición siguiente:

Bob distance Nick < 10;

Condición si son las 15 horas o 3 p.m del día o más:

daytime >=15;

Comprobar si un grupo está dentro de un vehículo:

{_x in NombreVehículo} count units NombreGrupo == count units NombreGrupo

Comprobar si un grupo está fuera de un vehículo:

{_x in NombreVehículo} count units NombreGrupo == 0

Comprobar si una IA o jugador está dentro de un vehículo:

NombreDelJugador in NombreDelVehiculo;

Comprobar si un objeto del escenario se destruye :


Crear una lógica llamada torre pegada al objeto

Algunos trucos/códigos sencillos que pueden ayudar y que se pueden usar en activadores o en
otros scripts

1.Para introducir un grupo dentro de un vehículo

{_x moveInCargo NombreDelVehiculo} forEach units group NombreDelGrupo;

2. Muchas veces necesitamos manipular grupos de IAS o de jugadores por sus nombres. Para
identificar el grupo en el editor, en el campo init del líder se introduce la siguiente línea:

groupName = group this;

3. Queremos borrar un vehículo para optimizar una misión , recordar que la misión cuanto
menos IA mejor así que inserciones de helicópteros , u otros vehículos, limpieza de adornos de la
misión....

{deleteVehicle _x} forEach crew NombreDelVehiculo ; deletevehicle NombreDelVehiculo;

4. Cómo hacer que una IA dispare con un antitanque a un objetivo llamado NombreObjetivo

NombreEnemigo doTarget NombreObjetivo;


NombreEnemigo selectWeapon secondaryWeapon NombreObjetivo;
NombreEnemigo doFire NombreObjetivo;

5.Cómo hacer que un helicóptero llamado h1 tenga las luces encendidas


null=[] spawn { while {true} do { driver h1 action ["lightOn", h1]; sleep 0.01};};

6. Fuel infinit para un objeto, en su campo init añadir este código:

nul = this spawn { waitUntil { if !(alive _this) exitWith {}; if (fuel _this < 0.25) then { _this
setFuel 1 }; false } };

7. Queremos que un vehículo explosione en el paso de una zona concreta por los jugadores:

Se crea un trigger por presencia de jugadores y en el lado del servidor se añade la línea en la
casilla de activación

NombreVehiculo setdammage 1;

8. Poner texturas en las banderas y en los carteles usando archivos .jpg en nuestras misiones

Si llamamos al objeto bandera flag2 y queremos poner una bandera talibán

flag2 setFlagTexture "Img\taliban.jpg";

Si llamamos al objeto cartel flag2 usamos el comando y queremos poner una bandera talibán

flag2 setObjectTextureGlobal [0,"Img\taliban.jpg"];

importante hacerlo en el lado del servidor por lo que se puede poner en archivo init.sqf de la
misión lo siguiente

if (isserver ) then

flag2 setFlagTexture "Img\taliban.jpg";


flag2 setObjectTextureGlobal [0,"Img\taliban.jpg"];

};

7. Queremos que una IA tire una granada de humo :

// hanle=[] execvm “tirarGranadaHumo.sqf”


if (!isServer) exitWith {};

private
["_tirargranadahumo","_meterseenedificios","_soldier","_enemigo","_ponercargasenvehiculo
s","_enemigosoldier","_nbuilding","_grp","_man","_dist1","_x","_man3","_number36","_
number37", "_number32","_cubierta","_cual","_s","_man4"];

_soldier = _this select 0;

_enemigosoldier= _soldier findNearestEnemy (position _soldier);

if (alive _soldier) then

_soldier addmagazine "SmokeShell";


_soldier dotarget _enemigosoldier;

_npc = _soldier;
_target = _enemigosoldier;

_height = 1;
//If (count _this > 2) then {_height = _this select 2};

If (typename _target == "ARRAY") then


{
_target = [(_this select 1) select 0,(_this select 1) select 1,_height];
}
else
{
_target = getposATL _target;
_target set [2,_height];
};

_npc doWatch _target;

_dir = [getposATL _npc,_target] call BIS_fnc_DirTo;


_npc setDir _dir;

sleep 0.01;

_soldier selectWeapon "throw";

_soldier Fire ["SmokeShellMuzzle", "SmokeShellMuzzle", "SmokeShell"];


};

8. Queremos que una IA tire una granada de fragmentación:

// hanle=[] execvm “tirarGranadaFragmentacion.sqf”

if (!isServer) exitWith {};

private
["_tirargranadahumo","_meterseenedificios","_soldier","_enemigo","_ponercargasenvehiculo
s","_enemigosoldier","_nbuilding","_grp","_man","_dist1","_x","_man3","_number36","_
number37", "_number32","_cubierta","_cual","_s","_man4"];

_soldier = _this select 0;

_enemigosoldier= _soldier findNearestEnemy (position _soldier);

_cansee = [_soldier, "VIEW"] checkVisibility [eyePos _soldier, eyePos _enemigosoldier];

if (_cansee > 0.5) then


{

if (alive _soldier) then

_soldier addmagazine "handgrenade";

_soldier dotarget _enemigosoldier;

_npc = _soldier;
_target = _enemigosoldier;

_height = 1;
If (count _this > 2) then {_height = _this select 2};

If (typename _target == "ARRAY") then


{
_target = getposATL _target;
_target set [2,_height];
};

_npc doWatch _target;


_dir = [getposATL _npc,_target] call BIS_fnc_DirTo;
_npc setDir _dir;

sleep 0.01;

SLEEP 0.1;
_soldier selectWeapon "throw";
_soldier Fire ["handgrenadeMuzzle", "handgrenadeMuzzle", "handgrenade"];

};

};

9. Hacer que una IA haga volteretas laterales mientras dispara:

_cansee = [_soldier, "VIEW"] checkVisibility [eyePos _soldier, eyePos _enemigosoldier];

if (_cansee > 0.5) then


{
//hint "animacion";
_npc = _soldier;
_target = _enemigosoldier;

_height = 1;
//If (count _this > 2) then {_height = _this select 2};

If (typename _target == "ARRAY") then


{
_target = [(_this select 1) select 0,(_this select 1) select 1,_height];
}
else
{
_target = getposATL _target;
_target set [2,_height];
};

_npc doWatch _target;

_dir = [getposATL _npc,_target] call BIS_fnc_DirTo;


_npc setDir _dir;

if ((random 1)<=.50) then {

_soldier dotarget _enemigosoldier;


_soldier dowatch _enemigosoldier;

_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];


sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier switchmove
"AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDl"; //croqueta

_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];


sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];

} else {

_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];


sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;

_soldier switchmove "AmovPpneMstpSrasWrflDnon_AmovPpneMevaSlowWrflDr"; //croqueta


_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];

};
};
Cómo contar el número de jugadores online
En el archivo init.sqf escribir lo siguiente:

if (isserver ) then {

if (isMultiplayer) then {

while{(_jugadores) == 0} do {
_all = playableUnits;
{
if(isPlayer _x)then{
if((alive _x)&&(!captive _x))then{
_jugadores=_jugadores+1;
};
};
}forEach _all;

};

// instrucciones que se quieren cumplir en multiplayer, definición de parámetros etc....

};

};

Cómo convertir una partida cooperativa en una single player:

Si una misión está llena de patrullas en multiplayer se pueden eliminar cuando se juega en
single player y dejar las que nos conviene. Si la patrulla del jugador es GrpAlpha entonces
podemos poner este código en el archivo init.sqf
if (isserver ) then {

if (!isMultiplayer) then {

// todo lo que se ejecute en single player


{ deletevehicle _x;} foreach (units GRPbravo);

{ deletevehicle _x;} foreach (units GRPcharlie);

{ deletevehicle _x;} foreach (units GRPdelta);

{ deletevehicle _x;} foreach (units GRpLima);

{ deletevehicle _x;} foreach (units GRPgolf);

{ deletevehicle _x;} foreach (units GRPfoxtrot);

{ deletevehicle _x;} foreach (units GRPsierra);


{ deletevehicle _x;} foreach (units GRPhotel);

{ deletevehicle _x;} foreach (units GRPMike);


{ deletevehicle _x;} foreach (units GRPmedicos);

};

mo forzar que una IA dispare a otra o a un jugador:

_soldier dotarget _enemigosoldier;


_soldier dowatch _enemigosoldier;
_soldier dotarget _enemigosoldier;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];
sleep 0.1;
_soldier fire [currentWeapon _soldier, currentWeaponMode _soldier];

"Script traición" o "Modo encubierto"

Según ésto y aplicando la lógica deberías poner ésto al principio de la misión. Bando opfor-
resistance contra blufor

Resistance setFriend [East, 1]; //resistencia ve como amigo a los del este
East setFriend [Resistance, 1]; // opfor ve como amigos a los independientes

West setFriend [Resistance, 0]; //blufor enemigo de los independientes


Resistance setFriend [west, 0]; //independientes ve como enemigo a los blufor

y cuando se cumpla la condición pues haces esto

Resistance setFriend [East, 0]; // resistencia ve como enemigos a los del este
East setFriend [Resistance, 0]; // los del este ve como amigos a los independientes

West setFriend [Resistance,1]; //blufor ve como amigo a los independientes


Resistance setFriend [west,1]; //independientes ve como amigo a los blufor

CÓMO ARMARA CIVILES Y PROVOCAR UNA REBELIÓN

NUL=[nombrelogica,distancia] execvm "armarciviles.sqf";

Requisitos:

1. tener una unidad enemiga llamada general.


2. un objeto o lógica que hará de centro de un área dentro de la cuál se armarán los civiles

Función: Armar los civiles que hay en un área y hacerlos enemigos de los jugadores.

Imaginemos una misión donde hay civiles y queremos confundir a los jugadores entre unos
buenos y otros malvados.
Se puede usar para una rebelión de civiles contra los jugadores u otras funciones.

if(isserver ) then {
//script armarciviles.sqf by Autor: <A2>DPD
_logcentrolimp =_this select 0;
_Area =_this select 1;
_trg=createTrigger["EmptyDetector",position _logcentrolimp];
_trg setTriggerArea[_Area,_Area,0,false];
_trg setTriggerActivation["CIV","PRESENT",false];

sleep (0.8);
waituntil {!isnil {list _trg}};

_tlist = list _trg;

sleep 0.5;
{

[_x] join grpnull;


sleep 0.01;

[_x] join leader general;

sleep 0.01;

[_x] join grpnull;


//// arma los civiles.ADAPTARLOS AL ARMA3
_x addweapon "M4A3_RCO_GL_EP1";
_x addmagazine "ACE_30Rnd_556x45_T_Stanag";
_x addmagazine "ACE_30Rnd_556x45_T_Stanag";

// arma los civiles

// aqui mejoras las reacciones de los civiles


_x setskill 1;
_x setskill ["Endurance",1];
_x setskill ["aimingAccuracy",0.37];
_x setskill ["aimingShake",0.37];
_x setskill ["aimingSpeed",1];
_x setskill ["endurance",1];
_x setskill ["spotDistance",1];
_x setskill ["spotTime",1];
_x setskill ["courage",1];
_x setskill ["reloadSpeed",1];
_x setskill ["commanding",1];
_x setskill ["general",1];
_x setSpeedMode "full";
_x forceSpeed 20;
_x setBehaviour "combat" ;

////////////////////////////// se obliga a que salgan los civiles de los vehículos


//unassignVehicle (_x);
//(_x) action ["EJECT", vehicle _x];
//sleep 0.01;
} foreach _tlist;

};
Como borrar un grupo entero llamado grpcivil1 del escenario:

A veces nos interesa borrar objetos del escenario para optimizar los fps . Una forma de
optimizar sería borrando los grupos de civiles que tenemos en algunas zonas donde los
jugadores ya han pasado.
Este código lo ponemos por ejemplo en un activador que se active por presencia del bando del
jugador y en el lado del servidor. Cuando los jugadores pasen a una zona concreta algo
alejados de donde están los civiles y sabiendo que no van a pasar por allí.

{ deletevehicle _x;sleep 1;} foreach (units grpcivil1);

Como borrar todas las unidades de un bando en un activador:

A veces nos interesa borrar objetos del escenario para optimizar los fps . Una forma de
optimizar sería borrando los grupos de civiles o de enemigos o de objetos que hay dentro de
una zona. Para ello se puede utilizar un trigger o activador de limpieza para la optimización.

_tlist = list trg;//el activador se llama trg y debe tener condiciones present y bando de unidades
que se quieren borrar repitiéndose cada varios segundos

{ deletevehicle _x;sleep 1;} } foreach _tlist;;

Cómo introducir textos en la pantalla

Para una intro o presentación:

[str("MISSION") ,str("FOR") ,str("ARMADOS"),str("WWW.GRUPOARMADOS.INFO")]


spawn BIS_fnc_infoText;

Otra posibilidad :

["<t size='1.5'color='#FF0000'>Cooperativa Muerte Segura by DPD </t>", 0, 0.8, 5, 0, 0, 90]


spawn BIS_fnc_dynamicText;
Otra forma de hacer intro:

[
"<t size = '1.5'>PRIMERA PARTE </t>",
safeZoneX+0.71, safeZoneY+safeZoneH-0.83, 4, 4, 0, 890
] spawn bis_fnc_dynamicText;

Otra forma de hacer intro:

[ [ ["Prission of Kunduz,","align = 'center' shadow = '1' size = '0.7' font='PuristaBold'"],


[" 2001, 25th November ","align = 'center' shadow = '1' size = '0.5'","#aaaaaa"],
["","<br/>"], ["300 talibans prisoners rebel in a Kunduz prission... ","align = 'center' shadow
= '1' size = '0.5'"] ] ] spawn BIS_fnc_typeText2;

Otra forma de hacer intro:

// este código sólo se puede usar en un script y no en un activador.A no ser que se use la función
spawn.
_text = "<t size='2'>" + "SIMULA LA GUERRA" + "<br />" + "<t size='2'>" + "SIMULA
BATALLAS HISTÓRICAS," + "</t>" + "<br />" + "<t size='2'>" + "SIMULA CON UST101,"
+ "<t size='1'>" + "<br />" + "VALOR, HONOR, ACOGIDA, DEMOCRACIA , SERIEDAD" +
"<br />" + "</t>" + "<img size='8' image='multimedia\logo.jpg'/>" + "</t>" + "<br />" + "<t
size='1'>" + "www.ust101.com" + "</t>";
_1 =[_text,0.01,0.01,10,-1,0,90]spawn bis_fnc_dynamicText;

Introducir un video de intro:


El video intro debe tener formato ogv , hay páginas webs que hacen la conversión de mp4 a .ogv.
Ese video se guarda en una carpeta de la misión, por ejemplo, sounds en este caso. El siguiente
código se pone en un script intro.sqf y llamamos desde el init.sqf sin estar al lado del servidor
para que lo vean todos. En el script intro.sqf hay que poner una instrucción con una variable
global que produzca la no ejecución de éste para que sólo se ejecute una vez cuando comienza la
misión.

12 cutText ["", "BLACK OUT"];


sleep 2;
_video = ["sounds\intro.ogv"] spawn bis_fnc_playVideo;
waitUntil {scriptDone _video};

12 cutText ["", "BLACK IN"];

Script para unir una IA a nuestra patrulla:

En la IA u objeto que queremos unir a nosotros en nuestra patrulla y así controlarla,


rescatarla o hacer un acción

Primero añadimos estas líneas en el campo init de la unidad que queremos unir, rescatar,
hablar con ella, interaccionar en general...

this addAction ["rescue", "unirse.sqf"];


this setunitpos "middle";
this disableAI "MOVE";
this setCaptive true;

y el script unirse.sqf tendría el siguiente código:

_gen = _this select 0; // es la unidad que quieres unir


_caller = _this select 1; // es el que usa el eventhandler
_id = _this select 2;
_gen enableAI "MOVE";
[_gen] join grpnull;
[_gen] join leader _caller;
_gen setcaptive false;

INTRODUCIR UN LOGO QUE SE MUEVE:


Debemos tener un logo de la comunidad o clan que representamos en la ruta correcta, aquí debe
estar en una carpeta llamada multimedia. El logo tendrá formato logo.paa pero también se puede
usar imágenes .jpg
Este código se debe ejecutar en un script que inicie una intro por ejemplo y que no esté en el lado
del servidor para que se pueda ver por parte de todos los jugadores.
null = [] spawn
{
_textos =
[
"",
"<t size='10'><img image='multimedia\logo.paa' />",
""
];
_i = 0;
{
_i = _i + 1;
[_x,0,1.2,10,1,-2,_i] spawn BIS_fnc_dynamicText;
sleep 0.4;
} foreach _textos;

};

DIFERENTES FORMAS DE HACER CONVERSACIONES EN LA PANTALLA

["<t size='0.5' color='#0066FF'>COMANDANTE/COMMANDER:</t> <t size='0.5'>


Capitán, aquí el comandante .</t>", 0, 0.8, 5, 0, 0, 90] spawn BIS_fnc_dynamicText;
sleep 5;
["<t size='0.5'color='#FF0000'>Capitán/Captain:</t> <t size='0.5'> Aquí el capitán Smith
</t>", 0, 0.8, 5, 0, 0, 90] spawn BIS_fnc_dynamicText;
sleep 5;
["<t size='0.5' color='#0066FF'>COMANDANTE/COMMANDER:</t> <t size='0.5'>
Tenemos fuego de mortero cerca de la zona y estan disparándonos de diferentes direcciones,
también desde el hospital </t>", 0, 0.8, 5, 0, 0, 90] spawn BIS_fnc_dynamicText;

sleep 10;

["<t size='0.5'color='#FF0000'>Capitán/Captain:</t> <t size='0.5'>¿ cuáles son sus órdenes


comandante ?</t>", 0, 0.8, 5, 0, 0, 90] spawn BIS_fnc_dynamicText;

b) Otra forma de hacer una conversación:

Asignamos nombres a varias unidades que van a ser los participantes de la conversación.
Por ejemplo aquí tendremos dos participantes, comandante y oficial1

comandante sideChat " Capitán, aquí el comandante,tenemos que eliminar a los centinelas en
silencio, vayan en sigilo, no queremos alertar a refuerzos, cambio.";
sleep 3;
oficial1 sideChat " Recibido mi capitán, procedemos a la inserción en sigilo por el área
asignado,cambio y corto.";

Variar el volumen del sonido por ejemplo la simulación de la lejanía, se baja el volumen y luego
se aumenta o viceversa.
0 fadeSound 0.2;

para restaurarlo

0 fadeSound 1;

Grupo que salta de un vehículo:

// handle=[grupo] execvm “saltar.sqf”;


if (isServer) then
{
_grupo = _this select 0;
{
unassignVehicle (_x);

(_x) action ["EJECT", vehicle _x];


sleep 1;

// [_x] join grpnull;// ultimamente el arma 3 hace que se suba de nuevo el grupo por ordenes
del lider por lo que sacarlos del grupo sería una buena opción
} foreach units _grupo;

};

Como manener la misma hora siempre aproximadamente

Se ejecuta en el lado del servidor , por ejemplo con un activador que se active por presencia de
los jugadores.

//Script siempre misma hora horafija.sqf

while {true} do {
setDate [2012, 4, 4, 05,0];
sleep 30;
};
Pone marcadores en las posiciones de los jugadores

/*
handle=[] execvm playerMarker.sqf
*/
private["_markers","_members"];
_markers = [];
_members = [];

while {true} do {
sleep 0.5;
if(visibleMap) then {
_members = allPlayers - entities "HeadlessClient_F";
//Create markers
{

_marker = createMarkerLocal [format["%1_marker",_x],visiblePosition _x];


_marker setMarkerColorLocal "ColorBlue";
_marker setMarkerTypeLocal "mil_triangle";
_marker setMarkerTextLocal format["%1", _x
getVariable["realname",name _x]];
_marker setMarkerDirLocal (direction _x);
_markers pushBack [_marker,_x];

} foreach _members;

while {visibleMap} do {
{
private["_marker","_unit"];
_marker = _x select 0;
_unit = _x select 1;
if(!isNil "_unit") then {
if(!isNull _unit) then {
_marker setMarkerPosLocal (visiblePosition _unit);
};
};
} foreach _markers;
if(!visibleMap) exitWith {};
sleep 0.02;
};

{deleteMarkerLocal (_x select 0);} foreach _markers;


_markers = [];
_members = [];
};
};

Cómo hacer limpieza de una zona y así optimizar la misión en fps

Para hacer limpieza en algunas zonas donde creamos que quedarán IAS enemigas u objetos
podemos hacermediante triggers por presencia de un jugador. Cuando un jugador esté en una
zona determinada podemos activar un script que haga limpieza de los objetos que estén dentros
de un trigger, por ejemplo en este caso nuestro trigger que limpiará su extensión de objetos será
aquel llamado triggerlimpieza1. Lo ponemos para que incluya el tipo de objetos que nos interesa
por ejemplo Opfor , presencia y nos dará todos los enemigos del este luego con ese código
borramos todas las IAS que no fueron eliminadas.

Script limpieza1.sqf que se activará cuando el jugadorpase por una zona y usará los objetos que
abarque el trigger llamado triggerlimpieza1 .

{deletevehicle _x;} forEach list triggerlimpieza1;

Cómo llenar bunkers respaneando unidades

//script by DPD
// handle=[nombredelbunker] execvm “bunkerscript”;

private["_i","_j","_text","_building","_nuevaposicion","_housePos","_patrullon","_allpositi
ons"];

_housePos = _this select 0;


_patrullon= _this select 1;
_j=ceil(random 10000);
_text = formatText ["grpmalo%1",_j];
_text= [position _housePos ,east, _patrullon,[],[],[],[],[],getDir _housePos+180] call
BIS_fnc_spawnGroup ;

_building=nearestObject [_housePos, "building"];


_i=0;
_allpositions =[_building] call BIS_fnc_buildingPositions;
{
_nuevaposicion = _allpositions call BIS_fnc_selectRandom;
_x setDir ((getDir _building)) ;

(_x) setPosATL [_nuevaposicion select 0,_nuevaposicion select 1,_nuevaposicion select 2];

_x setDir (- getDir _building ) ;

[_x] join grpNull;


doStop _x;
} foreach units _text;
Destrucción de la ciudad:

Coloca una game logic y ponle un nombre ejemplo destructor.


ejecuta un script con este codigo, añadiendo en el activador isserver:

buildings = nearestObjects [destructor,["building"], 300]; //300 es el radio destructivo

{_x setDamage 1} foreach buildings; // causa daños max 1 a todos los edificios

Procura que el jugador no este muy cerca o morirá, si no quieres que muera ponle esto

player allowdamage false;


buildings = nearestObjects [terre1,["building"], 300];
{_x setDamage 1} foreach buildings;
sleep 10;
player allowdamage true;

Terremoto:

Ejecuta este comando

null=[[[BIS_Earthquake],"scripts\terremoto.sqf"],"BIS_fnc_execVM",true,false] spawn
BIS_fnc_MP;

y crea un fichero terremoto.sqf con este contenido:

Switch (_This select 0) do


{
Case "BIS_Earthquake":
{
_This = Vehicle Player;
Playsound "sound4";//pon un sonido de terremoto
hint "!!!!TERREMOTO!!!!";//aviso prescindible
For "_i" from 0 to 350 do
{
_vx = vectorup _this select 0;
_vy = vectorup _this select 1;
_vz = vectorup _this select 2;
_coef = 0.01 - ((Random 0.0004) * _i);
_This setvectorup

[
_vx+(-_coef+random (2*_coef)),
_vy+(-_coef+random (2*_coef)),
_vz+(-_coef+random (2*_coef))
];
sleep (0.01 + random 0.01);
};
_posicion = getpos _this;
_This setpos _posicion;

};
};

Efectos visión borrosa:

Este efecto puede tener diferentes funcionalidades como para el inicio de una misión
incluyéndola en la presentación o como para transmitir cansancio o efecto de una herida o
efecto de una explosión cercana.

Para poner la vista borrosa inicia con este código:

"dynamicBlur" ppEffectEnable true;


"dynamicBlur" ppEffectAdjust [5]; //nivel de borroso
"dynamicBlur" ppEffectCommit 2; //tiempo de transicion

y para restaurar la vista normal éste:

"dynamicBlur" ppEffectEnable true;


"dynamicBlur" ppEffectAdjust [0];
"dynamicBlur" ppEffectCommit 2;

otra forma sería

if (!hasInterface) exitWith {};

"dynamicBlur" ppEffectEnable true;


"dynamicBlur" ppEffectAdjust [6];
"dynamicBlur" ppEffectCommit 0;
"dynamicBlur" ppEffectAdjust [0.0];
"dynamicBlur" ppEffectCommit 5;
cutText ["", "BLACK IN", 2];
4 fadeSound 1;
sleep 2;
100012 cutRsc ["FHQ_Logo", "PLAIN"];

sleep 2;
100012 cutfadeout 1;

IEDS:

Coloca un marcador llamado "ied" y ejecuta este codigo:

null = "M_RPG32_AA_F" createVehicle [(getMarkerPos "ied" select 0),( getMarkerPos


"ied" select 1), 0];

Tiempo acelerado:

Este script que da un efecto bonito del paso del tiempo, por ejemplo la unión de dos escenas
diferentes, el paso de la noche y despertar de un nuevo día. Sería con un activador con condición
isserver ejecutando ésto:

null=[[[],"scripts\acelerar.sqf"],"BIS_fnc_execVM",true,false] spawn BIS_fnc_MP;

crea un script llamado acelerar. sqf con este texto:

_i=0;
while {_i < 1201} do
{
skiptime 0.01;
sleep 0.001;
_i=_i+1
};
variando los 3 parámetros puedes variar la duración del efecto así como el tiempo transcurrido.

Efectos partículas:

Debéis usar el editor de partículas del arma 3, que podéis probar y ver aqui:

http://www.armaholic.com/page.php?id=21217&highlight=PARTICLES%2BEDITOR
Unas vez tengáis el efecto deseado copiáis los parametros y los guardáis.
Creáis un helipad invisible y le ponéis un nombre, por ejemplo "particulas".
en un activador ejecutáis esta línea:

null = [particulas] execVM "scripts\final.sqf";

y en el archivo final.sqf ejecutad el código:

_object = _this select 0;


_PS = "#particlesource" createVehicleLocal getPos _object;
_PS setParticleCircle [0, [0, 0, 0]];
_PS setParticleRandom [0, [0.25, 0.25, 0], [0.175, 0.175, 0], 0, 0.25, [0, 0, 0, 0.1], 0, 0];
_PS setParticleParams [["\A3\data_f\rainbow", 1, 0, 1], "", "SpaceObject", 1, 12.5, [0, 0,
0], [0, 0, 0.75], 0, 10, 7.9, 0.075, [1.2, 0.02, 4], [[0.1, 0.1, 0.1, 1], [0.25, 0.25, 0.25, 0.5], [0.5,
0.5, 0.5, 0]], [0.8], 1, 0, "", "", _object];
_PS setDropInterval 0.0057;
//si queremos darle tiempo finito le añadis acontinuacion el tiempo que querais:
sleep 31; //el tiempo que querais.OPCIONAL
deletevehicle _PS;//el tiempo que querais.OPCIONAL

Una simulación de paso con aviones:

Script para N aviones que se respanean en la lógica avion1 y desaparecen en el destino, lógica
llamada avion2.
// handle=[] exec “aviones.sqf”;

// Autor: DPD
N=10;//numero de veces que sucede
for "_i" from 1 to N do
{
handle=[POSITION avion1,POSITION
avion2,40,"NORMAL","uns_A7N_GBU",RESISTANCE] execvm "fn_ambientFlyby.sqf";
sleep 30;
};
// es el nombre de la clase del avión uns_A7N_GBU
//40 es la altura

Una simulación de paso con aviones:

Pasa 10 aviones creándose todos en la posición de la lógica avion1 y desapareciendo en la lógica


de destino avion2 . La clase del avión es "uns_A7N_GBU", se crea uno cada 30 segundos y esto
simula el paso de aviones cada cierto tiempo sobre la zona que está entre las dos lógicas avion1 y
avion2.
N=10;

for "_i" from 1 to N do

{
handle=[POSITION avion1,POSITION
avion2,40,"NORMAL","uns_A7N_GBU",RESISTANCE] execvm "fn_ambientFlyby.sqf";
sleep 30;
};

Una simulación de bombardeo

Cuando queremos simular un bombardeo pero queremos asegurarnos no matar a ningún


jugador de la partida, sólo algo de ambiente.
El script elige aleatoriamente las posiciones de las lógicas cuyos nombres están en el vector
_lugaresdebombardeo, y crea en ellas unas explosiones perimetrales. Cada cierto tiempo se
elige una posición aletoria.

//N es el numero de ataques


/
N=10;
_lugaresdebombardeo=[positionmortar3,positionmortar2,positionmortar1,positionmortar4];
for "_i" from 0 to N do
{
_bestplace = _lugaresdebombardeo call BIS_fnc_selectRandom;
_barrage = [position _bestplace,nil,70,10,7] spawn BIS_fnc_fireSupportVirtual;
sleep (random 260);
};

Ataque de aviones
//handle=[tiempo] execvm “
private ["_timer","_fire"];
_timer = _this select 0;
_fire = true;
while {_fire} do {
_center = createCenter sideLogic;
_group = createGroup _center;
_weapons = [0, 1, 2, 3] call BIS_fnc_selectRandom;
_mark = [cas1, cas2, cas3, cas4, cas5] call BIS_fnc_selectRandom;
_pos = getPos _mark;
_cas = _group createUnit ["ModuleCAS_F",_pos , [], 0, ""];
_cas setDir 0;
_cas setVariable ["vehicle","O_Plane_fighter_02_F"];
_cas setVariable ["type", _weapons];
sleep (_timer + random 60);
};

Efecto de un helicóptero averiado


//llamar al helicóptero camara2 y ponerlo volando a una altura con un waypoint para
descargar transporte en un objeto helipad visible , zona de aterrizaje para helicópteros.
Recordar que el waypoint tiene que esta dentro del volumen que ocupa el helipad visible.Los
invisibles actualmente no funcionan.
//nul = [this] execVM "heliDamage.sqf";

camara2 setdammage 0.8;

playSound3D ["a3\sounds_f\weapons\Rockets\explosion_missile_04.wav", camara2, false,


getPos
camara2, 1, 1, 0];
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
//sleep 2;
//camara2 setDamage 0,9;
//sleep 0.1;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
//explosion3 = "HelicopterExploBig" createVehicle getPos camara2;
//explosion3 attachTo [camara2,[0,0,0]];
playSound3D ["a3\sounds_f\weapons\Rockets\explosion_missile_05.wav", camara2, false,
getPos
camara2, 1, 1, 0];
sleep 3;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
sleep 5;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];

sleep 3;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
sleep 3;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
sleep 3;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
sleep 3;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
sleep 5;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
sleep 3;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];
sleep 3;
smokefx1 = "ArtilleryRocketCore" createVehicle getPos camara2;
smokefx1 attachTo [camara2,[4,3,4]];

camara2 setfuel 0;

playSound3D ["a3\sounds_f\weapons\Explosion\expl_big_1.wav", camara2, false, getPos


camara2, 1, 1, 0];
SCRIPT DE MORTEROS
Este script se puede llamar como handle= [] execvm “mortero.sqf” y se llama en el lado del
servidor mediante un activador/trigger o desde un script que controle la misión y se ejecute
simpre en el lado del servidor. Se nombra la IA con el nombre de mortero1 que tiene el mortero y
no el objeto del mortero.

sleep 60; // tiempo que tarda en empezar a bombardear


for "_i" from 1 to 999 do { //---los ciclos de bombardeo ,999 veces

_mortar = [mortero1] call BIS_fnc_selectRandom; //--- selecciona al mortero para usar


_center = getMarkerPos "bombMort"; //punto central alrededor en
el que se produce el bombardeo
_radius = (random 160); //radio respecto al punto central
formando un circulo donde caera los proyectiles
_pos = [
(_center select 0) - _radius + (2 * random _radius),
(_center select 1) - _radius + (2 * random _radius),
0
];
_mortar commandArtilleryFire [
_pos,
getArtilleryAmmo [_mortar] select 0,
1 //--- disparos producidos por unidad
];

mortero1 setVehicleAmmoDef 1;
sleep (25 + random 45); //--- restraso en un bombardeo y otro

};

SCRIPT DE MORTERO MEJORADO


Este script se puede llamar como handle= [] execvm “morteros.sqf” y se llama en el lado del
servidor mediante un activador/trigger o desde un script que controle la misión y se ejecute
simpre en el lado del servidor.
Este script mejorado por DPD, comprueba si hay jugadores en la posición donde va a caer el
proyectil. Se necesita dos unidades enemigas, según el vector _mortar, actualmente son
mortero1 y mortero2, son los nombres de las IAS que deben estar con un mortero cada una. Se
nombra la IA y no el mortero.

//handle= [] execvm “morteros.sqf”


private["_Area","_pos ","_radius","_center","_mortar","_logcentrolimp",
"_tlist","_trg"];
_tlist=[];
for "_i" from 1 to 100 do { //---los ciclos de bombardeo ,999 veces

_mortar = [mortero1,mortero2] call BIS_fnc_selectRandom; //--- selecciona al mortero


para usar
_center = getPos objetivo; //punto central alrededor en el que se
produce el bombardeo
_radius = 160; //radio respecto al punto central formando un
circulo donde caera los proyectiles
_pos = [
(_center select 0) - _radius + (2 * random _radius),
(_center select 1) - _radius + (2 * random _radius),
0
];
_logcentrolimp =_pos;

_Area =15;

_trg=createTrigger["EmptyDetector", _logcentrolimp];
_trg setTriggerArea [_Area,_Area, 0, true];
_trg setTriggerActivation["ANYPLAYER","PRESENT",false];

sleep (0.8);

while {count
list _trg >0} do

{
deletevehicle
_trg;
_pos = [
(_center select 0) - _radius + (2 * random _radius),
(_center select 1) - _radius + (2 * random _radius),
0
];
_logcentrolimp =_pos;

_Area =20;

_trg=createTrigger["EmptyDetector",_logcentrolimp];

_trg setTriggerArea[_Area,_Area,0,false];

_trg setTriggerActivation["ANYPLAYER","PRESENT",false];
sleep (0.8);

};

deletevehicle
_trg;

_mortar commandArtilleryFire [
_pos,
getArtilleryAmmo [_mortar] select 0,
1 //--- disparos producidos por unidad
];

mortero1 setVehicleAmmoDef 1;
sleep (20 + random 20); //--- restraso en un bombardeo
};
SCRIPT DETELEPORTER

Script para poder testear las misiones rápidamente. Se añade este código en el archivo init.sqf
y luego en la misión con shift izquierdo + click sobre el mapa puede teleportarse, así uno puede
activar los diferentes activadores por presencia de la misión o ver como reacciona scripts como el
ALIVE en los diferentes puntos del mapa.
EventoMapClick= "
posclick=_pos;

if (_shift) then
{
player setpos _pos;
MensajeGlobal = name player + ' teletransportado';
publicVariable 'MensajeGlobal';
server globalchat 'Te has teletransportado';
};
if (_alt) then
{
_pos execVM 'scripts\Camara.sqf';
MensajeGlobal = name player + ' entrando en modo camara';
publicVariable 'MensajeGlobal';
server globalchat 'Entrando en modo camara';
};

true; ";
onMapSingleClick EventoMapClick;
publicvariable "posclick";
ALEATORIEDAD I

Imaginemos que como editores queremos que varias cosas de nuestra misión cada vez que se
juegue puedan ser diferentes.
Por ejemplo, queremos destruir un shilka en una área concreta , queremos que pueda estar en
diferentes sitios cada vez que se inice la partida, es decir, que los jugadores no puedan
aprenderse la misión de memoria. Hay scripts que te dan posiciones aleatorias pero éste es muy
sencillo porque nosotros mismos usamos lógicas nombradas donde podrá posicionarse el objeto
que usamos como objetivo, en este caso es la destrucción de un shilka.
Las lógicas nombradas como posicion1, posicion2......son las que están en el vector
_puntos=[posicion1,posicion2,posicion3,posicion4,posicion5];
podemos poner tantas como queremos y el script elegirá una de esas lógicas que las podemos
tener en lugares controlados que nos convenga así como dentro de edificos ( para objetivos IAS,
un general enemigo etc..).
La misión pues tendrá el objetivo posicionado en un diferente lugar en un número determinado
de veces que se juegue y la hará diferente de la primera vez.
Se puede usar también para los activadores que activan IAS que patrullan alrededor del objetivo.

uso: nulvar= [objeto] execvm "posicionaleatoria.sqf";

/////////////////////////////////////////////////////////////////
// Function file for Armed Assault
// Created by: TODO: DPD
//////////////////////////////////////////////////////////////////

_unidad = _this select 0;

if (isserver ) then {

_puntos=[posicion1,posicion2,posicion3,posicion4,posicion5];

_posicioninicial= _puntos call BIS_fnc_selectRandom;

_unidad setpos position _posicioninicial;

// puede usarse para trasladar a la vez un activador que cree IAS por presencia del jugador
//nombreactivador setpos position _posicioninicial;

};

ALEATORIEDAD II

Se puede añadir bastante aleatoriedad en las misiones de forma sencilla, por ejemplo podemos
poner obstáculos, vehículos, objetos que aleatoriamente al principio de la misión sean borrados o
no , entonces tendremos diferentes situaciones cada vez que la jugamos. Ésto junto a poner
unidades al 50 por ciento de probabilidad de presencia o vehículos hará que nuestra misión
siempre tenga algo distinto y sea muy difícil de aprender de memoria.

Si en el archivo init.sq tenemos en el lado del servidor lo siguiente significa que unos objetos ya
creados en el escenario aleatoriamente permanecerán y otros se borrarán. Al englobarlos en los
if , nos referimos a composiciones de objetos, IAS , vehículos que estamos usando en algún
punto determinado. Si la probabilidad es en contra de esa situación de objetos en ese punto, éstos
se borrarán y no nos encontraremos esa situación en la partida. Por ejemplo se pueden hacer
muchas cosas como un objeto minarete llena de enemigos que luego al jugarlo lo tengamos en
nuestro camino o no .
Se puede englobar este códido en un script llamado aleatoriedad.sqf y llamarlo desde el init.sqf
en el lado del servidor.
// se estudia al evento 1, 50 por ciento de probabilidad de que ocurra
//si se cumple este if entonces se borran todos los objetos y se descarta que ocurra ese elemento
sorpresa
if ((random 1)<=.5) then
{
deletevehicle r1;
deletevehicle r2;
deletevehicle r3;
deletevehicle r4;
deletevehicle r5;
deletevehicle r6;
deletevehicle r7;
deletevehicle e1;
deletevehicle e3;
deletevehicle e4;
deletevehicle e6;
deletevehicle e8;
deletevehicle e9;
};
// se estudia al evento 2, 50 por ciento de probabilidad de que ocurra
//si se cumple este if entonces se borran todos los objetos y se descarta que ocurra ese elemento
sorpresa
if ((random 1)<=.5) then
{
deletevehicle t1;
deletevehicle t2;
deletevehicle camion1;
deletevehicle camion2;
};
// se estudia al evento 3, 50 por ciento de probabilidad de que ocurra
//si se cumple este if entonces se borran todos los objetos y se descarta que ocurra ese elemento
sorpresa
if ((random 1)<=.5) then
{deletevehicle m1;
deletevehicle m2;
deletevehicle m3;
deletevehicle m4;
deletevehicle m5;
deletevehicle m6;
deletevehicle m7;
deletevehicle m8;
deletevehicle m9;
deletevehicle m10;
deletevehicle m11;
deletevehicle m12;
deletevehicle m13;
};
// se estudia al evento 4, 50 por ciento de probabilidad de que ocurra
//si se cumple este if entonces se borran todos los objetos y se descarta que ocurra ese elemento
sorpresa

if ((random 1)<=.5) then


{deletevehicle c1;
deletevehicle c2;
deletevehicle c3;
deletevehicle c4;
deletevehicle c5;
deletevehicle c6;
deletevehicle c7;
deletevehicle c8;
deletevehicle c9;

};
ARSENAL VIRTUAL

Nos encontramos muchas misiones en las que se puede acceder a todo tipo de armamento con
una sola caja, vehículo etc... donde podemos guardar nuestros perfiles con armas y uniformes
que nos gustan más o adecuados para cada tipo de misión.
Sólo hay que poner una línea en el campo init de la caja o del vehículo:

0 = ["AmmoboxInit",[this,true]] spawn BIS_fnc_arsenal;

Cómo quitar los cuerpos de los enemigos caídos . script removedead

Este script no sólo es para eliminar los cuerpo caídos cuando transcurre un tiempo prudencial
sino también elimina aquellos vehículos que han sido destruidos. La filosofía de que cuantos
menos objetos haya en la misión más F.P.S es cierta y ayuda siempre.

this addeventhandler ["Killed", {_thisexecVM"SCRIPTS_DPD\RemoveDead.sqf"}];

El script está guardado en la carpeta SCRIPTS_DPD de la carpeta de la missión. A cada AI


que se crea, grupo de enemigos se le añade la línea anterior o si utilizamos for each para
referirnos a grupos creados usaremos _x en vez de this.
Para los enemigos puestos en el escenario

{
_x addeventhandler ["Killed", {_thisexecVM"SCRIPTS_DPD\RemoveDead.sqf"}];
}
forEach (allUnits select {side _x isEqualTo EAST});

El código del script removedead.sqf creado por RAVEN es el siguiente

//////////////////////////////////////////////////////////////////
// Function file for Armed Assault
// Created by: TODO: Author Name
//
*******************************************************************************
// ** Script: RemoveDead.sqf
// ** Descripcion: Remoción de unidades eliminadas según su clase
//
*******************************************************************************
// ** Autor: RAVEN
// ** Site: www.ArmedAssault.com.ar/Foros
//
*******************************************************************************
// ** Invocación: En campo de inicio de unidad
// ** this addeventhandler ["Killed", {_this execVM "RemoveDead.sqf"}]
//
*******************************************************************************
_unit = _this select 0;

private["_esMan","_demora","_pos","_px","_py","_pz"];

_esMan = false;
_demora = 60;
if ("MAN" counttype [_unit] > 0) then {_demora = 520; _esMan = true};
if ("CAR" counttype [_unit] > 0) then {_demora = 70};
if ("TANK" counttype [_unit] > 0) then {_demora = 70};
if ("AIR" counttype [_unit] > 0) then {_demora = 70};
waitUntil {(velocity _unit select 0) + (velocity _unit select 1) + (velocity _unit select 2) == 0};
_pos = GetPosAsl _unit;
_px = _pos select 0; _py = _pos select 1; _pz = _pos select 2;
sleep _demora;
if (_esMan) then
{
_unit SetPosASL [_px, _py, 0];
hidebody _unit;

};
deletevehicle _unit;

Cómo hacer que grupos de enemigos acosen a los jugadores script persigue.sqf
Este script es genial porque fuerza a un grupo a perseguir a un jugador en concreto , haciendo
más difícil la misión.
Da la sensación de que la IA es más inteligente al encontrar la ubicación exacta del jugador que
huye, se esconde o se cubre en algún edificio. Muy aconsejable su uso.

nullvar=[unidadPerseguidora,unidadPerseguida] execVm "persigue.sqf";


/*
persigue.sqf v1.2 2010/9/30 - autor: Boreas
Sencillo script que sirve para que una unidad persiga a otra. Para usarlo invocar la
siguiente instruccion:

nullvar=[unidadPerseguidora,unidadPerseguida] execVm "persigue.sqf";

Se le pueden pasar mas parametros para acotar mas el modo de persecución:

nullvar=[unidadPerseguidora,unidadPerseguida,radio,tiempo] execVm "persigue.sqf";

Los parametros signigican lo siguiente:


-unidadPerseguidora: La IA que persigue
-unidadPerseguida: La IA o el player que va aser perseguido
-radio: radio alrededor de la unidad perseguida en el que la IA persegidora
intetnara moverse buscando.(25m por defecto)
-timpo: tiempo en segundos en que la IA perseguidora actualiza su movimiento
para dirigirse a la nueva aera de busqueda(60s por defecto)

Ejemplo1:
nullvar=[cazador,presa] execvm "persigue.sqf";
Ejemplo2:
nullvar=[cazador,presa,40,30] execvm "persigue.sqf";
//40 son los metros de radio alrededor de la presa donde el cazador se movera
//30 es el intervalo de tiempo que el cazador utiliza para dirigirse a la nueva zona
de busqueda de la presa
*/

private
["_radio","_timeout","_grpPersigue","_grpPerseguido","_seguir","_ldrpersigue","_ldrperseg
uido","_offx","_offy","_time2","_persigue","_perseguido","_diametro"];
_persigue = _this select 0;
_perseguido = _this select 1;
_radio= _this select 3;
_timeout= _this select 4;
if (count (_this) >=3 ) then {
_radio = _this select 2;
};
if (count (_this) >=4 ) then {
_timeout=_this select 3;
};
_diametro = _radio + _radio; //necesitamos el diametro=radio x 2
_seguir=true;
_grpPersigue="a";
_grpPerseguido="a";
if((typeName _persigue)=="GROUP")then{
_grpPersigue = _persigue;
} else {
_grpPersigue = group _persigue;
};
//player sidechat "(typeName _perseguido) "+str((typeName _perseguido));
if((typeName _perseguido)=="GROUP")then{
_grpPerseguido = _perseguido;
//player sidechat "R0";
} else {
//player sidechat "R1";
_grpPerseguido = group _perseguido;
//player sidechat "R2";
};
while {_seguir} do{

_ldrpersigue = leader _grpPersigue;


_enemigosoldier = _ldrpersigue findNearestEnemy (position _ldrpersigue);

_dist=_enemigosoldier distance _ldrpersigue;

if (_dist<200) then { _ldrpersigue setBehaviour "COMBAT"; } else


{ _ldrpersigue setBehaviour "AWARE"; };
_ldrpersigue setCombatMode "RED";
_ldrperseguido = leader _grpPerseguido;
//player sidechat "count units _grpPersigue" +str(count units _grpPersigue);
//player sidechat "count units _grpPerseguido" +str(count units _grpPerseguido);
if((count units _grpPersigue)==0)then{
_seguir=false;
};

_offx = (_radio) - random _diametro;


_offy = (_radio) - random _diametro;

_ldrpersigue move (_ldrperseguido modelToWorld [_offx,_offy,0]);


_ldrpersigue setSpeedMode "FULL";
_ldrpersigue setBehaviour "RED";
sleep 1;
_time2 = time + _timeout;
waitUntil {sleep 0.5;moveToCompleted _ldrpersigue or moveToFailed _ldrpersigue or !
alive _ldrpersigue or _time2 < time};
};

Cómo imitar un camuflaje de francotirador. Script camuflaje.sqf

En el init del francotirador se puede poner if (isserver) then { handle=[this] execvm


“camuflaje.sqf”};

private ["_unit","_nearEnemies1"];
_unit = _this select 0;
_unit sideChat "ENTRADO EN SCRIPT";

while {alive _unit} do {


_enemySides = [side _unit] call BIS_fnc_enemySides;
_radiusMAX = 200;
_radiusMIN = 50;
sleep 0.01;
_nearEnemies1 = allUnits select {_x distance _unit > 0 AND _x distance _unit < 150 AND
side _x in _enemySides};

if ( not ((speed _unit < 5) && (stance _unit == "PRONE" || stance _unit == "CROUCH" )) )
then
{
{

_x setskill ["spotDistance",1];
_x setSkill ["spotTime",1];
sleep 0.01;
} forEach _nearEnemies1;

};
if(count _nearEnemies1>0)
then
{

//_unit sideChat "ENTRADO A MENOS DE 150 METROS";


If ((speed _unit < 2) && (stance _unit == "PRONE")) then

_unit sideChat "TUMBADO";


_unit setcaptive true;

} else

{
//_unit sideChat "NO ESTOY TUMBADO O VOY DEMASIADO RAPIDO";
_unit setcaptive false;

};
//_listaplantasrocas=nearestTerrainObjects [ _unit, ["bush","tree",","rock"], 10];
//If ((speed _unit < 0.5) && ((stance _unit == "CROUCH") || (stance _unit == "PRONE")) &&
(_listaplantasrocas select 0) distance _unit < 0.5) then
// {
// hintC "estoy escondido pegado a un arbol , roca o arbusto";
//_unit setcaptive true;
//} else
//{
// _unit setcaptive false;
// };
};//if(count _nearEnemies1>0
_nearEnemies = allUnits select {_x distance _unit > _radiusMIN AND _x distance _unit <
_radiusMAX AND side _x in _enemySides};
if ( (speed _unit < 5) && (stance _unit == "CROUCH") ) then
{
{
// _unit sideChat "entra bucle sentado poco oculto";
_x setskill ["spotDistance",0.1];
_x setSkill ["spotTime",0.1];
sleep 0.01;
} forEach _nearEnemies;
};
if ( (speed _unit < 5) && (stance _unit == "PRONE") ) then
{
{
// _unit sideChat "entra bucle tumbado superoculotO";
_x setskill ["spotDistance",0.03];
_x setSkill ["spotTime",0.03];
sleep 0.01;
} forEach _nearEnemies;
};
sleep 3;
};//WHILE

Script para hacer mover una patrulla en un edificio

handle=[nombregrupo, nombreedificio o vector] execvm "buildingPatrol.sqf";


Ese grupo debe ser llamado en el init del líder nombregrupo=group this; o mediante scripting
respaneando grupos de enemigos.

//buildingPatrol 1.0 by SPUn


if(!isServer)exitWith{};
private ["_grp","_buildings","_i","_aliveCount","_bPoss"];
_grp = _this select 0;
_buildings = _this select 1;

_bPoss = [];
{
_i = 0;
while { ((_x buildingPos _i) select 0) != 0 } do {
_bPoss set [count (_bPoss), (_x buildingPos _i)];
_i = _i + 1;
};
}forEach _buildings;

_grp setBehaviour "AWARE";

_aliveCount = { alive _x } count units _grp;


while{_aliveCount > 0}do{
_aliveCount = { alive _x } count units _grp;
{
if(unitReady _x)then{
_x doMove (_bPoss call BIS_fnc_selectRandom);
};
}forEach units _grp;
sleep 20;
};

ZEUS. ¿ para qué sirve ? ¿ cómo usarlo ?


El sistema Zeus se basa en que uno o varios jugadores toman el control de la misión, es decir
pueden crear, manipular objetos y unidades dentro del escenario así como los objetivos, puede
controlar diferentes personajes y rolear según su imaginación. A las misiones les da un toque
diferente, una capacidad alta de interacción entre los jugadores online y diferentes roles dentro
de la misión coherente con el argumento. Puede hacer que una misión sea una misión no lineal
que dependa de las decisiones de lo jugadores cuando interaccionan con los roles controlados
por los Zeus. Os invito a utilizar o combinar esta modalidad que las hará más divertidas.
En el final del script init.sqf se escribe este código que se usa también para espectadores :
if (!isDedicated) then {
waitUntil {!isNull player};
};

FHQ_allPlayableUnits = (if (isMultiplayer) then {playableUnits} else {switchableUnits});


FHQ_startingUnits = allUnits + vehicles + allUnitsUAV;
/* Filter out spectators and actual players, and player groups */
FHQ_playableUnits = [];
FHQ_playableGroups = [];
{ if (side _x != sideLogic) then {
FHQ_playableUnits pushBack _x;

if (!((group _x) in FHQ_playableGroups)) then {


FHQ_playableGroups pushBack (group _x);
};
};
} forEach FHQ_allPlayableUnits;
/* When players die, they will be able to see all units, not just
* players and their own side
*/
{
_x setVariable ["WhitelistedSides", ["WEST", "EAST", "RESISTANCE", "CIVILIAN"]];
_x setVariable ["AllowAI", true];
} forEach FHQ_playableUnits;
///ZEUS
if (isServer) then {
[] spawn {
{
_x addCuratorEditableObjects [allUnits, true];
_x addCuratorEditableObjects [vehicles, true];
_x addCuratorEditableObjects [allUnitsUAV, true];
_x addCuratorEditableObjects [allMines, true];
} forEach allCurators;
};
};
if (isServer) then {
[] spawn {
{
_x addCuratorEditableObjects [vehicles,true];
_x addCuratorEditableObjects [(allMissionObjects "Man"),true];
_x addCuratorEditableObjects [(allMissionObjects "Air"),true];
_x addCuratorEditableObjects [(allMissionObjects "Ammo"),true];
} forEach allCurators;
while {true} do {
{
_curator = _x;
{_curator addCuratorEditableObjects [[_x],true];} forEach allUnits;
_x addCuratorEditableObjects [allUnits, true];
_x addCuratorEditableObjects [vehicles, true];
_x addCuratorEditableObjects [allUnitsUAV, true];
_x addCuratorEditableObjects [allMines, true];
_x addCuratorEditableObjects [vehicles,true];
_x addCuratorEditableObjects [(allMissionObjects "Man"),true];
_x addCuratorEditableObjects [(allMissionObjects "Air"),true];
_x addCuratorEditableObjects [(allMissionObjects "Ammo"),true];
} forEach allCurators;
sleep 5;
};
};
};
Unas screenshots de ejemplo para configurar ZEUS:

El ZEUS que siempre funciona en el servidor es el referido al adminitrador en el campo de texto


Propietario.

#AdminLogged
Para crear un zeus virtual, es decir no se necesita un objeto físico en el mapa como un civil .

¿Cómo crear una intro con cámara , que tenga logo y hasta video?
En el init.sqf , No debe estar en el lado del servidor poner esta línea
[] execVM "Intro.sqf";
dejar un espacio de tiempo

sleep 10;
y añadir este código en el init.sqf
// este codigo sirve para usar la variable global SkipIntro que una vez que se ejecute la misión
//tendrá valor true
if (isServer) then {
0 spawn {
sleep 2;
SkipIntro = true;
publicVariable "SkipIntro";
};
};

Al ejecutare este código , la variable SkipIntro se hará true y cuando otro jugador entre más
tarde , al usar esta variable para restringir el acceso según si es verdadero o falsa en el script
intro.sqf entonces no se ejecutará. Es una forma de asegurarse que sólo se ejecuta una vez la
intro.

Al inicio del script intro.sqf debe contener esta línea muy importante que restringe que se pueda
ejecutar de nuevo la intro si otro jugador accediese a la partida.

if (!isNil "SkipIntro") exitWith {};

Partes de nuestra intro.

///////////////////////////// esta parte filtra porque si se ha ejecutado una vez la intro, sale de la intro
////////////////////////////porque la variable SkipIntro tiene valor true en el init.sqf cuando se ejecuta.
////////////////////////////Asegura que se ejecute solo una vez
if (!isNil "SkipIntro") exitWith {};
///////////////////////////// texto con pantalla en negro que evita que se note cambios de fps los primeros
segundos/////////////////////////////
titleText ["Loading mission..BLACK HAWK DOWN....edited by DPD ", "BLACK FADED"];
sleep 9;
///////////////////////////// se introduce video llamado intro en formato ogv en la carpeta sound //////
_video = ["sound\intro.ogv"] spawn bis_fnc_playVideo;
waitUntil {scriptDone _video};
/////////////////////////////
///////////////////////////// se ejecuta un archivo de música que tenemos definida en description.ext y
contenida en una carpeta sound de nuestra misión
playmusic "b4";
/////////////////////////////

///////////////////////////// titulo en blanco grande ///////////////////////////////


[
"<t size = '1.5'>BLACK HAWK DOWN </t>",
safeZoneX+0.71, safeZoneY+safeZoneH-0.83, 4, 4, 0, 890
] spawn bis_fnc_dynamicText;
/////////////////////////////

///////////////////////////// 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];
///////////////////////////// //////////////////////////////////////////////////////////////

///////////////////////////////se crea una camara llmada _c sobre el objeto llamado camara2, en mi caso
camara2 es el helicoptero que cae ///////////////////////////////

_c = "camera" camcreate position camara2;


_c cameraeffect ["internal", "back"];

showcinemaborder True;
//scene 1// se enfoca sobre el objeto camara2
_c camSetTarget camara2;
_c camSetRelPos [0,-7,10];
_c camCommit 0;

sleep 2;

///////////////////////////////////////// Letras de presentancion /////////////////////////////////////////


[ [ ["Somalia, Mogadiscio,","align = 'center' shadow = '1' size = '0.7' font='PuristaBold'"],
["Después de realizar una misión ","align = 'center' shadow = '1' size = '0.5'","#aaaaaa"],
["","<br/>"],
["un helicóptero nuestro ha sido derribado","align = 'center' shadow = '1' size = '0.5'"]] ]
spawn BIS_fnc_typeText2;

sleep 8;
/////////////////////////////////////////otro tipo de texto que adorna /////////////////////////////////////////
[str("3 de octubre de 1993") ] spawn BIS_fnc_infoText;

sleep 6;
///////////////////////////////////////// /////////////////////////////////////////
///////////////////////////////////////// se ejecuta otra vez el sonido llamado b4 que hemos definido en
description.ext

playmusic "b4";
/////////////////////////////////////////

///////////////////////////////////////// escena 2

_c camSetTarget camara2;
_c camSetRelPos [0,-7,10];
_c camCommit 0;

///////////////////////////////////////// escena 3
_c camSetTarget camara2;
_c camSetRelPos [1,-1,1];
_c camCommit 0;
sleep 6;
///////////////////////////////////////// escena 4

_c camSetTarget camara2;
_c camSetRelPos [0,-10,20];
_c camCommit 0;

/////////////////////////////////////////// scene 5
_c camSetTarget camara2;
_c camSetRelPos [5,-5,15];
_c camCommit 0;
sleep 5;

//scene 6
_c camSetTarget camara5;
_c camSetRelPos [5,-5,6];
_c camCommit 0;

sleep 19;
/////////////////////////////////////////
playmusic "b1";
/////////////////////////////////////////

///////////////////////////////////////// se destruye la camara /////////////////////////////////////////


_c cameraEffect ["Terminate", "Back"];
camDestroy _c;
/////////////////////////////////////////
///////////////////////////////////////// efecto borroso

"dynamicBlur" ppEffectEnable true;


"dynamicBlur" ppEffectAdjust [6];
"dynamicBlur" ppEffectCommit 0;
"dynamicBlur" ppEffectAdjust [0.0];
"dynamicBlur" ppEffectCommit 5;
cutText ["", "BLACK IN", 2];
4 fadeSound 1;
sleep 2;
sleep 2;
100012 cutfadeout 1;
//////////////////////////////////////// //////////////////////////////////////// ////////////////////////////////////////
//////////////////////////////////////// texto que hay que confirmar en la pantalla con click
hintc " Haz fastrope pulsando tecla windows,prepararse, luego despliega cuerdas y luego
bajas. // Make fastrope by pressing Windows key, prepare, then deploy strings and then lower. ";
sleep 10;

//////////////////////////////////////// un texto en la pantalla


["<t size='1' color='#0066FF'>DESPUÉS DE CAPTURAR ALGUNOS LÍDERES DEL CLAN
HABAR GIDIR...</t> <t size='1' color='#FF0066'> TRES UH-60 Black Hawk HAN SIDO
DERRIBADOS. DEBEMOS RESCATAR A SUS PILOTOS Y TRIPULANTES. HAY UN
CONVOY QUE SE ACERCA PARA AYUDARNOS. //////// AFTER CAPTURING SOME CLAN
LEADERS OF HABAR GIDIR ... THREE UH-60 Black Hawk HAVE BEEN BROUGHT
AWAY. WE MUST RESCUE YOUR PILOTS AND TRIPULANTS. THERE IS A CONVOY
THAT COMES TO HELP US. </t>", 0, 0.5, 15, 0, 0, 30] spawn BIS_fnc_dynamicText;
sleep 15;
////////////////////////////////////////

//////////////////////////////////////// un texto con logo que adorna la misión

_text = "<t size='2'>" + "SIMULA LA GUERRA" + "<br />" + "<t size='2'>" + "SIMULA
BATALLAS HISTÓRICAS," + "</t>" + "<br />" + "<t size='2'>" + "SIMULA CON UST101,"
+ "<t size='1'>" + "<br />" + "VALOR, HONOR, ACOGIDA, DEMOCRACIA , SERIEDAD" +
"<br />" + "</t>" + "<img size='8' image='multimedia\logo.jpg'/>" + "</t>" + "<br />" + "<t
size='1'>" + "www.ust101.com" + "</t>";
_1 =[_text,0.01,0.01,10,-1,0,90]spawn bis_fnc_dynamicText;

//////////////////////////////////////// conversacion creada con textos que aparecen cada cierto tiempo
//////////////////////////////////////// acompanados por un sonido
sleep 25;
["<t size='0.5' color='#0066FF'>COMANDANTE/COMMANDER:</t> <t size='0.5'> Hemos
capturado a los líderes,equipos delta, buena misión pero tenemos un problema. Han sido
derribados tres Black Hawk cerca de nuestra posición./// We have captured the leaders, delta
teams, good mission but we have a problem. Three Black Hawks have been shot down near our
position.</t>", 0, 0.8, 5, 0, 0, 90] spawn BIS_fnc_dynamicText;
playSound "sound1";
sleep 5;
["<t size='0.5'color='#FF0000'>Capitán/Captain:</t> <t size='0.5'>¿Qué hacemos,Señor ? //
What do we do, Lord? </t>", 0, 0.8,5 , 0, 0, 90] spawn BIS_fnc_dynamicText;
playSound "sound1";
sleep 5;
["<t size='0.5' color='#0066FF'>COMANDANTE/COMMANDER:</t> <t size='0.5'>Nueva
misión, con rapidez localizaremos los helicópteros y rescataremos a los sobrevivientes.También a
dos soldados de los nuestros. /// New mission, we will quickly locate the helicopters and rescue
the survivors. Also two soldiers of ours. </t>", 0, 0.8, 9, 0, 0, 90] spawn BIS_fnc_dynamicText;
playSound "sound1";
sleep 5;
["<t size='0.5'color='#FF0000'>Capitán/Captain:</t> <t size='0.5'>Entendido, Señor, veo
muchos flacos acercándose y movilizados.Mal asunto..../// Understood, Sir, I see many skinny
approaching and mobilized.</t>", 0, 0.8, 9, 0, 0, 90] spawn BIS_fnc_dynamicText;
playSound "sound1";
sleep 5;
["<t size='0.5' color='#0066FF'>COMANDANTE/COMMANDER:</t> <t size='0.5'>Recordar
que tenemos ayuda, un convoy de los nuestros nos echará una mano. /// Remember that we
have help, a convoy of ours will lend us a hand. </t>", 0, 0.8, 9, 0, 0, 90] spawn
BIS_fnc_dynamicText;
playSound "sound1";
sleep 5;
["<t size='0.5'color='#FF0000'>Capitán/Captain:</t> <t size='0.5'>Entendido, Señor /// Copy
Sir.</t>", 0, 0.8, 9, 0, 0, 90] spawn BIS_fnc_dynamicText;
playSound "sound1";

Script generador de patrullas de enemigos que atacan una zona concreta.


Según como está el script se crearán grupos aleatoriamente cada 260 segundos en las
posiciones respawn1,respawn3, respawn3 y las envía al objetivo dado cuando se invoca el
script. Los grupos irán a la posición de la lógica llamada nombrelogicaobjetivo
handle=[nombrelogicaobjetivo] execvm "RespaneoContinuo.sqf";

//script que genera grupos con las clases del vector unidadesE que hay que definir
aleatoriamente en las posiciones de las logicas respawn1,respawn2...
//y las enviara un una posicion dada por una logica.genera hasta llegar al límite de unidades
puesto en la variable _limiteunidades
// siempre habrá respaneo hasta llegar a un numero de grupos creados
// muy importante debemos tener lógicas creadas en el escenario respawn1,respawn2,respawn3
// se puede poner todos los puntos de respawn estratégicos que se quieran
//SCRIPT BY DPD
_numEnemigos= count list triggerenemigos;
_i=0;
_gruposcrear=20;// importante, grupos de enemigos para crear
//definir vector de clases IAS INFANTERIA unidadesE=["",""];
for "_i" from 0 to _gruposcrear do
{
_i=_i+1;
_text = formatText ["grpmalo12%1",_i];
_bestShooter = [respawn1,respawn2,respawn3] call BIS_fnc_selectRandom;//
_text= [position _bestShooter, EAST, patrulla] call BIS_fnc_spawnGroup ;
{
//handle=[_x] execvm "vestimenta.sqf";
for "_i" from 1 to 2 do {_x addItemToUniform "HandGrenade";};
for "_i" from 1 to 2 do {_x addItemToUniform "SmokeShell";};
} foreach units _text;
sleep 5;
leader _text move position objetivo; // los enemigos van a la logica llamada objetivo
leader _text setCombatMode "RED";
sleep 260;
leader _text setBehaviour "COMBAT";
leader _text setSpeedMode "FULL";
};

¿ cómo hacer un join in progress sencillo en caso de bug,fallo o caída de un jugador?


Añade esta línea en init.sqf , que no esté en el lado del servidor porque debe ejecutarse en cada
jugador.
[true] execvm "scripts\JIPteleport.sqf";

¿ para qué sirve ? Cuando el jugador se cae o muere por un bug puede entrar en otro slot, y
cuando esté dentro de la misión dándole al F11el script le teleportará al lugar donde está su líder
de patrulla donde se ha metido como jugador.Así podrá rápidamente incorporarse en la partida.

El código de JIPteleport.sqf

// Script extraido y adaptado del revive de Columdrum de ArmA2


/** UTILIZACION: EN EL INIT.SQF
[true] execvm "scripts\JIPteleport.sqf";
**/

/********************************************************** PARAMETROS
******************************************************/
Colum_revive_JIPTelep = if (count _this > 0) then {_this select 0} else {true};

//diag_log format ["JIP teleport: 0 - %1",Colum_revive_JIPTelep];


/********************************************************** FIN PARAMETROS
**************************************************//*****************************
********************************************************************************
****************************/
/*******************************************Funciones
server***************************************************************************
**/
///******************************************************************************
**********************************************************/
/******************************************************* Config Check
*******************************************************/
/
********************************************************************************
********************************************************/

_colum_revive_telepEnabled=false; // already teleported

/
********************************************************************************
*********************************************************/
//Esperamos a que se sincronice el jugador
T_INIT = false;
T_Server = false;
T_Client = false;
T_JIP = false;

if (isServer) then
{
T_Server = true;
if (!isNull player) then {T_Client = true};
T_INIT = true;
} else {
T_Client = true;
if (isNull player) then
{
T_JIP = true;
[] spawn {waitUntil {!isNull player};T_INIT = true};
} else {
T_INIT = true;
};
};
waitUntil {T_INIT};

if (T_Server) then {
[] spawn {Colum_revive_Iniciado = false; PublicVariable 'Colum_revive_Iniciado';
sleep 60; Colum_revive_Iniciado = true; PublicVariable 'Colum_revive_Iniciado';
};
//diag_log "JIP teleport: 1";
};
if (isServer) exitwith {};
/************************************************CBA EVENT HANDLERS
************************************************************************/
//
/
********************************************************************************
***************************************************************/

/********************************************** GENERAL USE FUNCTIONS


***********************************************************************/

colum_revive_GetInVeh={

private["_vehicle","_tmpData",'_posVeh','_turretNumb','_assigned','_Turrets','_subturret'];
//Move unit into a vehicle, if its alive and there is room
_unit= _this select 0;
_tmpData=_this select 1;
_vehicle=_tmpData select 0;
_posVeh=if (count (_tmpData select 1) >0) then {(_tmpData select 1) select 0}else {""};
_turretNumb=if (count (_tmpData select 1) >1) then {(_tmpData select 1) select 1} else
{[0]};
_assigned=false;
if (!alive _vehicle) exitwith {};
switch _posVeh do {
case "Driver": {
if ((_vehicle emptyPositions "Driver") >0) then {_unit moveindriver
_vehicle; _assigned=true;};
};
case "Cargo": {
if ((_vehicle emptyPositions "Cargo") >0) then {_unit moveincargo
_vehicle;_assigned=true;};
};
case "Turret": {
if (isnull (_vehicle turretUnit _turretNumb)) then {_unit moveinTurret
[_vehicle,_turretNumb];_assigned=true;};
};
};

if (_assigned) exitwith {}; // already in vehicle, exit


//search for an empty spot on the vehicle
if ((_vehicle emptyPositions "Gunner") >0) exitwith {_unit moveingunner _vehicle};

_Turrets = (configFile >> "CfgVehicles" >> (typeof _vehicle) >> "Turrets");


if ((count _Turrets) > 0) then { // search turrets
for [{_x=0},{_x<(count _Turrets)},{_x=_x+1}] do {
if ((getNumber((_Turrets select _x) >> "hasGunner")) > 0) then {
if (isnull(_vehicle turretUnit [_x])) exitwith {_unit moveinTurret
[_vehicle,[_x]];_assigned =true;};
}else{
_subturret=(_Turrets select _x) >> "Turrets";
if ((count _subturret) > 0) then {
for [{_y=0},{_y<(count _subturret)},{_y=_y+1}] do {
if (isnull(_vehicle turretUnit [_x,_y])) exitwith
{_unit moveinTurret [_vehicle,[_x,_y]];_assigned =true;};
};
};
};
};
};
if (_assigned) exitwith {}; // already in vehicle exit
if ((_vehicle emptyPositions "Commander") >0)exitwith {_unit moveInCommander
_vehicle};
if ((_vehicle emptyPositions "Cargo") >0) exitwith {_unit moveincargo _vehicle};
if ((_vehicle emptyPositions "Driver") >0) exitwith {_unit moveindriver _vehicle};

};

/********************************************** CLIENT FUNCTIONS


***********************************************************************/

Colum_Revive_Keypressedcode={

Private["_target","_Escuadra","_Lider","_tmpos","_tmposALT","_tmposX","_tmposY","_tm
posZ"];
_dikCode = _this select 1;

if ((_dikCode == 87) && colum_revive_telepEnabled) then{

//diag_log "JIP teleport: 5 - F11 pulsado";

_Lider =(leader player);


_target= objnull; // Not valid leader
if (_Lider == player) then
{
_Escuadra = units (group player);
{
if ((alive _x)&&(_x!=player)) exitwith { _target= _x };
} foreach _Escuadra;
//////diag_log "JIP teleport: 6";
if (isnull _target) then
{
_Escuadra = allunits;
{
if ((alive _x) && (isplayer _x)&&(_x!=player)) then {
if ((side _x) == playerside) exitwith { _target= _x };
};
} foreach _Escuadra;
};
} else { _target= _Lider};
////diag_log "JIP teleport: 7";
if (!isnull _target) then
{
////diag_log "JIP teleport: 8";
_tmpos= getPosATL _target;
_tmposX=_tmpos select 0; _tmposY=_tmpos select 1; _tmposZ=_tmpos
select 2;
_tmpos set[0,(_tmposX+ (random 2) -1)];
_tmpos set[1,(_tmposY+ (random 2) -1)];

if (_tmposZ > 1) then {

//Detect buildings
_tmposALT=_tmpos findEmptyPosition [1,30, typeof player];
if ((count _tmposALT) > 1) then {_tmpos=_tmposALT};
};
if (vehicle player != player) then {moveOut player};
player setPosATL _tmpos;
if (vehicle _target != _target) then {
[player,[(vehicle _target)]] call colum_revive_GetInVeh;
};
//diag_log "JIP teleport: 9";
colum_revive_telepEnabled=false;
};
};
////diag_log "JIP teleport: 10";
false;
};

Colum_Revive_TelepSquad= {
sleep 5;
colum_revive_telepEnabled=true;
////diag_log "JIP teleport: 4";
//10 cutText ["Presiona F11 durante los proximos 5 minutos para ir con tu
escuadra/aliados","PLAIN",2];
hint "Presiona F11 durante los proximos 5 minutos para ir con tu escuadra/aliados";
Sleep 400; // en realidad algo mas de 5 mins pero para que se den prisa :P
colum_revive_telepEnabled=false;
//diag_log "JIP teleport: 5";
};

/
********************************************************************************
***************************************************************/
/
********************************************************************************
***************************************************************/

[] spawn {
waituntil{!(isNil "Colum_revive_Iniciado")};
////diag_log "JIP teleport: 2";
if (Colum_revive_Iniciado) then { //If the mission already started and 60 seconds have
passed
//diag_log "JIP teleport: 3";
if (Colum_revive_JIPTelep) then { [] spawn Colum_Revive_TelepSquad};
};
};

[] spawn {
waituntil{!(isNull (findDisplay 46))};
(findDisplay 46) displayAddEventHandler ["KeyDown","_this call
Colum_Revive_Keypressedcode"];
};

Puedes preguntar dudas a la cuenta de steam dpd29


Puedes contactar conmigo por medio de la página web www.brigadadesimulaciontactica.com

Вам также может понравиться