Академический Документы
Профессиональный Документы
Культура Документы
CONTENIDO:
Primer bloque:
INTRODUCCIÓN
Segundo bloque:
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:
19. Cómo simular un ataque aéreo , unos aviones contra unidades terrestres
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
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
38. Cómo hacer limpieza de una zona y así optimizar la misión en fps
52. ALEATORIEDAD I
53. ALEATORIEDAD II
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
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?
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/
UST101
www.ust101.com
¿ 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.
Se ejecuta todo lo del servidor, lo que se debe ejecutarse sólo una vez y las variables globales
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.
Lado del multiplayer : Se puede ejecutar las presentaciones de las misiones y el briefing
if (isMultiplayer) then { código ; };
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:
_x linkItem "ItemMap";
_x linkItem "ItemCompass";
_x linkItem "ItemWatch";
_x linkItem "ItemRadio";
_x addWeapon "arifle_MXM_F";
sleep 100;
La ia está inhabilitada para moverse. No se moverá si se pone esa línea en su campo init.
playSound "sound1";
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.
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.
Sirve para forzar el disparo al soldado con su arma actual y su modo de disparo actual
designado por la variable local _soldier.
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 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.
• 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:
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.
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.
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.
• 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 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:
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
o´
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.
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
{
{
};
c) Modificación de la inteligencia de la IA
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];
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".
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.
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.
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”
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.
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....
Uso de eventhandles.Tipos.
_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
_soldier = _this select 0; // soldado que dispara , se pone este evenhandler al soldado y se ejectua
cuando éste dispara a enemigos.
soldier = _this select 0;// el que recibe el daño,se ejecuta cuando esa unidad es herida
_enemigosoldier= _this select 1;
_unit = _this select 0;//unidad que ha muerto, se ejecuta cuando esa unidad muere
Uso de cámaras. Un ejemplo de intro.
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
showcinemaborder True;
//scene 1
sleep 5;
sleep 3.5;
//scene 2
_c camPrepareTarget position camara1;
_c attachto [camara1,[-2,-5,5]];
_c camPrepareFOV 0.740;
_c camCommitPrepared 0;
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
sleep 12;
sleep 0.4;
//scene 4
sleep 3.5;
_c camCommit 0;
sleep 0.4;
_c cameraEffect ["Terminate", "Back"];
camDestroy _c;
Herramientas para optimizar las misiones cooperativas. Funciones de bohemia interactive del
propio juego y algunos comandos:
• Función 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.
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
• Función BIS_fnc_taskDefend;
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
Ejemplo 1:
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];
Ejemplo 3:
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....
{
_x addVest "V_PlateCarrier2_blk";
};
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.
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:
código para que la patrulla enemiga handle1 patrulle aleatoriamente alrededor de respawngr1
en un radio de 200.
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.
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: {
case 2: {
};
case 3: {
};
case 4: {
};
case 5: {
comment "Exported from Arsenal by <A2>DPD";
};
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:
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.
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, 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 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.
unidadesE = [];
En el vector unidadesE se guardan las clases de la patrulla de los enemigos cuando se inicia la
misión.
{
handle=[_x] execvm "SCRIPTS_DPD\vestimenta.sqf"; // script que los viste
} foreach units grpmalo212;
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;
Hacemos que el grupo llamado gr62 se ponga a patrullar con waypoints de 1000 metros, es
bastante porque son aviones y necesitan bastante distancia.
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.
sleep 5;
sleep 25;
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;
sleep 5;
gr64 setBehaviour "COMBAT";
[gr64, getPos medio, 700] call bis_fnc_taskPatrol;
sleep 15;
sleep 5;
gr65 setBehaviour "COMBAT";
[gr65, getPos medio, 700] call bis_fnc_taskPatrol;
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.
Demoramos 5 segundos:
sleep 5;
Hacemos que el grupo grpmalote3 empiece a patrullar alrededor de la lógica llamada centro con
waypoints de 150 metros
{
handle=[_x] execvm "SCRIPTS_DPD\vestimenta.sqf"; // los vestimos como queremos
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
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.
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.
Para comprobar la distancia entre dos objetos o dos unidades o dos jugadores, se usa la
condición siguiente:
daytime >=15;
NombreDelJugador in NombreDelVehiculo;
Algunos trucos/códigos sencillos que pueden ayudar y que se pueden usar en activadores o en
otros scripts
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:
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....
4. Cómo hacer que una IA dispare con un antitanque a un objetivo llamado NombreObjetivo
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 cartel flag2 usamos el comando y queremos poner una bandera talibán
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
};
private
["_tirargranadahumo","_meterseenedificios","_soldier","_enemigo","_ponercargasenvehiculo
s","_enemigosoldier","_nbuilding","_grp","_man","_dist1","_x","_man3","_number36","_
number37", "_number32","_cubierta","_cual","_s","_man4"];
_npc = _soldier;
_target = _enemigosoldier;
_height = 1;
//If (count _this > 2) then {_height = _this select 2};
sleep 0.01;
private
["_tirargranadahumo","_meterseenedificios","_soldier","_enemigo","_ponercargasenvehiculo
s","_enemigosoldier","_nbuilding","_grp","_man","_dist1","_x","_man3","_number36","_
number37", "_number32","_cubierta","_cual","_s","_man4"];
_npc = _soldier;
_target = _enemigosoldier;
_height = 1;
If (count _this > 2) then {_height = _this select 2};
sleep 0.01;
SLEEP 0.1;
_soldier selectWeapon "throw";
_soldier Fire ["handgrenadeMuzzle", "handgrenadeMuzzle", "handgrenade"];
};
};
_height = 1;
//If (count _this > 2) then {_height = _this select 2};
} else {
};
};
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;
};
};
};
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 {
};
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
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
Requisitos:
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}};
sleep 0.5;
{
sleep 0.01;
};
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í.
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
Otra posibilidad :
[
"<t size = '1.5'>PRIMERA PARTE </t>",
safeZoneX+0.71, safeZoneY+safeZoneH-0.83, 4, 4, 0, 890
] spawn bis_fnc_dynamicText;
// 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;
Primero añadimos estas líneas en el campo init de la unidad que queremos unir, rescatar,
hablar con ella, interaccionar en general...
};
sleep 10;
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;
// [_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;
};
Se ejecuta en el lado del servidor , por ejemplo con un activador que se active por presencia de
los jugadores.
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
{
} 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;
};
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 .
//script by DPD
// handle=[nombredelbunker] execvm “bunkerscript”;
private["_i","_j","_text","_building","_nuevaposicion","_housePos","_patrullon","_allpositi
ons"];
{_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
Terremoto:
null=[[[BIS_Earthquake],"scripts\terremoto.sqf"],"BIS_fnc_execVM",true,false] spawn
BIS_fnc_MP;
[
_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;
};
};
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.
sleep 2;
100012 cutfadeout 1;
IEDS:
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:
_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:
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
{
handle=[POSITION avion1,POSITION
avion2,40,"NORMAL","uns_A7N_GBU",RESISTANCE] execvm "fn_ambientFlyby.sqf";
sleep 30;
};
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);
};
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;
mortero1 setVehicleAmmoDef 1;
sleep (25 + random 45); //--- restraso en un bombardeo y otro
};
_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.
/////////////////////////////////////////////////////////////////
// Function file for Armed Assault
// Created by: TODO: DPD
//////////////////////////////////////////////////////////////////
if (isserver ) then {
_puntos=[posicion1,posicion2,posicion3,posicion4,posicion5];
// 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
};
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:
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.
{
_x addeventhandler ["Killed", {_thisexecVM"SCRIPTS_DPD\RemoveDead.sqf"}];
}
forEach (allUnits select {side _x isEqualTo EAST});
//////////////////////////////////////////////////////////////////
// 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.
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{
private ["_unit","_nearEnemies1"];
_unit = _this select 0;
_unit sideChat "ENTRADO EN SCRIPT";
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
{
} 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
_bPoss = [];
{
_i = 0;
while { ((_x buildingPos _i) select 0) != 0 } do {
_bPoss set [count (_bPoss), (_x buildingPos _i)];
_i = _i + 1;
};
}forEach _buildings;
#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.
///////////////////////////// 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";
/////////////////////////////
///////////////////////////////se crea una camara llmada _c sobre el objeto llamado camara2, en mi caso
camara2 es el helicoptero que cae ///////////////////////////////
showcinemaborder True;
//scene 1// se enfoca sobre el objeto camara2
_c camSetTarget camara2;
_c camSetRelPos [0,-7,10];
_c camCommit 0;
sleep 2;
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";
/////////////////////////////////////////
_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 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";
};
¿ 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
/********************************************************** PARAMETROS
******************************************************/
Colum_revive_JIPTelep = if (count _this > 0) then {_this select 0} else {true};
/
********************************************************************************
*********************************************************/
//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
************************************************************************/
//
/
********************************************************************************
***************************************************************/
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;};
};
};
};
Colum_Revive_Keypressedcode={
Private["_target","_Escuadra","_Lider","_tmpos","_tmposALT","_tmposX","_tmposY","_tm
posZ"];
_dikCode = _this select 1;
//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"];
};