# SCRIPTING

Repositorio de Scripts

# Comandos de ejecución

### [call](https://community.bistudio.com/wiki/call)

- Ejecuta instrucciones en el stack actual
- Espera a que el código termine
- Es lo mismo que escribir el código en el mismo sitio pero permite separar el código en distintos ficheros

### [execVM](https://community.bistudio.com/wiki/execVM)

- Compila y añade un script .sqf a la cola del scheduler
- El script no se ejecuta inmediatamente

### [spawn](https://community.bistudio.com/wiki/spawn)

- Añade instrucciones a la cola del scheduler
- Las instrucciones no se ejecutan inmediatamente

[https://community.bistudio.com/wiki/Code\_Optimisation](https://community.bistudio.com/wiki/Code_Optimisation)

# Script "tormenta" particulas (Arena, nieve, etc...)

Script para simular partículas. Se puede generar tormentas de arena, nieve, etc... No afecta al rendimiento del server .

[dustStorm.sqf](https://wiki.squadalpha.es/attachments/45)

<table border="1" id="bkmrk-%2F%2F-variable-global-p" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 99.881%;"></col></colgroup><tbody><tr><td>// Variable global para controlar la tormenta (Inicia ACTIVADA al entrar)  
if (isNil "Mission\_Sandstorm\_Active") then {  
 Mission\_Sandstorm\_Active = true;  
};

  
// --- SERVIDOR: Control del clima global ---  
if (isServer) then {  
 \[\] spawn {  
 while {true} do {  
 waitUntil { Mission\_Sandstorm\_Active };  
   
 // Transición a clima de tormenta (Inmediato/Rápido al inicio)  
 0 setOvercast 0.25;   
 0 setRain 0;  
 0 setFog \[0.10, 0.01, 10\];  
 0 setGusts 0.8;  
 setWind \[15, 15, true\];  
 forceWeatherChange;

 waitUntil { !Mission\_Sandstorm\_Active };  
   
 // Restaurar clima despejado y DETENER EL VIENTO POR COMPLETO  
 0 setOvercast 0;  
 0 setFog 0;  
 0 setGusts 0;  
 setWind \[0, 0, true\]; // Fuerza viento en 0  
 forceWeatherChange;  
 };  
 };  
};

if (!hasInterface) exitWith {};

// --- CLIENTE: Control de efectos visuales y de sonido ---  
\[\] spawn {  
 scriptName "Dynamic\_Sandstorm\_Handler";

 while {true} do {  
 // Esperar a que la tormenta esté activa Y el jugador haya cargado completamente  
 waitUntil { Mission\_Sandstorm\_Active &amp;&amp; {!isNull player} &amp;&amp; {alive player} };

 // 1. Crear Corrección de Color  
 private \_ppColor = PPeffectCreate \["ColorCorrections", 1500\];  
 \_ppColor ppeffectEnable true;  
 \_ppColor ppeffectAdjust \[  
 1.20, 1.22, -0.03,  
 \[0.85, 0.60, 0.35, 0.025\],  
 \[0.85, 0.55, 0.28, 0.40\],  
 \[0.2, 0.12, 0.08, 0.0\]  
 \];  
 \_ppColor ppeffectCommit 1; // Transición rápida de 1s al entrar

 // 2. Crear Emisor de Partículas  
 private \_emitter = createVehicleLocal \["#particlesource", getPosATL player, \[\], 0, "NONE"\];  
 \_emitter setParticleParams \[  
 \["\\A3\\data\_f\\ParticleEffects\\Universal\\Universal", 16, 12, 8, 0\], "", "Billboard",  
 1, 8, \[0, 0, 0\], \[10, 10, 0\], 1, 1.275, 1, 0,   
 \[5, 15, 25\],   
 \[\[0.6, 0.45, 0.25, 0.05\], \[0.5, 0.4, 0.2, 0.12\], \[0.6, 0.45, 0.25, 0\]\],   
 \[1000\], 1, 0, "", "", player  
 \];  
 \_emitter setParticleRandom \[3, \[20, 20, 5\], \[5, 5, 2\], 0, 0.25, \[0, 0, 0, 0.05\], 0, 0\];  
 \_emitter setParticleCircle \[0, \[0, 0, 0\]\];  
 \_emitter setDropInterval 0.025;   
 \_emitter attachTo \[player, \[0, 0, 0\]\];

// 3. Bucle de Audio (Optimizado con minutos y control de fallos)  
 private \_audioScript = \[player\] spawn {  
 params \["\_targetPlayer"\];  
   
 while {Mission\_Sandstorm\_Active &amp;&amp; {alive \_targetPlayer}} do {  
 // Genera variaciones de volumen (0.07 a 0.09) y tono (0.9 a 1.1)  
 private \_volumen = 0.07 + (random 0.02);  
 private \_pitch = 0.90 + (random 0.20);  
   
 playSoundUI \["Sandstorm\_Wind", \_volumen, \_pitch\];   
   
 // Duración base de tu archivo de audio (ajusta esto si tu .ogg dura más o menos segundos)  
 private \_duracionAudio = 18;  
   
 // En lugar de un solo sleep largo que pueda congelar el hilo,   
 // dividimos la espera controlando que la tormenta siga activa  
 private \_tiempoPausa = if (random 100 &gt; 30) then {  
 // Pausa normal: entre 1.5 y 3.5 minutos (90 a 210 segundos)  
 90 + random 120;  
 } else {  
 // Calma chicha (silencio largo): entre 3.5 y 6 minutos (210 a 360 segundos)  
 210 + random 150;  
 };

 // Bucle interno de espera fraccionada para evitar bloqueos  
 private \_tiempoTranscurrido = 0;  
 while {\_tiempoTranscurrido &lt; \_tiempoPausa &amp;&amp; {Mission\_Sandstorm\_Active} &amp;&amp; {alive \_targetPlayer}} do {  
 sleep 5;  
 \_tiempoTranscurrido = \_tiempoTranscurrido + 5;  
 };  
 };  
 };

 // Esperar hasta que la tormenta se apague O el jugador muera  
 waitUntil { !Mission\_Sandstorm\_Active || {!alive player} };

 // 4. Limpieza de efectos  
 terminate \_audioScript;  
 deleteVehicle \_emitter;  
   
 // Transición de desvanecimiento para el filtro de pantalla  
 \_ppColor ppeffectAdjust \[1, 1, 0, \[0,0,0,0\], \[1,1,1,1\], \[0,0,0,0\]\];  
 \_ppColor ppeffectCommit 2;  
   
 sleep 2;  
 ppEffectDestroy \_ppColor;  
 };  
};

</td></tr></tbody></table>

\*\*\****ENTRADA GENERADA CON IA\***\*\*\*\*\**

# Script de Tormenta de Arena Dinámica

Este script añade una tormenta de arena inmersiva a tu misión, gestionando de forma independiente la carga del servidor (clima) y la de los clientes (efectos visuales y de sonido).

## 📂 ¿Cómo ponerlo en marcha? (Instalación rápida)

El código está optimizado para funcionar en un **único archivo**, ya que incluye comprobaciones internas (`isServer` y `hasInterface`) para saber qué ejecutar en cada máquina.

1. **Crea el archivo del script:**
    
    
    - En la carpeta scripts de la raíz de tu misión, crea un archivo de texto y nómbralo `tormenta.sqf`.
    - Pega todo el código proporcionado dentro de este archivo.
2. **Ejecuta el script al inicio de la misión:**
    
    
    - Abre o crea el archivo `init.sqf` en la carpeta de tu misión.
    - Añade la siguiente línea para llamar al script al arrancar:
    - <div _ngcontent-ng-c231169058="" class="code-block ng-tns-c231169058-20 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwj02fXYuPqWAxUAAAAAHQAAAAAQSg" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9iN2EyNzgwODQ5ZTczMDYxIiwiY183YzYyYmUxNmQxMGU4MmRlIixudWxsLCJyY181ZjhhNjA1NTc0MGE3NjM1IixudWxsLG51bGwsImVzIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c231169058="" class="formatted-code-block-internal-container ng-tns-c231169058-20"><div _ngcontent-ng-c231169058="" class="animated-opacity ng-tns-c231169058-20"><div _ngcontent-ng-c231169058="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c231169058-20 ng-star-inserted"><span class="ng-tns-c231169058-20">Fragmento de código</span><div _ngcontent-ng-c231169058="" class="buttons ng-tns-c231169058-20 ng-star-inserted"><button aria-label="Descargar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
        [] execVM "scripts\tormenta.sqf";
        
        ```
        
        <div _ngcontent-ng-c231169058="" class="code-block ng-tns-c231169058-20 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwj02fXYuPqWAxUAAAAAHQAAAAAQSg" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9iN2EyNzgwODQ5ZTczMDYxIiwiY183YzYyYmUxNmQxMGU4MmRlIixudWxsLCJyY181ZjhhNjA1NTc0MGE3NjM1IixudWxsLG51bGwsImVzIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c231169058="" class="formatted-code-block-internal-container ng-tns-c231169058-20"><div _ngcontent-ng-c231169058="" class="animated-opacity ng-tns-c231169058-20"></div></div></div>
3. **Requisito de Audio (Importante):**
    
    
    - <span data-path-to-node="5,2,1,0,0,0">El script intenta reproducir un sonido llamado `"Sandstorm_Wind"`</span><span data-path-to-node="5,2,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,0,0,2">. Necesitarás tener este archivo de audio (normalmente un `.ogg` de unos 18 segundos</span><span data-path-to-node="5,2,1,0,0,3"><sup class="superscript"></sup></span><span data-path-to-node="5,2,1,0,0,4">) definido en tu archivo `description.ext` bajo la clase `CfgSounds`.</span>
    - ```
        class CfgSounds
        {
            sounds[] = {};
            class Sandstorm_Wind
            {
                name = "Sandstorm_Wind";
                sound[] = {"sound\sandstorm.ogg", 10, 1.0}; // Volumen base y tono
                titles[] = {};
            };
        };
        
        ```

## ⚙️ Explicación del Código: ¿Qué hace cada parte?

El script se divide en tres bloques principales que se ejecutan simultáneamente en un mismo archivo:

- **Control de la Variable Global:**
    
    
    - <span data-path-to-node="9,0,1,0,0,0">Define la variable `Mission_Sandstorm_Active`</span><span data-path-to-node="9,0,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,0,1,0,0,2">.</span>
    - <span data-path-to-node="9,0,1,1,0,0">Por defecto, el script inicia con la tormenta **ACTIVADA** (`true`) al entrar a la misión</span><span data-path-to-node="9,0,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,0,1,1,0,2">.</span>
- **Control del Servidor (`isServer`):**
    
    
    - <span data-path-to-node="9,1,1,0,0,0">Se encarga de modificar el clima global para todos los jugadores</span><span data-path-to-node="9,1,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,1,1,0,0,2">.</span>
    - <span data-path-to-node="9,1,1,1,0,0">Cuando se activa, ajusta de forma rápida la nubosidad (0.25), elimina la lluvia, añade niebla espesa y aumenta las ráfagas y la fuerza del viento</span><span data-path-to-node="9,1,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,1,1,1,0,2">.</span>
    - <span data-path-to-node="9,1,1,2,0,0">Cuando se desactiva, restaura el clima despejado y detiene el viento por completo</span><span data-path-to-node="9,1,1,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,1,1,2,0,2">.</span>
- **Control del Cliente (`hasInterface`):**
    
    
    - <span data-path-to-node="9,2,1,0,0,0">Solo se ejecuta si el jugador tiene interfaz y ha cargado completamente (está vivo)</span><span data-path-to-node="9,2,1,0,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,2,1,0,0,2">.</span>
    - <span data-path-to-node="9,2,1,1,0,0">**Efectos Visuales:** Crea un filtro de corrección de color con tonos anaranjados/marrones y genera un emisor de partículas (`#particlesource`) atado al jugador para simular la arena volando</span><span data-path-to-node="9,2,1,1,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,2,1,1,0,2">.</span>
    - <span data-path-to-node="9,2,1,2,0,0">**Efectos de Sonido:** Ejecuta un bucle de audio que varía el volumen y el tono del sonido `"Sandstorm_Wind"`</span><span data-path-to-node="9,2,1,2,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,2,1,2,0,2">. Incluye un sistema de pausas dinámicas que alterna entre pausas normales (1.5 a 3.5 minutos) y momentos de "calma chicha" (3.5 a 6 minutos) para no saturar al jugador</span><span data-path-to-node="9,2,1,2,0,3"><sup class="superscript"></sup></span><span data-path-to-node="9,2,1,2,0,4">.</span>
    - <span data-path-to-node="9,2,1,3,0,0">**Limpieza:** Si el jugador muere o la tormenta se desactiva, el script elimina las partículas, detiene el bucle de sonido y desvanece el filtro de color suavemente durante 2 segundos</span><span data-path-to-node="9,2,1,3,0,1"><sup class="superscript"></sup></span><span data-path-to-node="9,2,1,3,0,2">.</span>

## 🎮 ¿Cómo encender y apagar la tormenta en medio de la partida?

Como la tormenta depende de una única variable global, puedes controlarla fácilmente desde un **Activador (Trigger)** en el editor, un script de Zeus, o al completar una tarea.

Si sigues los pasos tal y como están, el script arrancará al arrancar la partida.

- **Para apagar la tormenta:**
    
    <div _ngcontent-ng-c231169058="" class="code-block ng-tns-c231169058-21 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwj02fXYuPqWAxUAAAAAHQAAAAAQVQ" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9iN2EyNzgwODQ5ZTczMDYxIiwiY183YzYyYmUxNmQxMGU4MmRlIixudWxsLCJyY181ZjhhNjA1NTc0MGE3NjM1IixudWxsLG51bGwsImVzIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c231169058="" class="formatted-code-block-internal-container ng-tns-c231169058-21"><div _ngcontent-ng-c231169058="" class="animated-opacity ng-tns-c231169058-21"><div _ngcontent-ng-c231169058="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c231169058-21 ng-star-inserted"><span class="ng-tns-c231169058-21">Fragmento de código</span><div _ngcontent-ng-c231169058="" class="buttons ng-tns-c231169058-21 ng-star-inserted"><button aria-label="Descargar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    Mission_Sandstorm_Active = false; publicVariable "Mission_Sandstorm_Active";
    
    ```
    
    <div _ngcontent-ng-c231169058="" class="code-block ng-tns-c231169058-21 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwj02fXYuPqWAxUAAAAAHQAAAAAQVQ" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9iN2EyNzgwODQ5ZTczMDYxIiwiY183YzYyYmUxNmQxMGU4MmRlIixudWxsLCJyY181ZjhhNjA1NTc0MGE3NjM1IixudWxsLG51bGwsImVzIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c231169058="" class="formatted-code-block-internal-container ng-tns-c231169058-21"><div _ngcontent-ng-c231169058="" class="animated-opacity ng-tns-c231169058-21"></div></div></div>
- **Para volver a encenderla:**
    
    <div _ngcontent-ng-c231169058="" class="code-block ng-tns-c231169058-22 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwj02fXYuPqWAxUAAAAAHQAAAAAQVg" decode-data-ved="1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl9iN2EyNzgwODQ5ZTczMDYxIiwiY183YzYyYmUxNmQxMGU4MmRlIixudWxsLCJyY181ZjhhNjA1NTc0MGE3NjM1IixudWxsLG51bGwsImVzIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c231169058="" class="formatted-code-block-internal-container ng-tns-c231169058-22"><div _ngcontent-ng-c231169058="" class="animated-opacity ng-tns-c231169058-22"><div _ngcontent-ng-c231169058="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c231169058-22 ng-star-inserted"><span class="ng-tns-c231169058-22">Fragmento de código</span><div _ngcontent-ng-c231169058="" class="buttons ng-tns-c231169058-22 ng-star-inserted"><button aria-label="Descargar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
    Mission_Sandstorm_Active = true; publicVariable "Mission_Sandstorm_Active";
    ```
    
    ***NOTA:** El script esta hecho con los pocos conocimiento que tengo de programación, mucha IA y prueba y error. Posiblemente haya soluciones mejores. Lo que se ha comprobado es que funciona bien y no afecta aparentemente al servidor, que responde prácticamente igual con 20 jugadores, con el scripts y sin el.*