From bfc748fbbef1d9745c0a0d0cb35133a17b9b9c6f Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 17 Feb 2015 07:51:51 +0100 Subject: [PATCH] Added missionmodules. --- addons/missionmodules/$PBOPREFIX$ | 1 + addons/missionmodules/CfgEventHandlers.hpp | 6 + addons/missionmodules/CfgFactionClasses.hpp | 6 + addons/missionmodules/CfgVehicles.hpp | 68 ++++++++++ addons/missionmodules/XEH_preInit.sqf | 7 + addons/missionmodules/config.cpp | 17 +++ addons/missionmodules/data/moduleSound.paa | Bin 0 -> 5625 bytes .../functions/fnc_moduleAmbianceSound.sqf | 123 ++++++++++++++++++ .../functions/script_component.hpp | 1 + addons/missionmodules/script_component.hpp | 12 ++ 10 files changed, 241 insertions(+) create mode 100644 addons/missionmodules/$PBOPREFIX$ create mode 100644 addons/missionmodules/CfgEventHandlers.hpp create mode 100644 addons/missionmodules/CfgFactionClasses.hpp create mode 100644 addons/missionmodules/CfgVehicles.hpp create mode 100644 addons/missionmodules/XEH_preInit.sqf create mode 100644 addons/missionmodules/config.cpp create mode 100644 addons/missionmodules/data/moduleSound.paa create mode 100644 addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf create mode 100644 addons/missionmodules/functions/script_component.hpp create mode 100644 addons/missionmodules/script_component.hpp diff --git a/addons/missionmodules/$PBOPREFIX$ b/addons/missionmodules/$PBOPREFIX$ new file mode 100644 index 0000000000..ea1be0daee --- /dev/null +++ b/addons/missionmodules/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\missionModules \ No newline at end of file diff --git a/addons/missionmodules/CfgEventHandlers.hpp b/addons/missionmodules/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f0a9f14d91 --- /dev/null +++ b/addons/missionmodules/CfgEventHandlers.hpp @@ -0,0 +1,6 @@ + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/addons/missionmodules/CfgFactionClasses.hpp b/addons/missionmodules/CfgFactionClasses.hpp new file mode 100644 index 0000000000..792f4d31e3 --- /dev/null +++ b/addons/missionmodules/CfgFactionClasses.hpp @@ -0,0 +1,6 @@ +class CfgFactionClasses { + class NO_CATEGORY; + class ACE_missionModules: NO_CATEGORY { + displayName = "ACE Mission Modules"; + }; +}; \ No newline at end of file diff --git a/addons/missionmodules/CfgVehicles.hpp b/addons/missionmodules/CfgVehicles.hpp new file mode 100644 index 0000000000..afdb58006b --- /dev/null +++ b/addons/missionmodules/CfgVehicles.hpp @@ -0,0 +1,68 @@ +class CfgVehicles { + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits { + }; + }; + + // TODO make a curator variant for this + class ACE_moduleAmbianceSound: Module_F { + scope = 2; + displayName = "Ambiance Sounds [ACE]"; + icon = QUOTE(PATHTOF(data\moduleSound.paa)); + category = "ACE_missionModules"; + function = QUOTE(FUNC(moduleAmbianceSound); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "Glowbal"; + class Arguments { + class soundFiles { + displayName = "Sounds"; + description = "Classnames of the ambiance sounds played. Seperated by ','. "; + typeName = "STRING"; + defaultValue = ""; + }; + class minimalDistance { + displayName = "Minimal Distance"; + description = "Minimal Distance"; + typeName = "NUMBER"; + defaultValue = 400; + }; + class maximalDistance { + displayName = "Maximal Distance"; + description = "Maximal Distance"; + typeName = "NUMBER"; + defaultValue = 900; + }; + class minimalDelay { + displayName = "Minimal Delay"; + description = "Minimal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 10; + }; + class maximalDelay { + displayName = "Maximal Delay"; + description = "Maximal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 170; + }; + class followPlayers { + displayName = "Follow Players"; + description = "Follow players. If set to false, loop will play sounds only nearby logic position."; + typeName = "BOOL"; + defaultValue = 0; + }; + class soundVolume { + displayName = "Volume"; + description = "The volume of the sounds played"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = "Ambiance sounds loop (synced across MP)"; + sync[] = {}; + }; + }; +}; diff --git a/addons/missionmodules/XEH_preInit.sqf b/addons/missionmodules/XEH_preInit.sqf new file mode 100644 index 0000000000..cadbbabdd1 --- /dev/null +++ b/addons/missionmodules/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(moduleAmbianceSound); + +ADDON = true; diff --git a/addons/missionmodules/config.cpp b/addons/missionmodules/config.cpp new file mode 100644 index 0000000000..0867b486c6 --- /dev/null +++ b/addons/missionmodules/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"cse_moduleAmbianceSound"}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"Glowbal"}; + authorUrl = ""; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgFactionClasses.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/missionmodules/data/moduleSound.paa b/addons/missionmodules/data/moduleSound.paa new file mode 100644 index 0000000000000000000000000000000000000000..bfe3b8032717dcc98269b4b42a620cffe550ffc2 GIT binary patch literal 5625 zcmd5=e{2)i9e)QtpfrHPa-m>_7$qGojBP2JHAXidD=lKvOSnciRHiZp3io($CfVu3Ih4Y{*BB>0gjI}tEY4lCyKj^3 zi|MspB)_I9Qgx5++xQ+GAF#}rEAi6)SgR2uT;uV0M$+GvaQ(#H9}xS?WmyKjWzk^2 zNzcQW;MZidnf$!>++Lhj?%eeIpGtziBC+buc2ZUhGN$7o{p|Y_&10xliB==phYGcr8`S2cb3wu zSJO0FbEhH0o>*@a^2330*Os!%?HPIs=*>Ht3JmIghu|*BN=Fax<2*v*2zg37n~I_l zvuOp1~efUHq1t$YIb<=rbwS zTrcQpUhjzXYHsxVyH5nfdE>YxM~e3~1{1=bAg7M@d>{Fz$PcEznj%j-Sr-`;E@UQk zQ%W=8le|+&`CYHlo@`?-%h+-aPK=XB!7Q0@uvl zk~H~J)3;+sOn<@gdX~1F2=F@pO`4Y=pKA{{ih0US7~4l2ZHeSrF3!i~kXHre!}Y@c zP~XdDtCPF%p;?fZ%~k(hpV7__KYu$I&W)uH29ukQ!Cc^o8gi!2->3UUe9E%THmf0Q zTsUN8<7HeGl+Vt~a$AbuYUH0o|BNJeHbGk-Z{+Ere3Dmnv_1+KqTMjB=U(a$b{;-6 zzc4iZ3Di4N{_5i{f3GXhO~_`GW%kmP#F*J;J)-sFmSP?uO!IU;(7&&hr;0QC@2ovz z3-%y>l5ihkZ6=ksK>1eVIAM@i^LD}cUF(EDfV@(07E3F~Wc@c6Pf23lh`?V>iWc4M z`dp0j&)*$#tfK$P|G#y0L*l&qaS?wMfyF&b{MX`O{fI8!$wXwry{egRWm$pFp z{y>`MA)mBh5Aqkkb=l&hj--Fhjd&oPi5~=z^p(|AlqMfu%Gp?i68y-kT`Dz1+<3b z<$c9;CtdTx;i6ck|MGfA>_>9#Q+h5Q7_jV*@=E>2Esi71(4W)NRDZ#3xHI;cHA?@; z<(G?d&v#ynUfUZd{#1V?*3m-&#@%$Iy`|^e#>Hkc9?+hA!G5{)M~i2jYll6|dd$$D zR)0X8Be1{8Upe@-w3`5=Q9-=?2KtXFp9)OTGQSFkA2Lj=c}(p3w}oZ4G=ctW9oi4< zr*2R=xTFyP!>q?9KaP56@|$%on7G*D6aK=`UyoLwyIp@@cmGg)E1Kr+;jL-cv!*;u z)@FA=&{SZHDJ_#uoFU1F>~(_jCm+&BtmntyvDT}g$DiA1>Bl@;UiY3!nfQUa_gvq* zwb%dKekXIHkY=R<$fjcYGlSh9iZ&KyjMBcs8aBK9SId5$Z9^J1hwG!^7Z8h7Chc~y zzRAF|A*~;Z!VEp4O~Z+c&YynMaN;8TU{bH0yK>v3G(%zjHqY*)0JwO9CW)BVG zJ*YDB^0;y9tW`GfULspIGVAAGN0_?S3436ZaxYoN8IUw|Rqu_G7u7KTl-MPM?0gOc`ug7=QW2VESaxEQ|DzF~Gcf`Ss=k z!5@80$+70ue>^-^&<8!+w(EE;@MgU@FXFFWrn38tNE@g!N=@f3^qiN9Y5(x27AJTU z=ZAa#5twV0X_O^x28Z$A&pS=)$^KtzKk;MPDzj+fwB>Q#-`x>urFlHnvF~!UO>diN z1yv&Jpc(olz3l-5or{nk44&+4GA;!F4$kl&=$B9LESij$36p&hUd;VmNUJ6YMgF6JLbOVk`ZbHcCR84R!G;@r-_u zAOuge55r}#NM0sQs>9M`hMq}%DBkSUY)Wi(n$)N*vDA>Kx9MZQ8d)rk1;xlSy{&nF z{&N3bnupD7Ptbb2a4^?R|X+6c1 zGkO0 + * 1: Units + * 2: Activated + * + * Return Value: + * Nothing + * + * Example: + * N/A + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; +_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +_units = [_this,1,[],[[]]] call BIS_fnc_param; +_activated = [_this,2,true,[true]] call BIS_fnc_param; + +// We only play this on the locality of the logic, since the sounds are broadcasted across the network +if (_activated && local _logic) then { + _ambianceSounds = []; + _unparsedSounds = _logic getvariable ["soundFiles", ""]; + _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; + _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; + _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; + _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; + _volume = (_logic getvariable ["soundVolume", 30]) max 1; + _followPlayers = _logic getvariable ["followPlayers", false]; + + _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; + + _nilCheckPassedList = ""; + { + _x = [_x] call EFUNC(common,removeWhiteSpace); + _splittedList set [_foreachIndex, _x]; + }foreach _splittedList; + + _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; + { + if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); + } else { + if (isclass (configFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); + }; + }; + }foreach _splittedList; + + if (count _ambianceSounds == 0) exitwith {}; + { + if !([".", _x, true] call BIS_fnc_inString) then { + _ambianceSounds set [_foreachIndex, _x + ".wss"]; + }; + }foreach _ambianceSounds; + + [{ + private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] + _args = _this select 0; + _logic = _args select 0; + _lastTimePlayed = _args select 8; + + if (!alive _logic) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + _ambianceSounds = _args select 1; + _minimalDistance = _args select 2; + _maximalDistance = _args select 3; + _minDelayBetweensounds = _args select 4; + _maxDelayBetweenSounds = _args select 5; + _volume = _args select 6; + _followPlayers = _args select 7; + + // Find all players in session. + _allUnits = if (isMultiplayer) then {playableUnits} else {[ACE_player]}; + + // Check if there are enough players to even start playing this sound. + if (count _allUnits > 0) then { + + // Select a target unit at random. + _targetUnit = _allUnits select (round(random((count _allUnits)-1))); + + // find the position from which we are going to play this sound from. + _newPos = (getPos _targetUnit); + if (!_followPlayers) then { + _newPos = getPos _logic; + }; + + // Randomize this position. + if (random(1) >= 0.5) then { + if (random(1) >= 0.5) then { + _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; + }; + } else { + if (random(1) >= 0.5) then { + _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; + }; + }; + + // If no unit is to close to this position, we will play the sound. + if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { + + playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; + _args set [8, time]; + }; + }; + }; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; +}; + +true; diff --git a/addons/missionmodules/functions/script_component.hpp b/addons/missionmodules/functions/script_component.hpp new file mode 100644 index 0000000000..42d34d4801 --- /dev/null +++ b/addons/missionmodules/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionmodules/script_component.hpp b/addons/missionmodules/script_component.hpp new file mode 100644 index 0000000000..a567966c7b --- /dev/null +++ b/addons/missionmodules/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT missionModules +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MISSIONMODULES + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MISSIONMODULES + #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSIONMODULES +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file