Ir al contenido principal

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

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

// 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ónTransición a clima de tormenta (Inmediato/RápidoRá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éesté activa Y el jugador haya cargado completamente
        waitUntil { Mission_Sandstorm_Active && {!isNull player} && {alive player} };

        // 1. Crear CorrecciónCorrecció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ónTransición rápidarápida de 1s al entrar

        // 2. Crear Emisor de PartículasPartí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 && {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ónDuración base de tu archivo de audio (ajusta esto si tu .ogg dura másmá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 > 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 < _tiempoPausa && {Mission_Sandstorm_Active} && {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ónTransició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;
    };
};

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

Script de Tormenta de Arena DinámicaDinámica

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

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

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

  1. Crea el archivo del script:

    • En la carpeta scripts de la raízraíz de tu misión,misión, crea un archivo de texto y nómbralonómbralo tormenta.sqf.

    • Pega todo el códigocódigo proporcionado dentro de este archivo.

  2. Ejecuta el script al inicio de la misión:misión:

    • Abre o crea el archivo init.sqf en la carpeta de tu misión.misión.

    • AñadeAñade la siguiente línealínea para llamar al script al arrancar:

    •  

      Fragmento de códigocódigo
      [] execVM "scripts\tormenta.sqf";
      
  3. Requisito de Audio (Importante):

    • El script intenta reproducir un sonido llamado "Sandstorm_Wind". NecesitarásNecesitarás tener este archivo de audio (normalmente un .ogg de unos 18 segundos) definido en tu archivo description.ext bajo la clase CfgSounds.class CfgSounds
      {
          sounds[] = {};
          class Sandstorm_Wind
          {
              name = "Sandstorm_Wind";
              sound[] = {"sound\sandstorm.ogg", 10, 1.0}; // Volumen base y tono
              titles[] = {};
          };
      };

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

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

  • Control de la Variable Global:

    • Define la variable Mission_Sandstorm_Active.

    • Por defecto, el script inicia con la tormenta ACTIVADA (true) al entrar a la misiónmisión.

  • Control del Servidor (isServer):

    • Se encarga de modificar el clima global para todos los jugadores.

    • Cuando se activa, ajusta de forma rápidarápida la nubosidad (0.25), elimina la lluvia, añadeañade niebla espesa y aumenta las ráfagasráfagas y la fuerza del viento.

    • Cuando se desactiva, restaura el clima despejado y detiene el viento por completo.

  • Control del Cliente (hasInterface):

    • Solo se ejecuta si el jugador tiene interfaz y ha cargado completamente (estáestá vivo).

    • Efectos Visuales: Crea un filtro de correccióncorrección de color con tonos anaranjados/marrones y genera un emisor de partículaspartículas (#particlesource) atado al jugador para simular la arena volando.

    • Efectos de Sonido: Ejecuta un bucle de audio que varíavaría el volumen y el tono del sonido "Sandstorm_Wind". Incluye un sistema de pausas dinámicasdiná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.

    • Limpieza: Si el jugador muere o la tormenta se desactiva, el script elimina las partículas,partículas, detiene el bucle de sonido y desvanece el filtro de color suavemente durante 2 segundos.

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

Como la tormenta depende de una únicaúnica variable global, puedes controlarla fácilmentefá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,están, el script arrancaráarrancará al arrancar la partida.

  • Para apagar la tormenta:

    Fragmento de códigocódigo
    Mission_Sandstorm_Active = false; publicVariable "Mission_Sandstorm_Active";
    
  • Para volver a encenderla:

    Fragmento de códigocódigo
    Mission_Sandstorm_Active = true; publicVariable "Mission_Sandstorm_Active";

    NOTA: El script esta hecho con los pocos conocimiento que tengo de programación,programación, mucha IA y prueba y error. Posiblemente haya soluciones mejores. Lo que se ha comprobado es que funciona bien y no afecta aparentenmente al servidor, que responde practicamente igual con 20 jugadores, con el scripts y sin el