Portail OFCRA

Actualités => Problèmes Techniques => Discussion démarrée par: Harine le 23 Novembre 2017 à 22:12:48

Titre: Playsound3D
Posté par: Harine le 23 Novembre 2017 à 22:12:48
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 (http://www.armaholic.com/page.php?id=22592) entre autre qui est top et RUK_ASL (http://www.armaholic.com/page.php?id=13458)que j'utilisais déjà pour la campagne EARTHQUAKE de diabeul, avec le script RUK_NIAC  (http://www.armaholic.com/page.php?id=13459)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 (https://community.bistudio.com/wiki/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 !
Titre: Re : Playsound3D
Posté par: Arthyc le 24 Novembre 2017 à 18:48:53
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.
Titre: Re : Playsound3D
Posté par: Ruskoff le 25 Novembre 2017 à 10:08:50
J'ai pas trop le temps actuellement mais déjà avoir tous les sons c'est un bon début
Titre: Re : Playsound3D
Posté par: Harine le 26 Novembre 2017 à 21:56:15
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
Titre: Re : Playsound3D
Posté par: Harine le 16 Décembre 2017 à 10:42:01
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 (http://www.armaholic.com/page.php?id=13458), 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.