20 Avril 2024 à 16:29:40

Nouvelles:

Teamspeak 3 OFCRA
IP : ts.ofcra.org
Mot de passe : mineisbiggerthanyours
Discord: https://discord.gg/bWtGS7N


/!\ L'OFCRA RECRUTE /!\


Playsound3D

Démarré par Harine, 23 Novembre 2017 à 22:12:48

« précédent - suivant »

0 Membres et 1 Invité sur ce sujet

Harine

Salut les gars,
depuis Arma 2 et actuellement dans le cadre de la création d'une mission en PVP (mais ça peut servir surtout pour la COOP), je désire créer un simple script avec une base de donnée sonore (sous formats addon.pbo client/server), généré aléatoirement sur des positions diverses.
Concernant les addons de sons j'en ai trouvé pas mal (TPW SOAP entre autre qui est top et RUK_ASLque j'utilisais déjà pour la campagne EARTHQUAKE de diabeul, avec le script RUK_NIAC qui semble ne plus marcher sur A3).
Seulement ce ne sont que des base de données sonores , certes contenant une multitude de sons d'ambiance en tout genre et disponible via le menu d'option "Effet" dans les triggers, mais je voudrais les générer via un script.sqf qui utiliserait la nouvelle commande d'Arma3 "playsound3D" (qui est fantastique). Actuellement j'y arrive en utilisant ce script trouvé sur internet, et certainement recueilli via la campagne solo d'A3.


if (!isdedicated && hasInterface) then {

waitUntil {!isNull player};
waitUntil {player == player};
//hint format ["%1",count _this];
_source = _this select 0;//objective_pos_logic;// object/logic
_plays = true;
AmB_nosound = false;
_battle_radius = if (count _this >=1) then {(_this select 1)} else {350};
hint format ["Battle radius %1",_battle_radius];
while {_plays} do {
_center = createCenter sideLogic;
_group = createGroup _center;
_logic = _group createUnit ["LOGIC",(getPos _source) , [], 0, ""];
sleep (1 + random 7);
for "_s" from 1 to (1 + Ceil (random 2)) do {
[_logic,_source,_battle_radius] spawn {
for "_s" from 1 to (random 7 + random 56) do {
private ["_logic","_source","_radius","_allsounds"];
_logic = _this select 0;
_source = _this select 1;
_radius = if ((_this select 2) > 100) then {(_this select 2)/25} else {(_this select 2)};
_allsounds = [];
_logic setPos (_logic modelToWorld [random _radius - Random _radius,random _radius - Random _radius,random 1 - Random 2]);
private ["_sound","_sound1","_sound2","_maxtype"];
_sound1 = format ["A3\Sounds_F\ambient\battlefield\battlefield_explosions%1.wss",floor (random 4)+1];
_sound2 = format ["A3\Sounds_F\ambient\battlefield\battlefield_firefight%1.wss",floor (random 2)+2];
if (!(surfaceIsWater getPos _logic)) then {_allsounds pushBack _sound2;} else {AmB_nosound = true};
if (random 1 > .5 or (surfaceIsWater getPos _logic) or AmB_nosound) then {_allsounds pushBack _sound1;};
_vol = switch (true) do {
case (_logic distance player <= 250) : {.1};
case (_logic distance player > 250 and _logic distance player <= 500) : {.5};
case (_logic distance player > 500 and _logic distance player <= 800) : {1};
case (_logic distance player > 800 and _logic distance player <= 1000) : {1.5};
case (_logic distance player > 1000) : {2};
};
_maxtype = (count _allsounds);
_sound = _allsounds select (floor random _maxtype);
_pitch = if (_sound == _sound1) then {random .5 + .5} else {random .6 + .8};
_volumn = if (_sound == _sound1) then {_vol + 1 + random 3} else {_vol + .1 + random 2};
playsound3d [_sound,_logic,false,getPosasl _logic,_volumn,_pitch,0];
sleep (random 1 + random 14);
};
};//spawn
sleep (random 21 + random 21);
};
deleteVehicle _logic;
};

};


Que j'active en plaçant une logique de jeu avec comme init : o=[this,1000] execVM "Amb_battle.sqf";

1000 signifie le radius supposé du champ de bataille. Je pourrai me contenter de ceci qui est déjà très bien (loop de sons d'ambiance de champs de batailles vanilla par BIS), mais je voudrai vraiment rajouter ceux disponibles dans les deux mods cités précédemment, ça rajouterai un plus à ce que je recherche, à savoir travailler sur l'ambiance sonore d'une mission ce qui me semble être très important.

Donc si quelqu'un maitrise un peu les script et peut m'expliquer comment je pourrai rajouter des sons aux script posté ci dessus, ce serait top :) Attention il faut que ce script soit MP compatible cela va de soit (sons audible par tout et chacun en 3D) Merci !


Arthyc

Je pense qu'il est possible de le faire uniquement si les fichiers son des mods sont présent, donc soit en créant un mod custom avec juste les sons (qu'il faut retrouver et isoler) ou en intégrant les mods directements. Après il suffit de les appeler avec le script.

C'est une idée, j'ai pas regardé plus que ça mais si j'ai le temps je regarde.


Ruskoff

J'ai pas trop le temps actuellement mais déjà avoir tous les sons c'est un bon début


Harine

Oui c'est bien l'idée, les sons j'ai leur chemin d'accès mais j'arrive pas à les intégrer dans le script, je vais essayer de me pencher dessus mieux que ça


Harine

J'ai réussi c'était tout con j'ai juste merder au début je ne sais pas où et je m'y remets ce matin ça marche :

Citerif (!isdedicated && hasInterface) then {

   waitUntil {!isNull player};
   waitUntil {player == player};
   //hint format ["%1",count _this];
   _source = _this select 0;//objective_pos_logic;// object/logic      
   _plays = true;
   AmB_nosound = false;
   _battle_radius = if (count _this >=1) then {(_this select 1)} else {350};
   hint format ["Battle radius %1",_battle_radius];
   while {_plays} do {
      _center = createCenter sideLogic;
      _group = createGroup _center;
      _logic = _group createUnit ["LOGIC",(getPos _source) , [], 0, ""];   
      sleep (1 + random 7);
      for "_s" from 1 to (1 + Ceil (random 2)) do {
         [_logic,_source,_battle_radius] spawn {   
            for "_s" from 1 to (random 7 + random 56) do {
               private ["_logic","_source","_radius","_allsounds"];
               _logic = _this select 0;
               _source = _this select 1;
               _radius = if ((_this select 2) > 100) then {(_this select 2)/25} else {(_this select 2)};
               _allsounds = [];
               _logic setPos (_logic modelToWorld [random _radius - Random _radius,random _radius - Random _radius,random 1 - Random 2]);
               private ["_sound","_sound1","_sound2","_sound3","_sound4","_sound5","_sound6","_sound7","_maxtype"];
               _sound1 = format ["ruk_asl\Explosions\explosion_46.ogg",floor (random 4)+1];
               _sound2 = format ["ruk_asl\Gunfire\Gunfire_16.ogg",floor (random 2)+2];
               _sound3 = format ["ruk_asl\BulletCracks\bullet_crack_1.ogg",floor (random 1)+2];
               _sound4 = format ["ruk_asl\Gunfire\Gunfire_208.ogg",floor (random 1)+2];
               _sound5 = format ["ruk_asl\Gunfire\Gunfire_184.ogg",floor (random 1)+2];
               _sound6 = format ["A3\Sounds_F\ambient\battlefield\battlefield_explosions%1.wss",floor (random 4)+1];
               _sound7 = format ["A3\Sounds_F\ambient\battlefield\battlefield_firefight%1.wss",floor (random 2)+2];
               if (!(surfaceIsWater getPos _logic)) then {_allsounds pushBack _sound3,_sound4,_sound5,_sound6,_sound7;} else {AmB_nosound = true};
               if (random 1 > .5 or (surfaceIsWater getPos _logic) or AmB_nosound) then {_allsounds pushBack _sound1;};
               _vol = switch (true) do {
                  case (_logic distance player <= 250) : {.1};
                  case (_logic distance player > 250 and _logic distance player <= 500) : {.5};
                  case (_logic distance player > 500 and _logic distance player <= 800) : {1};
                  case (_logic distance player > 800 and _logic distance player <= 1000) : {1.5};
                  case (_logic distance player > 1000) : {2};
               };
               _maxtype = (count _allsounds);
               _sound = _allsounds select (floor random _maxtype);
               _pitch = if (_sound == _sound1) then {random .5 + .5} else {random .6 + .8};
               _volumn = if (_sound == _sound1) then {_vol + 1 + random 3} else {_vol + .1 + random 2};
               playsound3d [_sound,_logic,false,getPosasl _logic,_volumn,_pitch,0];
               sleep (random 1 + random 14);
            };
         };//spawn
         sleep (random 21 + random 21);
      };
      deleteVehicle _logic;
   };

};

Donc dépendant du mod RUK_ASL, dans le script il y'à actuellement 7 chemins de sons d'explosions, firefight, artillerie etc. généré aléatoirement. Je me limite à 7, mais il y'a des centaines de fichier .ogg dispo. A tester sur dédié mais fonctionne en local en tout cas.