From a4a8303e08332b9ec14ed9fcbce8aa452c74dfa6 Mon Sep 17 00:00:00 2001 From: IndigoFox Date: Sat, 15 Jun 2024 16:40:10 -0700 Subject: [PATCH] aj_cbrn --- AJ_CBRN_V2/CfgFunctions.hpp | 18 ++++ AJ_CBRN_V2/CfgSounds.hpp | 13 +++ AJ_CBRN_V2/config.hpp | 2 + AJ_CBRN_V2/functions/fn_chemicalAlarm.sqf | 12 +++ AJ_CBRN_V2/functions/fn_chemicalDamage.sqf | 39 +++++++++ AJ_CBRN_V2/functions/fn_chemicalDetector.sqf | 80 ++++++++++++++++++ .../functions/fn_chemicalInitClient.sqf | 17 ++++ .../functions/fn_chemicalParticleLoop.sqf | 58 +++++++++++++ AJ_CBRN_V2/functions/fn_createArea.sqf | 44 ++++++++++ AJ_CBRN_V2/functions/fn_deleteArea.sqf | 18 ++++ AJ_CBRN_V2/functions/fn_equipMask.sqf | 43 ++++++++++ .../functions/fn_getProtectionLevel.sqf | 51 +++++++++++ AJ_CBRN_V2/functions/fn_unconAlarm.sqf | 8 ++ AJ_CBRN_V2/functions/fn_zenModules.sqf | 27 ++++++ AJ_CBRN_V2/readme.md | 43 ++++++++++ AJ_CBRN_V2/sounds/AJ_Warning_1.ogg | Bin 0 -> 14303 bytes AJ_CBRN_V2/sounds/AJ_Warning_2.ogg | Bin 0 -> 14137 bytes description.ext | 1 + 18 files changed, 474 insertions(+) create mode 100644 AJ_CBRN_V2/CfgFunctions.hpp create mode 100644 AJ_CBRN_V2/CfgSounds.hpp create mode 100644 AJ_CBRN_V2/config.hpp create mode 100644 AJ_CBRN_V2/functions/fn_chemicalAlarm.sqf create mode 100644 AJ_CBRN_V2/functions/fn_chemicalDamage.sqf create mode 100644 AJ_CBRN_V2/functions/fn_chemicalDetector.sqf create mode 100644 AJ_CBRN_V2/functions/fn_chemicalInitClient.sqf create mode 100644 AJ_CBRN_V2/functions/fn_chemicalParticleLoop.sqf create mode 100644 AJ_CBRN_V2/functions/fn_createArea.sqf create mode 100644 AJ_CBRN_V2/functions/fn_deleteArea.sqf create mode 100644 AJ_CBRN_V2/functions/fn_equipMask.sqf create mode 100644 AJ_CBRN_V2/functions/fn_getProtectionLevel.sqf create mode 100644 AJ_CBRN_V2/functions/fn_unconAlarm.sqf create mode 100644 AJ_CBRN_V2/functions/fn_zenModules.sqf create mode 100644 AJ_CBRN_V2/readme.md create mode 100644 AJ_CBRN_V2/sounds/AJ_Warning_1.ogg create mode 100644 AJ_CBRN_V2/sounds/AJ_Warning_2.ogg diff --git a/AJ_CBRN_V2/CfgFunctions.hpp b/AJ_CBRN_V2/CfgFunctions.hpp new file mode 100644 index 0000000..b2740c7 --- /dev/null +++ b/AJ_CBRN_V2/CfgFunctions.hpp @@ -0,0 +1,18 @@ +class AJDJ +{ + class CBRN + { + file = "AJ_CBRN_V2\functions"; + class zenModules{ postInit = 1; }; + class createArea{}; + class chemicalParticleLoop{}; + class chemicalDamage{}; + class getProtectionLevel{}; + class equipMask{}; + class chemicalInitClient{}; + class chemicalDetector{}; + class unconAlarm{}; + class chemicalAlarm{}; + class deleteArea{}; + }; +}; diff --git a/AJ_CBRN_V2/CfgSounds.hpp b/AJ_CBRN_V2/CfgSounds.hpp new file mode 100644 index 0000000..61f3010 --- /dev/null +++ b/AJ_CBRN_V2/CfgSounds.hpp @@ -0,0 +1,13 @@ + + class chemical_alarm + { + name = "chemical_alarm"; + sound[] = {"AJ_CBRN_V2\sounds\AJ_warning_2.ogg", 0.9, 1, 3}; //directory, volume, pitch, range + titles[]={}; + }; + class uncon_alarm + { + name = "uncon_alarm"; + sound[] = {"AJ_CBRN_V2\sounds\AJ_warning_1.ogg", 0.9, 1, 5}; //directory, volume, pitch, range + titles[]={}; + }; \ No newline at end of file diff --git a/AJ_CBRN_V2/config.hpp b/AJ_CBRN_V2/config.hpp new file mode 100644 index 0000000..b2f8843 --- /dev/null +++ b/AJ_CBRN_V2/config.hpp @@ -0,0 +1,2 @@ +#include "CfgFunctions.hpp" +#include "CfgSounds.hpp" \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_chemicalAlarm.sqf b/AJ_CBRN_V2/functions/fn_chemicalAlarm.sqf new file mode 100644 index 0000000..733970f --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_chemicalAlarm.sqf @@ -0,0 +1,12 @@ +//chemical detector audible warning of lethal levels of contamianation +//gets triggered when activating chemical trigger +//turns off when exiting the chemical trigger + +while { true } do { + + if ("ChemicalDetector_01_watch_F" in (assignedItems player)) then { + // play the sound + playSound "chemical_alarm"; + }; + sleep 5; +}; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_chemicalDamage.sqf b/AJ_CBRN_V2/functions/fn_chemicalDamage.sqf new file mode 100644 index 0000000..83b2955 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_chemicalDamage.sqf @@ -0,0 +1,39 @@ +if (!hasInterface) exitWith {}; +waitUntil { + !isNull player +}; + +params ["_trg"]; + +// start the alarm audio script (includes checking for device) +private _alarmHandle = ([] spawn AJDJ_fnc_chemicalAlarm); + +// main loop for doing hurty things when in chemical area +while { player inArea _trg } do { + // check for player protection level + private _protectionLevel = call AJDJ_fnc_getProtectionLevel; + + //if the player does not have full protection + if !(_protectionLevel == 2) then { + //if the player does not have mask protection + if (_protectionLevel == 1) then { + + sleep 5.0; + + _limbSelection = selectRandom ["body", "head", "hand_r", "hand_l", "leg_r", "leg_l"]; + [player, 0.2, _limbSelection, "vehiclecrash"] call ace_medical_fnc_addDamageToUnit; + } else { + + // deal the damage + _limbSelection = selectRandom ["body", "head", "hand_r", "hand_l", "leg_r", "leg_l"]; + [player, 0.2, _limbSelection, "vehiclecrash"] call ace_medical_fnc_addDamageToUnit; + + // deal it again for extra speedy killing + _limbSelection = selectRandom ["body", "head", "hand_r", "hand_l", "leg_r", "leg_l"]; + [player, 0.2, _limbSelection, "vehiclecrash"] call ace_medical_fnc_addDamageToUnit; + }; + }; + sleep 5; +}; + +terminate _alarmHandle; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_chemicalDetector.sqf b/AJ_CBRN_V2/functions/fn_chemicalDetector.sqf new file mode 100644 index 0000000..c2d6ef2 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_chemicalDetector.sqf @@ -0,0 +1,80 @@ +/* + Chemical Detector script by Ajdj100 + Version 1.0.0 + + Adds functionality to the chemical detector + + call this script from initPlayerLocal.sqf (example on line 16). + + + Parameters: + 0: Array of objects - the sources of contamination. (Required) + 1: Number - the radius of contamination around the source object(s) in meters. (optional, defaults to 50m) + + + initPlayerLocal.sqf Example: + chemDetector = [[Chemical1], 250] execVM "chemicalDetector.sqf"; (Creates a contamination zone 250m around the location of the Chemical1 object) +*/ + +// if not a real gamer, exit +if (!hasInterface) exitWith {}; +waitUntil { + !isNull player; +}; + +while { true } do { + // get all chemical areas + private _sources =+ (missionNamespace getVariable ["chemicalSources", []]); + + // if there are chemical sources present, and the player has a chemical detector + if (!(_sources isEqualTo []) && ("ChemicalDetector_01_watch_F" in (assignedItems player))) then { + // sort based on distance to chemical source, including radius of chemical + private _sortedSources =+ [_sources, [], { + (_x distance player) - (_x getVariable "radius") + }] call BIS_fnc_sortBy; + + // selects nearest source of chemical + private _source = (_sortedSources select 0); + + // global threat variable (for use in audio functions) + private _threat = (10 - ((player distance _source) - (_source getVariable "radius")))/3 min 9.99 max 0 toFixed 2; + + // do some stuff for the display + "ChemicalDetector" cutRsc ["RscWeaponChemicalDetector", "PLAIN", 1, false]; + + private _ui = uiNamespace getVariable "RscWeaponChemicalDetector"; + if !(isNull _ui) then { + private _obj = _ui displayCtrl 101; + _obj ctrlAnimateModel ["Threat_Level_Source", parseNumber _threat, true]; + }; + + // if the player is in a chemical zone + if ((parseNumber _threat) > 3) then { + // if the player is knocked out + if ((player getVariable "ACE_isUnconscious")) then { + //wait 20 seconds to detect uncon + sleep 20; + // loop until the player wakes up + // if !(player getVariable "ACE_isUnconscious") exitWith { + // systemChat "DEBUG unit woke up before alarm"; + // }; + waitUntil { + sleep 1; + [player] remoteExecCall ["AJDJ_fnc_unconAlarm", 0]; //THIS HAS A BUG, IT WONT TURN OFF AFTER ESCAPING THE GAS. + !(player getVariable "ACE_isUnconscious"); //THIS NEEDS TO BE SPAWNED AS A SEPERATE + }; + }; + }; + } else { //default for if there are no chemical sources present + + "ChemicalDetector" cutRsc ["RscWeaponChemicalDetector", "PLAIN", 1, false]; + + private _ui = uiNamespace getVariable "RscWeaponChemicalDetector"; + if !(isNull _ui) then { + private _obj = _ui displayCtrl 101; + _obj ctrlAnimateModel ["Threat_Level_Source", 0.00, true]; + }; + }; + + sleep 0.5; +}; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_chemicalInitClient.sqf b/AJ_CBRN_V2/functions/fn_chemicalInitClient.sqf new file mode 100644 index 0000000..e4f6a39 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_chemicalInitClient.sqf @@ -0,0 +1,17 @@ +/* +CBRN Script client side initialization Ajdj100 +Version 0.1.0 + +Adds functionality to a few things for the client +Call this script from initPlayerLocal.sqf (example on line 10). + +initPlayerLocal.sqf Example: + + call AJDJ_fnc_chemicalInitClient; +*/ + + +aceMask = ["EquipMask","Put on Gas Mask","",{call AJDJ_fnc_equipMask},{true}] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", "ACE_Equipment"], aceMask] call ace_interact_menu_fnc_addActionToObject; + +call AJDJ_fnc_chemicalDetector; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_chemicalParticleLoop.sqf b/AJ_CBRN_V2/functions/fn_chemicalParticleLoop.sqf new file mode 100644 index 0000000..e562856 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_chemicalParticleLoop.sqf @@ -0,0 +1,58 @@ +/* +spawns the visible component of the chemical area + +returns the particle source for use in deletion +*/ + +if (!hasInterface) exitWith {}; + +params ["_location", "_radius"]; + +_location set [2, 0]; + +private _pSource = ("#particlesource" createVehicleLocal _location); +_pSource setParticleParams +[ + ["\A3\data_f\ParticleEffects\Universal\Universal", 16, 12, 0, 8], + "", "Billboard", 1, 10, // animationName, type, timerPeriod, lifeTime + [0,0,-1000], // position relative to referenceObject + [0, 0, 0], // velocity + 0, 0.005, 0.003925, 0.1, [5, 5], // rotation, weight, volume, rubbing, size + [[0.6, 0.6, 0.2, 0], [0.6, 0.6, 0.2, 0.7], [0.6, 0.6, 0.2, 0]], // colors + [1], // animationPhase + 0, 0, // randomDirectionPeriod, randomDirectionIntensity + "", "", // onTimer, beforeDestroy + _pSource, // referenceObject + 0, false, // angle, bounces + -1, [], // bounceOnSurface, emissiveColor + [0, 1, 0]// vectorDir - CANNOT be [0, 0, 0] +]; + +_pSource setDropInterval (0.5/_radius); +_pSource setParticleCircle [(_radius/2), [0,1,0]]; +/* + lifeTime, + position, + moveVelocity, + rotationVelocity, + size, + color, + directionPeriod, + directionIntensity, + angle, + bounceOnSurface +*/ +_pSource setParticleRandom +[ + 0, + [(_radius/2), (_radius/2), 1], + [0, 0, 0.5], + 4, + 1, + [0, 0, 0, 0], + 0, + 0 +]; + +//return the particle source +_pSource; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_createArea.sqf b/AJ_CBRN_V2/functions/fn_createArea.sqf new file mode 100644 index 0000000..e4d1321 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_createArea.sqf @@ -0,0 +1,44 @@ +/* +creates a new contamination area + +Params: +0: Position array OR Object - The source of the contamination +1: Radius - the radius of contamination around the object + +Location can be either a position array [x,y,z] or an object +[location, radius] call AJDJ_fnc_createArea; +*/ + +params ["_location", "_radius"]; + +//init temp for emitter object +private _emitterObject = _location; + +if ("OBJECT" isEqualTo typeName _location) then { + _location = getPos _location; +} else { + _emitterObject = ("Land_GarbageBarrel_02_F" createVehicle _location); +}; + +//create trigger to control area +private _trg = createTrigger ["EmptyDetector", _location, false]; +_trg setTriggerArea [_radius, _radius, 0, false, (_radius/2)]; +_trg setTriggerActivation ["ANYPLAYER", "PRESENT", true]; +_trg setTriggerStatements ["this", "[thisTrigger] spawn AJDJ_fnc_chemicalDamage", ""]; + +//start loop for particle effects +private _pSource = [_location, _radius, _emitterObject] call AJDJ_fnc_chemicalParticleLoop; + + +//bind variables +_trg setVariable ["pSource", _pSource]; //particle source +_trg setVariable ["radius", _radius]; //area of effect (for chemical detector use); + +systemChat str _emitterObject; +//store trigger in barrel for deletion +_emitterObject setVariable ["trigger", _trg]; + + +private _sources =+ (missionNamespace getVariable ["chemicalSources", []]); +_sources pushBack _trg; +missionNamespace setVariable ["chemicalSources", _sources]; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_deleteArea.sqf b/AJ_CBRN_V2/functions/fn_deleteArea.sqf new file mode 100644 index 0000000..420a32e --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_deleteArea.sqf @@ -0,0 +1,18 @@ +params["_target"]; + +if (_target isEqualTo objNull) exitWith {}; + +private _trg = (_target getVariable "trigger"); + +private _sources =+ (missionNamespace getVariable ["chemicalSources", []]); +_sources deleteAt (_sources find _trg); +missionNamespace setVariable ["chemicalSources", _sources]; + +// delete the particle emitter +deleteVehicle (_trg getVariable "pSource"); + +// set the trigger area to 0 (removes the area of effect) +// _trg setTriggerArea [0, 0, 0, false, 0]; + +deleteVehicle _trg; +deleteVehicle _target; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_equipMask.sqf b/AJ_CBRN_V2/functions/fn_equipMask.sqf new file mode 100644 index 0000000..97a64e1 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_equipMask.sqf @@ -0,0 +1,43 @@ +/* +Gasmask equipping script by Ajdj100 +Version 0.1.0 + +Script to allow players to equip gasmasks via ACE self interact if they are holding one in their inventory. + +PASTE THE FOLLOWING INTO initPlayerLocal.sqf TO INITIALIZE: + +aceMask = ["EquipMask","Put on Gas Mask","",{execVM "scripts\aceGasmask.sqf"},{true}] call ace_interact_menu_fnc_createAction; +[player, 1, ["ACE_SelfActions", "ACE_Equipment"], aceMask] call ace_interact_menu_fnc_addActionToObject; +*/ + + +//if not a player, exit +if (!hasInterface) exitwith {}; + +// init lists of masks +private _allowedGoggles = [ + "G_AirPurifyingRespirator_01_F", + "G_AirPurifyingRespirator_02_black_F", + "G_AirPurifyingRespirator_02_olive_F", + "G_AirPurifyingRespirator_02_sand_F" +]; + +private _items = items player; + +private _availableGoggles = (_items arrayIntersect _allowedGoggles); + +//if the player has a gasmask in their inventory +if !(_availableGoggles isEqualTo []) then { + + //temporarily stores faceware + private _tempGoggles = goggles player; + + //Swaps mask with current facewear + player addGoggles (_availableGoggles select 0); + player removeItem (_availableGoggles select 0); + player addItem _tempGoggles; + + hint "Added mask"; //debug message +} else { + hint "No mask in inventory" +}; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_getProtectionLevel.sqf b/AJ_CBRN_V2/functions/fn_getProtectionLevel.sqf new file mode 100644 index 0000000..dcf1fe6 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_getProtectionLevel.sqf @@ -0,0 +1,51 @@ +/* +returns protection level of local player +*/ + +// init lists of protective equiptment +private _allowedGoggles = [ + "G_AirPurifyingRespirator_01_F", + "G_AirPurifyingRespirator_02_black_F", + "G_AirPurifyingRespirator_02_olive_F", + "G_AirPurifyingRespirator_02_sand_F", + "G_RegulatorMask_F" +]; +private _allowedUniforms = [ + "U_B_CBRN_Suit_01_MTP_F", + "U_B_CBRN_Suit_01_Tropic_F", + "U_B_CBRN_Suit_01_Blue_F", + "U_B_CBRN_Suit_01_White_F", + "U_B_CBRN_Suit_01_Wdl_F", + "U_I_CBRN_Suit_01_AAF_F", + "U_I_E_CBRN_Suit_01_EAF_F" +]; +private _allowedVehicles = [ + "rhsusf_m1a2sep1wd_usarmy", + "rhsusf_m1a2sep1tuskiwd_usarmy", + "rhsusf_m1a2sep1tuskiiwd_usarmy", + "rhsusf_m1a2sep2wd_usarmy", + "RHS_M2A3_BUSKIII_wd", + "B_APC_Wheeled_01_cannon_F" +]; + +//init protection level variable +private _protectionLevel = 0; + +// if they are wearing a mask +if (goggles player in _allowedGoggles) then { + // if they are wearing the suit + if (uniform player in _allowedUniforms) then { + _protectionLevel = 2; + } else { + _protectionLevel = 1; + }; +}; + + +// if the player is in a protected vehicle +if (typeOf objectParent player in _allowedVehicles) then { + _protectionLevel = 2 +}; + +//return +_protectionLevel; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_unconAlarm.sqf b/AJ_CBRN_V2/functions/fn_unconAlarm.sqf new file mode 100644 index 0000000..14c82fb --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_unconAlarm.sqf @@ -0,0 +1,8 @@ +/* + Script to handle the audio alert for going unconsious in gas + By Ajdj100 + + version 0.1.0 +*/ +params ["_unit"]; +_unit say3D "uncon_alarm"; \ No newline at end of file diff --git a/AJ_CBRN_V2/functions/fn_zenModules.sqf b/AJ_CBRN_V2/functions/fn_zenModules.sqf new file mode 100644 index 0000000..807e325 --- /dev/null +++ b/AJ_CBRN_V2/functions/fn_zenModules.sqf @@ -0,0 +1,27 @@ +["CBRN", "Create Chemical Area", + { + params ["_position", "_attachedObj"]; + + ["Chemical Area Option", + [[ "SLIDER:RADIUS", "Radius", [0, 500, 50, 0, _position, [1,0,0,1]]]], + { + params ["_dialog", "_args"]; + _args params ["_position"]; + _dialog params ["_radius"]; + + [_position, _radius] remoteExec ["AJDJ_fnc_createArea", 0, true]; + }, + {}, + [_position, _attachedObj] + ] call zen_dialog_fnc_create; + } +] call zen_custom_modules_fnc_register; + + +["CBRN", "Delete Chemical Area", + { + params ["_position", "_attachedObj"]; + + [_attachedObj] remoteExec ["AJDJ_fnc_deleteArea", 0, true]; + } +] call zen_custom_modules_fnc_register; \ No newline at end of file diff --git a/AJ_CBRN_V2/readme.md b/AJ_CBRN_V2/readme.md new file mode 100644 index 0000000..17d80a4 --- /dev/null +++ b/AJ_CBRN_V2/readme.md @@ -0,0 +1,43 @@ +### How to add to mission: + +Drag the AJ_CBRN_V2 folder into your mission folder and add the following line into class CfgFunctions in description.ext: + + #include "AJ_CBRN_V2\CfgFunctions.hpp" + +Add the following line into CfgSounds in description.ext: + + #include "AJ_CBRN_V2\CfgSounds.hpp" + +lastly, add the following line to initPlayerLocal.sqf: + + call AJDJ_fnc_chemicalInitClient; + + +### How to use: + +to create and delete a chemical area in zeus, use the modules under the CBRN tab. + +to create a chemical area in editor or through script, use the following line: + + [location, radius] call AJDJ_fnc_createArea; + +location can be either an object, or an array of coordinates. Examples below: + + [myObject, 40] call AJDJ_fnc_createArea; + + [[6113.79,8642.26,0], 10] call AJDJ_fnc_createArea; + +to delete an area through script, use the following line: + + [object] call ["AJDJ_fnc_deleteArea", 0, true]; + + +[IMPORTANT] note that these must be executed globally to function correctly. When using the init field of an object, it will automatically run globally +If you are working in an sqf, you will have to use remoteExec + + +currently all the CBRN equiptment from the contact DLC is supported. It is possible to add your own gear to this, but it involves editing a number of +arrays across a number of sqf's. In future I will make it easier to customize what gear provides protection. + + +Please reach out to me if you have any issues or suggestions at @ajdj100 on discord. diff --git a/AJ_CBRN_V2/sounds/AJ_Warning_1.ogg b/AJ_CBRN_V2/sounds/AJ_Warning_1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ef1c203e3ccbf6f8cce22a6f2e1b66f49f6cbfa4 GIT binary patch literal 14303 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 DtCg)= literal 0 HcmV?d00001 diff --git a/description.ext b/description.ext index 1efe1da..5c7b8ab 100644 --- a/description.ext +++ b/description.ext @@ -94,6 +94,7 @@ class Params {}; class CfgFunctions { #include "framework\CfgFunctions.hpp" #include "custom_scripts.hpp" + #include "AJ_CBRN_V2\CfgFunctions.hpp" }; class CfgLeaflets {