Dudas habituales de editores

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

}

};

Có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”,”_allpositions”];

_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”,”_ldrperseguido”,”_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”,”_tmposZ”];

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

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

717 total views, 2 views today

749total visits,2visits today