Manual CreateAll.sqf por Raven

19
CreateAll.sqf v1.01 (Armed Assault) (Por RAVEN) Es una función diseñada para generar grupos de unidades de combate posteriormente al inicio de una partida SP o MP. Así como se lee, se podría pensar que es otra más de las tantas que hay disponibles. Sí !, es otra más, pero no “como” las demás. La diferencia es que CreateAll, concentra en la misma llamada a la función, la capacidad para crear grupos con las siguientes características: - De cualquier bando - En cualquier lugar, - Con cualquier morfología (infantería, blindados, camiones, helicópteros, etc.) o combinación de ellos. - Con cantidad de tripulantes definida o con ninguna (vehículos vacíos), o con la máxima que el vehiculo soporte, sin que nos interese saber cuántos son. - Con el tipo de unidades oficiales (BIS) o creadas por terceros (mod.) - Definiendo un nombre particular para el grupo o no. - Con el estado de combate que deseemos (safe, aware, combat, etc.). - Usando la distribución que deseemos en la formación (fila, Columna, Ve, etc.). - Con un tipo de velocidad específica. - Con una ruta de “Way Points” determinado previamente. - Con la posibilidad de desencadenar otras acciones (vía funciones o scripts de terceros). Esto se logra pasando a la función, una serie de parámetros que afectarán a su comportamiento drásticamente: Una llamada típica a CreateAll tiene éste formato: _handler = [Bando, origen, TipoUnidades, CantUnidades, Skill/CantVehiculos, ArrayUnidades, NombreGrupo", EstadoGrupo, TipoFormacion, Velocidadgrupo, ArrayWPs] spawn handCreateAll; Antes de explicar en detalle cada parámetro, es necesario aclarar tres cosas. 1) CreateAll, como toda función debe ser pre-compilada para ejecutarla en una partida. La forma de hacerlo es utilizar el comando COMPILE en el init.sqf y sólo después de hacerlo, podemos ejecutarla en la partida: handCreateAll = compile preprocessFile "CreateAll.sqf";

description

Manual en castellano sobre la utilizacion del script para la creacion de cualquier unidad ingame. Creado: Raven Probado: Bhelma

Transcript of Manual CreateAll.sqf por Raven

Page 1: Manual CreateAll.sqf por Raven

CreateAll.sqf v1.01 (Armed Assault) (Por RAVEN)

Es una función diseñada para generar grupos de unidades de combate posteriormente al

inicio de una partida SP o MP.

Así como se lee, se podría pensar que es otra más de las tantas que hay disponibles.

Sí !, es otra más, pero no “como” las demás.

La diferencia es que CreateAll, concentra en la misma llamada a la función, la

capacidad para crear grupos con las siguientes características:

- De cualquier bando

- En cualquier lugar,

- Con cualquier morfología (infantería, blindados, camiones, helicópteros, etc.) o

combinación de ellos.

- Con cantidad de tripulantes definida o con ninguna (vehículos vacíos), o con la

máxima que el vehiculo soporte, sin que nos interese saber cuántos son.

- Con el tipo de unidades oficiales (BIS) o creadas por terceros (mod.)

- Definiendo un nombre particular para el grupo o no.

- Con el estado de combate que deseemos (safe, aware, combat, etc.).

- Usando la distribución que deseemos en la formación (fila, Columna, Ve, etc.).

- Con un tipo de velocidad específica.

- Con una ruta de “Way Points” determinado previamente.

- Con la posibilidad de desencadenar otras acciones (vía funciones o scripts de

terceros).

Esto se logra pasando a la función, una serie de parámetros que afectarán a su

comportamiento drásticamente:

Una llamada típica a CreateAll tiene éste formato: _handler = [Bando, origen, TipoUnidades, CantUnidades, Skill/CantVehiculos, ArrayUnidades, NombreGrupo", E stadoGrupo, TipoFormacion, Velocidadgrupo, ArrayWPs] spawn handCreateAll;

Antes de explicar en detalle cada parámetro, es necesario aclarar tres cosas.

1) CreateAll, como toda función debe ser pre-compilada para ejecutarla en una partida.

La forma de hacerlo es utilizar el comando COMPILE en el init.sqf y sólo después de

hacerlo, podemos ejecutarla en la partida:

handCreateAll = compile preprocessFile "CreateAll.sqf";

Page 2: Manual CreateAll.sqf por Raven

2) Luego de compilar la función y ANTES de comenzar a crear grupos de unidades, es

necesario establecer la relación entre los diferentes bandos que tomarán parte en la

misión.

Esto no es otra cosa que indicar a CreateAll cuales son los bandos “amigos” y

cuales los “enemigos”. La forma de hacerlo es con una llamada a la función con una

estructura especial de parámetros: _handler = ["setsides",[ west , resistance ],[ east ]] spawn handCreateAll;

Esto nos da la capacidad para establecer alianzas “poco comunes” a lo que

estamos acostumbrados, pudiendo poner a bandos que son enemigos naturales en el

simulador, como aliados (Oeste y Este) y pudiendo establecer como sus enemigos a

resistencia o incluso al bando civil.

Tal es la flexibilidad, que podemos darnos el lujo de llevar más allá las cosas y

colocar a unidades civiles distribuidas entre bandos enemigos e incluso hacer que todos

los bandos sean enemigos entre sí, obteniendo una partida de 4 bandos oponiendo sus

fuerzas al mismo tiempo.

El primer parámetro (setsides) debe ser del tipo carácter y los 2 siguientes serán

vectores que contendrán los nombres de los bandos (sin comillas). Un vector para los

amigos y otro para los enemigos.

Si deseamos tener más de 2 bandos antagónicos, solo debemos repetir el

establecimiento de las relaciones con los nuevos bandos.

_handler = ["setsides",[ west ],[ east ]] spawn handCreateAll; _handler = ["setsides",[ resistance ],[ east ]] spawn handCreateAll; _handler = ["setsides",[ resistance ],[ west ]] spawn handCreateAll; _handler = ["setsides",[ east ],[ west ]] spawn handCreateAll; _handler = ["setsides",[ civilian, west ],[ resistance, east ]] spawn handCreateAll;

(La version anterior de CreateAll (v1.0) asumía que todos los bandos eran enemigos

entre sí.)

3) CreateAll utiliza, para la creación de las objetos, los nombres de los “tipos de

unidades”, desde un array de nombres que puede ser especificado en 2 sitios:

a) Antes de la llamada a la función en el mismo INIT.SQS

unidadesE = ["TeamLeaderE","SoldierEB","SoldierEB","SoldierE B"];

b) O en la llamada misma y en forma explícita.

_handler = [Bando, origen, TipoUnidades, CantUnidades, Skill/CantVehiculos, ["TeamLeaderE","SoldierEB"] , NombreGrupo", EstadoGrupo, TipoFormacion, Velocidadgrupo, ArrayWP s] spawn handCreateAll;

Page 3: Manual CreateAll.sqf por Raven

Especificaciones de parámetros

BANDO Puede ser: WEST, EAST, RESISTANCE, CIVILIAN . (Debe indicarse SIN COMILLAS )

ORIGEN Habitualmente, corresponde al nombre de una unidad utilizada como referencia de posición. Lo más común es utilizar un a Unidad Lógica (UL), pero también puede indicarse un array conteni endo las coordenadas de posición del lugar donde se colocará inicialmente, al grupo o vehiculo creado. Los valores pueden indicarse como: Position base ULbase [1500.25,8052,1,0]

TIPO DE UNIDADES Este parámetro es sensiblemente diferente a los dem ás ya que puede ser una cadena (STRING) indicando un tipo de unidad (ho mbre o vehiculo) o un array de tipo de vehiculos y cantidad de tripula ntes por cada uno. Para que se entienda mejor, veamos éstos ejemplos d e valores que puede contener: “UAZMG” (Uaz armado) “BMP2ambul” (BMP ambulancia) “SearchLight” (Reflector) “MI17_MG” (Helicóptero armado) “HMMWV50” (Vehiculo ligero) “AV8B2” (Avion) Estos tipos de unidades/vehiculos indican la clase a crear, pero existe un tipo de unidad especial: “MAN” Dicho tipo, le indica a CreateAll que se debe gener ar un grupo de infantería. Los tipos de soldados que conformarán e l grupo se explican posteriormente. Anteriormente, expliqué que existe una variante es pecial de éste parámetro y que tiene la forma de un array de vehíc ulos: [[" UAZMG",2],[" ural ",3+ random (8)],["bus_city",-1]]

Page 4: Manual CreateAll.sqf por Raven

Esta variante nos permite crear instantáneamente, un grupo armado conteniendo un Uaz artillado, seguido por un Ural y un bus. Si observan con atención, éste array de vehículos, tiene como elementos a varios subarrays donde se especifica el tipo de vehiculo a generar acompañado por un numero que representa la cantidad de tripulantes que el vehiculo llevará. En el ejemplo de arriba, el Uaz llevará 2 soldados (aunque la variante artillada puede transportar a 3), el Ural llevará una cantidad que tendrá un mínimo de 3 soldados y un an exo de hasta 7 soldados (la función RANDOM nunca alcanza el valor máximo), lo que haría un máximo teórico de 10 soldados. Finalmente, el convoy lleva –para cerrar la formaci ón-, un bus con su capacidad completa (13 soldados). Esto se logra pas ando como cantidad un valor negativo. CreateAll contará cuál es la cap acidad máxima del vehiculo y generará a los tripulantes exactos para completarlo.

Si indicáramos una cantidad mayor a la que puede tr ansportar el vehiculo (Ejemplo: 8 soldados para un Uaz artillado ), solo 3 subirían al mismo y el resto lo seguiría a pie. Esto es part icularmente útil en operaciones donde se requiere asistencia de vehícul os a las patrullas de infantería a pie. En éste punto es importante aclarar que la priorid ad en el orden de creación de unidades, es:

- Conductor - Artillero - Comandante - Área de carga. Esto significa que si ordenamos generar un T72 (que tiene capacidad para 3 ocupantes) y le indicamos un máximo de 2 tri pulantes, los puestos ocupados serán el de conductor y artillero respectivamente y el vehiculo no dispondrá de comandante. Siguiendo con éste parámetro, si indicamos una cant idad de 0 (cero)

tripulantes, obviamente se crearán vehículos vacíos . Al crear un grupo de vehículos, los mismos se gen eran encolumnados (no en formación de columna ya que la formación se indica con otro parámetro), y con una separación en metros con respecto al vehiculo anterior que depende del tipo de vehiculo creado.

Page 5: Manual CreateAll.sqf por Raven

- Clase CAR: 10 metros. - Clase TRUCK: 15 metros. - Clase TANK: 15 metros. - Clase HELICOPTER: 20 metros. - Clase PLANE: 30 metros.

Si las coordenadas de posición de origen en la crea ción fueron

indicadas por el nombre de un objeto o Unidad Lógic a (UL), la columna de vehículos creada conservará la dirección del mis mo objeto.

Esto es muy útil en circunstancias donde se necesit a una orientación exacta de los objetos creados como por ejemplo, en una pista auxiliar de un aeropuerto (si creamos aviones o helicópteros) o en una calle interior de un poblado o ciudad, si lo que tratamos de crear es un grupo de vehículos civiles estacionados .

Hasta ahora hemos explicado los primeros 3 parámetr os. Estos son los mínimos necesarios, para crear un vehiculo vací o. _handler = [ east , ORIGEN, " URAL"] spawn handCreateAll;

Con esto creamos un solo camión (ural) del bando és te y en la posición del objeto ORIGEN (una UL). Pero si quisiéramos crear un grupo de 5 camiones v acíos, necesitaríamos algunos parámetros más.

Page 6: Manual CreateAll.sqf por Raven

CANTIDAD DE UNIDADES EN GRUPO CANTIDAD DE TRIPULANTES El cuarto parámetro adquiere importancia dependiend o de los parámetros anteriores. Normalmente, indica la cantidad de sold ados a crear si hemos señalado previamente que crearemos un grupo d e infantería (tercer parámetro igual a “MAN”): _handler = [ East , ORIGEN, "MAN", 12,……] spawn handCreateAll;

Pero también puede especificar la cantidad de tripu lantes de un vehiculo si previamente señalamos la creación de un vehiculo único.

_handler = [ east , ORIGEN, "RHS_MI24D", 2,……] spawn handCreateAll;

CANTIDAD DE VEHICULOS/SKILL DE GRUPO El quinto parámetro se refiere a la cantidad de veh ículos a crear, si especificamos un tipo de vehiculo como tercer parám etro: _handler = [ east , ORIGEN, "BMP", 0, 3,……] spawn handCreateAll; Pero también, indica el nivel de pericia de cada so ldado del grupo de infantería a crear, si especificamos el tipo “MAN” en el tercer parámetro: _handler = [ east , ORIGEN, "MAN", 12, 0.5,……] spawn handCreateAll; Cuando indicamos el skill de un grupo, cada miembr o adquiere el mismo, excepto el líder del grupo que adquiere un s kill superior al 50% del informado (en el ejemplo es de 75% y el res to de 50%)

Page 7: Manual CreateAll.sqf por Raven

ORIENTACION DE VEHICULOS TIPO DE UNIDADES DE GRUPO El sexto parámetro se refiere a la dirección angula r del vehiculo o grupo de vehículos, creado si el mismo está vacío. _handler = [ east , ORIGEN, " KA50", 0, 4, 75,……] spawn handCreateAll; En éste ejemplo, se crean 4 helicópteros del tipo K AMOV-50 con una orientación de 75 grados más que la dirección que p osee la unidad de ORIGEN.

Para aclarar, si ORIGEN tiene una dirección de 0 (c ero) grados, los helicópteros aparecerían encolumnados con una d irección de 0 (cero) grados, pero cada helicóptero estaría orient ado 45 grados a la derecha (0+45 = 45 grados). Obviamente, con un valo r negativo aparecerían orientados hacia la izquierda (0-45 = 3 15 grados). Este parámetro (el sexto) también sirve para indic ar a CreateAll los nombres de los tipos de unidades que se usarán para crear a los soldados de un grupo de infantería o tripulación de vehículos, cuando se informa la creación de vehículos con tripulación (no vacíos). _handler = [ East , ORIGEN, "MAN", 3+ random (7), 0.5, unidadesE,……] spawn handCreateAll; Es imperativo que dicho array de nombres deba decl ararse antes de lanzar la ejecución de CreateAll: Ejemplo: unidadesE = ["TeamLeaderE","SoldierEB","SoldierEB","SoldierE B"]; El array se define en una variable del tipo “globa l” para permitir su empleo desde otras funciones como expli caré más adelante. Cuando se indica la creación de un grupo que estar á formado por una cantidad de soldados mayor a la cantidad de uni dades indicadas en el array, se reiniciará la creación desde el princi pio de la lista de nombres con la única excepción que se omitirá utili zar el primer nombre o elemento del array que habitualmente se co rresponde con el nombre del tipo de unidad líder de grupo. De ésta f orma nos aseguramos que solo habrá un único líder y con un modelo de ob jeto (archivo p3d). El método de asignación de nombres otorga ventajas importantes al momento de reconfigurar una partida para utiliza r unidades de un tipo diferente a las originales y así, con muy poco tiempo podemos aprovechar el trabajo realizado por terceros (otros mods), solo cambiando los nombres de unidades en el array. Como ésa, tarea puede no parecerles fácil, les rec omiendo que en el mapa de la partida, coloquen un grupo de unidade s del bando que será enemigo de los jugadores y le asignen un nombr e específico (Ejemplo: GrpMalo), y en el campo de inicio de su l íder coloquen: GrpMalo = group this

Page 8: Manual CreateAll.sqf por Raven

Luego ejecutan en el INIT.SQF: if ( not isServer) exitWith {}; unidadesE = []; {unidadesE = unidadesE + [ typeOf _x ]; deletevehicle _x } foreach ( units grpmalo); Desde allí, poseen el array (unidadesE) cargado co n los nombres de los tipos de unidades que CreateAll utilizará pa ra la creación. Los miembros del grupo creado en el editor son eliminad os luego de “leerlos” porque no se necesitarán.

NOMBRE DEL GRUPO CREADO Ahora que tenemos un grupo de infantería desplegado en el terreno, sería estupendo asignarle un nombre que pudiéramos invocar desde fuera de la función para que otras funciones, scripts o g atillos los aprovechen. Supongamos que creamos un grupo y le damos la orde n de moverse sobre un poblado. Necesitaríamos alguna forma de ub icar la posición del grupo cuando es atacado para mandar refuerzos. Pero si desconocemos como se llama el grupo, entonces estam os atorados. _handler = [ East , ORIGEN, "Man", 8, 0.5, unidadesE, "GrpEste40",……. ] spawn handCreateAll; El séptimo parámetro es quien le indica –si no es una cadena vacía-, el nombre del grupo. En el ejemplo, el grup o se llama GrpEste40. Ahora podemos ejecutar un script o funci ón que mande a otro grupo (GrpEste27) a la posición del anterior. ( leader GrpEste27) move ( position ( leader GrpEste40));

COMPORTAMIENTO INICIAL DE GRUPO Este parámetro (el octavo), indica la disposición i nicial, frente a la

acción, que tiene el grupo creado: "CARELESS", "SAFE", "AWARE",

"COMBAT" o "STEALTH". _handler = [ East , ORIGEN, "Man", 3+ random (7), 0.5, unidadesE, "GrpEste40", "aware",………] spawn handCreateAll;

TIPO DE FORMACION DE GRUPO El noveno parámetro, indica el tipo de formación ad optada por el grupo

de infantería: "COLUMN", "STAG COLUMN", "WEDGE", "ECH LEFT", "ECH

RIGHT", "DIAMOND", "VEE" , "FILE"o "LINE". _handler = [ East , ORIGEN, "Man", 3+ random (7), 0.5, unidadesE, "GrpEste", "aware", "diamond",…………] spawn handCreateAll;

Page 9: Manual CreateAll.sqf por Raven

MODO DE VELOCIDAD DEL GRUPO El décimo parámetro indica la velocidad asignada pa ra moverse en el

terreno: "LIMITED", "NORMAL" o "FULL". _handler = [ East , ORIGEN, "Man", 3+ random (7), 0.5, unidadesE, "GrpEste", "aware", "ve", "normal",………] spawn handCreateAll;

RUTA DE EVOLUCION DEL GRUPO El decimoprimer parámetro, es un array que contendr á los objetos (generalmente ULs) usados como referencia (CreateAl l no admite coordenadas de posición, -por ahora-), para que el grupo creado se mueva en el mapa. Habitualmente adquiere una forma similar a ésta: _ruta = [Pos1, Pos2, Pos3, true ]; En el ejemplo, se colocaron 3 Uls (Unidades Lógica s llamadas Pos1, Pos2 y Pos3) en el mapa y en lugares adonde e l grupo creado deberá dirigirse. Se alcanzarán en forma lineal, pr imero el grupo irá a las coordenadas de Pos1, luego a las coordenadas de Pos2 y finalmente a las de Pos3.

Como podemos ver en el ejemplo, existe un último e lemento en el array de ruta que no es un nombre de objeto sino un valor lógico (true). Al presentarse éste caso, se asume que el g rupo, luego de llegar a las coordenadas de posición del objeto lla mado Pos3, deberá REINICIAR la secuencia de traslados como si fuera l a primera vez. (desde Pos1 en éste caso).

Page 10: Manual CreateAll.sqf por Raven

Esto transforma a la ruta en cíclica, pudiendo est ablecer de ésta forma, rutas de patrulla en ciudades. Si lo qu e deseamos es una ruta no-cíclica, podemos incluir un valor lógico fa lso (false) al final o sencillamente no incluir ninguno y CreateAl l, detendrá al grupo en la posición de la ultima coordenada y la m antendrá hasta que las condiciones cambien. _ruta = [Pos1, Pos2, Pos3]; _ruta = [Pos1, Pos2, Pos3, false ]; Las rutas no-cíclicas, son útiles para forzar una convergencia de unidades sobre un punto particular para establec er asaltos a puntos defendidos. _handler = [ East , ORIGEN, "Man", 3+ random (7), 0.5, unidadesE, "GrpEste", "safe", "ve", "normal", _ruta ] spawn handCreateAll; O bien: _handler = [ East , ORIGEN, "Man", 3+ random (7), 0.5, unidadesE, "GrpEste", "safe", "ve", "normal", [Pos1, Pos2, Pos 3]] spawn handCreateAll;

RUTAS EXTENDIDAS Observando la estructura de conformación de una rut a de evolución de un grupo, vemos que es del tipo monótona. Vamos des de el punto 1 al 2. Desde el 2 al 3 y así sucesivamente. Si quisiéramos que el segundo punto de ruta coinci diera con la posición de un cruce de caminos o un poblado y que se explorara las inmediaciones para asegurarse la ausencia de fuerza s hostiles en las inmediaciones y entonces (y solo entonces), retomar la secuencia de

Page 11: Manual CreateAll.sqf por Raven

traslado para el siguiente punto, necesitaríamos IN TERRUMPIR dicha secuencia hasta que se cumplan las condiciones corr ectas. Eso significa, que el grupo debe saltar a una secu encia alterna de acciones, manteniendo la secuencia original en S TAND-BY. Eso se llama acción SINCRONICA (en sincronía, sincronizada o en fase). Esto podemos lograrlo colocando en la ruta de evol ución del grupo y detrás del objeto de referencia que coincid e con el poblado, a un elemento -que ya no es un objeto-, sino un subar ray conteniendo 2 elementos:

- El nombre de la función a la que se pasará el contr ol (y que ejecutará la acción alterna) (Ejemplo: “explorar.sq f”)

- Un valor lógico verdadero o falso (true/false) que le indica a CreateAll si debe detener su proceso y esperar a qu e la acción alterna finalice o no hacerlo y continuar simultáne amente.

Lo importante aquí es decidir a que tipo de proceso pertenece la acción que realizaremos. (SINCRONICA o ASINCRONICA) . Veamos, si nuestro grupo debe llegar a Pos2 y expl orar el poblado, deberíamos indicarlo de ésta forma: _ruta = [Pos1, Pos2, ["explorar.sqf", true ], Pos3, origen, true ];

Vemos que luego de alcanzar Pos2, se ejecutará el subproceso indicado por la función EXPLORAR.SQF. Dicha función es acompañada por un valor lógico verdadero (true), lo que le indica a CreateAll que debe esperar a que EXPLORAR.SQF termine. Entonces y solo entonces, CreateAll enviará al grupo a la posición indicada p or el objeto Pos3. Vemos también que al llegar a Pos3, se envía al gr upo a la posición ORIGEN (donde el grupo fue creado) y luego desde allí, es obligado a reiniciar la ruta, pasando a Pos1, Pos2 (donde nuevamente, se despliega la patrulla de exploración), a Pos3 y así sucesivamente (y eternamente) mientras no cambien las condiciones .

Page 12: Manual CreateAll.sqf por Raven

_ruta = [Pos1, Pos2, ["explorar.sqf", true ], Pos3, true ];

En éste ejemplo se omite pasar por ORIGEN (donde el grupo se creó) y se va desde Pos3 a Pos1. _ruta = [Pos1, Pos2, ["explorar.sqf", true ], Origen];

En éste ejemplo se efectúa un único ciclo de patrul la con revisión del pueblo en Pos2 y se bifurca a Origen ( omitiendo Pos3) y terminando allí para mantener posición (ruta no-cíc lica).

Debemos aclarar –antes de proseguir-, que cuando se pasa desde

CreateAll a un subproceso indicado en la ruta, se t ransfiere como UNICO parámetro al nuevo proceso, el nombre del grupo involucrado.

De ésta forma podemos, desde la nueva función-acció n, gestionar todo lo relacionado con las tareas del grupo en ése punto.

Sin ése parámetro transferido, todo sería imposible !. Volviendo al tema de la simultaneidad de acciones , debemos

asegurarnos que la función paralela (refuerzos.sqf) tenga una forma de terminar, (ya sea porque se explora el pueblo movié ndose a 2 o 3 locaciones dentro de él o porque el grupo ha sido n eutralizado (todos muertos), para luego abandonar la función (exitwith {}) o de lo contrario CreateAll se quedará eternamente esperand o por algo que no ocurrirá.

Por otra parte, si lo que queremos es una acción AS INCRONICA

(simultánea a CreateAll), como puede ser el caso de recibir refuerzos al grupo mientras éste se desplaza hacia una nueva posición, lo informamos de ésta forma:

_ruta = [Pos1, Pos2, ["refuerzos.sqf", false ], Pos3, true ];

Page 13: Manual CreateAll.sqf por Raven

Aquí colocamos un valor falso (false) junto con el nombre de la función (refuerzos.sqf), indicando de ésta forma, a CreateAll que debe llamar a la función alterna (refuerzos.sqf), pero n o debe esperar a que la misma termine y debe continuar con el siguie nte punto de ruta.

El ejemplo forzaría a refuerzos.sqf a mandar un con tingente de

hombres o vehículos a la posición del grupo de expl oración y unirse al mismo o lo que se nos ocurra hacer en dicha función .

Esta capacidad de llamar a subprocesos, permite enr iquecer

enormemente una partida que utilice a CreateAll ya que otros editores y creadores de scripts pueden con un mínimo de esfu erzo, ampliar, agregar o modificar los alcances de la partida, aum entando la jugabilidad solamente respetando el protocolo de re cibir como parámetro en su plug-in, el nombre del grupo a trat ar.

Los límites a ésta capacidad están dictadas por nue stra

imaginación. ………lo que realmente puede asustar.

Page 14: Manual CreateAll.sqf por Raven

CreateAll.sqf

// ************************************************ ******************************* // ** Script: CreateAll.sqf v1.01 // ** Descripcion: Creacion de unidades y vehicul os en forma dinámica // ************************************************ ******************************* // ** Autor: RAVEN // ** Site: www.ArmedAssault.com.ar // ** Forum: http://www.armedassault.com.ar /foros/index.php?showtopic=1902 // ************************************************ ******************************* if (not isServer) exitWith {}; private["_init"]; _init = false; if (isnil("RAV_CREATEALL_INIT")) then {RAV_CREATEAL L_INIT = false}; if ((count _this) == 0) exitWith {}; if (typename (_this select 0) == "STRING") then { if ((_this select 0) == "setsides") then { private["_friend","_enemy","_CualSide"]; if ((count _this) != 3) then { player globalchat "SetSides error or not defined "; } else { _friend = _this select 1; _enemy = _this select 2; if ((typename _friend != "ARRAY") or (typename _ enemy != "ARRAY")) then { player globalchat "Setsides error or not define d"; } else { for [{_CualSide = 0},{_CualSide < count _friend },{_CualSide = _CualSide + 1}] do { {(_friend select _CualSide) setfriend [_x, 1] } foreach _friend; {(_friend select _CualSide) setfriend [_x, -1] } foreach _enemy; }; for [{_CualSide = 0},{_CualSide < count _enemy} ,{_CualSide = _CualSide + 1}] do { {(_enemy select _CualSide) setfriend [_x, 1]} foreach _enemy; {(_enemy select _CualSide) setfriend [_x, -1]} foreach _friend; }; {nil = createCenter _x} foreach _friend; {nil = createCenter _x} foreach _enemy; }; }; _init = true; RAV_CREATEALL_INIT = true; }; }; if (_init) exitWith {}; waituntil {RAV_CREATEALL_INIT}; _Bando = _this select 0; //East, West, Resistance , Civilian _Origen = _this select 1; //Objeto, Posicion _Ident = _this select 2; //Man, Tank, Helicopter private["_bando","_Origen","_Ident","_CanCrew","_de streza","_TipCrew","_Modo","_Form","_enWP","_maxCrew", "_Ruta","_altura","_PosIni","_Vuela","_tip","_man" ,"_cual","_grupo","_esVeh","_elem","_IdGrp", "_veh","_lider","_puesto","_cualWP","_espera","_vi vos","_esAir","_alcance","_nomVeh","_ang","_direccion",

Page 15: Manual CreateAll.sqf por Raven

"_canform", "_demora","_esWP","_px","_py","_canParm","_accion", "_antWP","_vecVeh","_sep1","_sep2"]; if (typeName _Ident == "ARRAY") then { _vecVeh = _Ident; _canForm = count _vecVeh; _destreza= 1; //Nivel de pericia } else { if (_Ident == "MAN") then { _esVeh = false; _demora = 0; _CanCrew = _this select 3; //Numero de soldados/ Tripulacion _destreza= _this select 4; //Nivel de pericia de infanteria (lider +50%) _canForm = 1; _vecVeh = [[_Ident, _canCrew]]; } else { _esVeh = true; if (count _this == 3) then { _canCrew = 0, _canForm = 1; } else { _CanCrew = _this select 3; //Numero de soldados /Tripulacion _canForm = _this select 4; //Cantidad de vehicu los a generar }; _destreza= 1; //Nivel de pericia de infante ria (lider +50%) _vecVeh = []; for [{_i = 0},{_i <= _canForm},{_i = _i + 1}] do { _vecVeh = _vecVeh + [[_Ident, _canCrew]]; }; }; }; _IdGrp = ""; if (count _this > 3) then { _TipCrew = _this select 5; //["soldierW", "soldie rWB",....] if (count _this > 6) then { _IdGrp = _this select 6; //Nombre del grupo _modo = _this select 7; //"safe", "Combat", e tc / dirección Angular _Form = _this select 8; //"line", "column", e tc _Speed = _this select 9; //"limited", "normal" , "full" _Ruta = _this select 10; //[objeto/Posicion, objeto/Posicion,.....,true/false] }; }; _altura = 0; _PosIni = [0,0,0]; _Vuela = "FORM"; _alcance = 100; if (typeName _Origen == "OBJECT") then {_PosIni = p osition _Origen} else {_PosIni = _Origen}; _Cual = 0; _lider = false; _grupo = createGroup _bando; _px = _PosIni select 0; _py = _PosIni select 1; _sep1 = 0; _sep2 = 0; for [{_cualVeh = 0},{_cualVeh < _canForm},{_cualVeh = _cualVeh + 1}] do { _elem = _vecVeh select _cualVeh; _nomVeh = _elem select 0; _cancrew = _elem select 1;

Page 16: Manual CreateAll.sqf por Raven

if (count _elem > 1) then {_canCrewm = _elem selec t 1} else {_canCrew = 0};

if (_nomVeh == "MAN") then {_esVeh = false; _demor a = 0} else {_esVeh = true};

if (_nomVeh IsKindOF "AIR") then {_esAir = true} e lse {_esAir = false}; if (_esVeh) then { if (_canCrew != 0 and _esAir) then {_altura = 200 ; _Vuela = "FLY"; _alcance = 500}; if (_canCrew == 0 and count _this > 5) then {_ang = _tipCrew} else {_ang = 0}; _demora = 2; if ("CAR" counttype [_veh] > 0) then {_demora = 1 ; _sep2 = 10}; if ("TRUCK" counttype [_veh] > 0) then {_demora = 1; _sep2 = 15}; if ("TANK" counttype [_veh] > 0) then {_demora = 1; _sep2 = 15}; if ("HELICOPTER" counttype [_veh] > 0) then {_dem ora = 10; _sep2 = 20}; if ("PLANE" counttype [_veh] > 0) then {_demora = 1; _sep2 = 30}; _sep1 = _sep1 + _sep2; if (typeName _origen == "ARRAY") then {_direccion = 0} else {_direccion = direction _origen}; _px = (_PosIni select 0) + _sep1 * sin((_direccio n)+180); _py = (_PosIni select 1) + _sep1 * cos((_direccio n)+180); _veh = createVehicle [_nomVeh,[_px,_py,_Altura], [], 0, _Vuela]; if (typeName _Origen == "OBJECT") then {_veh setd ir (direction (_origen) + _ang)}; _maxCrew = 0; {_maxCrew = _maxCrew + (_veh emptypositions _x)} foreach ["driver","gunner","comander","cargo"]; if (_canCrew < 0) then {_canCrew = _maxCrew}; }; if (_canCrew > 0) then { for [{_i = 0},{_i < _canCrew},{_i = _i + 1}] do { if (_i >= count _tipCrew) then {_cual = 0} else {_cual = _i}; if (_Cual == 0 and _lider) then {_Cual = 1}; _tip = _tipCrew select _cual; _pos = [(_PosIni select 0) + 2 * _i,(_PosIni sel ect 1) + 2 * _i, 0]; _man = _grupo createUnit [_tip,_pos, [], 10, _fo rm]; _man setbehaviour _modo; _man setspeedmode _spee d; if (_i == 0) then { if (not _lider) then { _lider = true; _grupo selectleader _man; _unidad setRank "CORPORAL"; _man setSkill (_destreza * 1.5); } else {_man setRank "PRIVATE"; _man setSkill _de streza}; } else { _man setRank "PRIVATE"; _man setSkill _destreza ; }; if (_esVeh) then { _Puesto = 0; if (_veh emptypositions "commander" > 0) then { _puesto = 3}; if (_veh emptypositions "gunner" > 0) then { _puesto = 2}; if (_veh emptypositions "driver" > 0) then { _puesto = 1}; if (_esVeh) then { switch (_puesto) do { case 1: {_man moveinDriver _veh};

Page 17: Manual CreateAll.sqf por Raven

case 2: {_man moveingunner _veh}; case 3: {_man moveincommander _veh};

default {_man moveincargo _veh;};

}; }; }; sleep 0.01; }; if (_esVeh and _esAir) then { _px = ((position _veh) select 0) + 200 * sin(dir ection _veh); _py = ((position _veh) select 1) + 200 * cos(dir ection _veh); _veh move [_px, _py]; }; sleep _demora; }; }; //--- Removedor de unidades eliminadas if (not isnil("RAV_REMOVEDEAD")) then { { _x removeEventHandler ["killed", 0]; _x addeventhandler ["Killed", {_this execVM RAV_R EMOVEDEAD}]; if (_x != (vehicle _x)) then { (vehicle _x) addeventhandler ["Killed", {_this e xecVM RAV_REMOVEDEAD}]; {_x addeventhandler ["Killed", {_this execVM RAV _REMOVEDEAD}]} foreach (crew (vehicle _x)); }; } foreach units _Grupo; }; // Reasigna nombre de Grupo, si fue indicado sleep 1; if (_canCrew > 0) then { if (_IdGrp != "") then { _man = leader _grupo; call compile format ["%1 = group _man", _IdGrp]; }; }; _grupo setformation _form; units _grupo commandfollow (leader _grupo); _antWP = objnull; // Inicia Rutas de WP for [{_i = 0}, {_i < (count _Ruta)}, {_i = _i + 1}] do { if (count (units _grupo) > 0) then { _esWP = false; _cualWP = _Ruta select _i; switch (typeName _cualWP) do { case "BOOL": { if (_cualWP) then {_i = -1; _cualWP}; }; case "ARRAY": { _canParm = count _cualWP; if (_canParm > 0) then { _accion = _cualWP select 0; if (typeName _accion == "STRING") then { _handAccion = compile preprocessFile _accion; _handler = [_grupo] spawn _handAccion; if (_canParm > 1) then

Page 18: Manual CreateAll.sqf por Raven

{ _waitHandler = _cualWP select 1;

if (typeName _waithandler == "BOOL") then

{ if (_waithandler) then {waitUntil {scriptDone _handler}}; }; }; }; }; }; default {_esWP = true}; }; if (_esWP) then { (leader _grupo) move (position _cualWP); sleep 1; if (_x != (leader _grupo)) then {_x dofollow (le ader _grupo)} foreach (units _grupo); _espera = true; while {_espera} do { _vivos = 0; _enWp = true; {if (alive _x) then {_vivos = _vivos + 1}} fore ach (units _grupo); {if (_x distance _cualWP > _alcance) then {_enW P = false}} foreach (units _grupo); if (_vivos == 0 or _enWP) then { if (not isnull(_antWP)) then { if (_enWP) then {_espera = false}; } else {_espera = false}; }; sleep 1; }; _antWP = _cualWP; if (_vivos == 0) then {_i = count _Ruta}; }; } else {_i = count _Ruta}; };

//--------------------- Espero lo aprovechen ------ ---------------------------//

NOTA:

La función puede acoplar a cada unidad creada ingam e, con un manejador de eventos por muerte (EVENTHANDLER del t ipo “KILLED”) que bifurcará el control a una función externa (puede s er de otro programador) para gestionar el proceso de retiro de unidades eliminadas durante una partida (remoción de cuerpos ) o eliminación de vehiculos destruidos (a los que también se les asig na un eventhandler dentro de CreateAll).

Para lograr esto, CreateAll busca la existencia de una variable global de nombre particular (RAV_REMOVEDEAD). De ex istir dicha variable (usualmente creada en el init.sqs o init.s qf de una partida), su va lor contendrá el nombre de la funcion que Cre ateAll enlazará al eventhandler.

Page 19: Manual CreateAll.sqf por Raven

Ejemplo de init.sqf con asignación de removedor de unidades

eliminadas: //--- Función encargada de eliminar unidades destru idas en la partida RAV_REMOVEDEAD = "RemoveDead.sqf"; if (isServer or ( local player )) then { //--- Precompilacion del codigo de las funciones de soporte a la mision handCreateAll = compile preprocessFile "CreateAll.sqf"; //--- Establece las relaciones entre bandos (Amigos /Enemigos) para que pueda

trabajar CreateAll.sqf _handler = ["setsides",[ west , resistance ],[ east ]] spawn handCreateAll; //--- Arma vector de tipos de unidades para bando E STE a partir de grupo inicial

en mapa unidadesE = []; {unidadesE = unidadesE + [ typeOf _x ]; deletevehicle _x } foreach ( units grpmalo); //--- Arma vector de tipos de unidades para bando R ESISTENCIA a partir de grupo

inicial en mapa unidadesR = []; {unidadesR = unidadesR + [ typeOf _x ]; deletevehicle _x } foreach ( units grpbueno); _ruta = [Origen, Pos1, Pos2, true ]; _vehiculos = [[" UAZMG",2],[" uralOpen ",3+ random (8)],["bus_city",-1]]; _handler = [ east , ORIGEN, _vehiculos , 2, 5, unidadesE, "GrpEste", "aware",

"File", "limited", _ruta ] spawn handCreateAll; };