// // // // // // // // // // // // // // // // // // // // // // // // // // // // // // Mine Detector Script // Version alpha 0.61 // Date: 2015.05.01 // Author: Lala14 // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // init line: // null = [] execVM "minedetector.sqf"; /*Definable Start*/ MDMineDetectorAction = 0; //1 means player has to use an addaction to use the minedetector otherwise it won't work, 0 = player doesnt need an addaction and it is always on MDMineDetectorWalkOnly = 1; //Requires MDMineDetectorAction = 1, Forces when the addAction is on that the player will be forced to work (if is already forced walk then the action will not un force walk the player) MDMineDetectorVisualiseDetector = 1; //Requires MDMineDetectorAction =1, Makes the player hold a minedetector when using it /*Definable End*/ waitUntil {!isNull player}; // config [ ["kindOf AMMO classnames",pitch multiplier(noise),distance multiplier (noise),"kindOf cfgVehicles classnames"] ] if (isNil "MDLala_Config") then { MDLala_Config = [] }; MDLala_Config = MDLala_Config + [ ["SafeGaurdForMods",14,5,"Unknown"], ["ATMine_Range_Ammo",14,5,"ATMine"], ["APERSMine_Range_Ammo",14,5,"APERSMine"], ["APERSTripMine_Wire_Ammo",14,5,"APERSTripMine"], ["APERSBoundingMine_Range_Ammo",9,10,"APERSBoundingMine"], ["SLAMDirectionalMine_Wire_Ammo",14,5,"SLAMDirectionalMine"], ["ClaymoreDirectionalMine_Remote_Ammo",14,5,"Claymore_F"], ["DemoCharge_Remote_Ammo",14,5,"DemoCharge_F"], ["SatchelCharge_Remote_Ammo",14,5,"SatchelCharge_F"], ["UnderwaterMine_Range_Ammo",14,5,"UnderwaterMine"], ["UnderwaterMineAB_Range_Ammo",14,5,"UnderwaterMineAB"], ["UnderwaterMinePDM_Range_Ammo",14,5,"UnderwaterMinePDM"], ["IEDUrbanSmall_Remote_Ammo",14,5,"IEDUrbanSmall_F"], ["IEDLandSmall_Remote_Ammo",14,5,"IEDLandSmall_F"], ["IEDUrbanBig_Remote_Ammo",14,5,"IEDUrbanBig_F"], ["IEDLandBig_Remote_Ammo",14,5,"IEDLandBig_F"] ]; MDLALA_fnc_in_List = { private ["_indexno"]; _indexno = 0; { if ((_x select 0) isEqualTo _this) then { _indexno = _forEachIndex; }; }forEach MDLala_Config; _indexno }; MDLALA_fnc_Condition_Detect = { private ["_unit","_mine"]; _unit = _this select 0; if ((isNil "_unit") OR (isNull _unit)) exitWith {[]}; _mine = []; //nearestObjects [_unit, ["MineBase","MineGeneric"],10]; <--- not working :D //"ATMine","APERSMine","APERSTripMine","APERSBoundingMine","SLAMDirectionalMine","Claymore_F","DemoCharge_F","SatchelCharge_F","UnderwaterMine","UnderwaterMineAB","UnderwaterMinePDM","IEDUrbanSmall_F","IEDLandSmall_F","IEDUrbanBig_F","IEDLandBig_F" if (nearestObject [_unit, "TimeBombCore"] distance _unit < nearestObject [_unit, "MineBase"] distance _unit) then {_mine = [nearestObject [_unit, "TimeBombCore"]];}; if (nearestObject [_unit, "TimeBombCore"] distance _unit > nearestObject [_unit, "MineBase"] distance _unit) then {_mine = [nearestObject [_unit, "MineBase"]];}; if (count _mine == 0 OR _mine select 0 distance _unit > 10) then {_mine = _unit nearObjects ["TimeBombCore", 10];}; //these are innaccurate but may prove worthy if (count _mine == 0 OR _mine select 0 distance _unit > 10) then {_mine = _unit nearObjects ["MineBase", 10];}; //these are innaccurate but may prove worthy if (typeof (nearestObject [_unit, "TimeBombCore"]) == "APERSBoundingMine_Range_Ammo" && _unit distance (nearestObject [_unit, "TimeBombCore"]) < 6) then {_mine = [nearestObject [_unit, "TimeBombCore"]]}; //override for this mine since it's set off radius is 5m _mine; }; MDLALA_fnc_Mine_Noise = { private ["_unit","_missiondir","_timesleep","_pitch","_minedo"]; _unit = _this select 0; if (!(alive _unit) OR (isNull _unit)) exitWith {}; _action = _this select 1; if (count _this < 2) then {_action = false;}; _missiondir = call { private "_arr"; _arr = toArray str missionConfigFile; _arr resize (count _arr - 15); toString _arr }; _timesleep = 5; _pitch = 5; waitUntil{if (!alive _unit) exitWith {true}; ("MineDetector" in items _unit) && (count ([_unit] call MDLALA_fnc_Condition_Detect) > 0)}; if (!alive _unit) exitWith {}; while {((([_unit] call MDLALA_fnc_Condition_Detect select 0) distance _unit) < 10) && (alive _unit)} do { if (!("MineDetector" in items _unit) OR (vehicle _unit != _unit) OR !(alive _unit)) exitWith {}; _minetype = typeOf ([_unit] call MDLALA_fnc_Condition_Detect select 0); _minename = getText (configFile >> "cfgVehicles" >> (MDLala_Config select (_minetype call MDLALA_fnc_in_List) select 3) >> "displayName"); _distance = ([_unit] call MDLALA_fnc_Condition_Detect select 0) distance _unit; _pitch = (MDLala_Config select (_minetype call MDLALA_fnc_in_List) select 1) - _distance; _timesleep = (_distance / (MDLala_Config select (_minetype call MDLALA_fnc_in_List) select 2)); hintSilent format ["Mine = %4\nDistance = %1\nTime Until Next Beep = %2\nPitch = %3",_distance,_timesleep,_pitch,_minename]; playSound3D ["A3\UI_F\data\sound\CfgNotifications\addItemOk.wss",_unit,false,[getPosASL _unit select 0,getPosASL _unit select 1,(getPosASL _unit select 2) + 1],100,_pitch,5]; //playSound3D [_missiondir + "beep.wav",_unit,false,[getPosASL _unit select 0,getPosASL _unit select 1,(getPosASL _unit select 2) + 1],100,_pitch,5]; //playSound3D ["A3\Sounds_F\sfx\hint-3.wss",_unit,false,[getPosASL _unit select 0,getPosASL _unit select 1,(getPosASL _unit select 2) + 1],100,_pitch,5]; //playSound3D ["A3\missions_F\data\sounds\click.wss",_unit,false,[getPosASL _unit select 0,getPosASL _unit select 1,(getPosASL _unit select 2) + 1],100,_pitch,5]; //playSound3D ["A3\missions_F\data\sounds\click.wss",_unit,false,getPosASL ([_unit] call MDLALA_fnc_Condition_Detect select 0),100,5,5]; //playSound3D [_missiondir + "Beep.ogg",_unit,false,getPosASL _unit,100,2,10]; sleep _timesleep; }; if (!alive _unit) exitWith {}; if (_action) then { _minedo = [_unit,true,(_this select 2)] spawn MDLALA_fnc_Mine_Noise; _unit setVariable ["MineDetectorStart",_minedo,true]; } else { [_unit] spawn MDLALA_fnc_Mine_Noise; }; }; MDLALA_fnc_returnAttachedObjects = { private ["_array","_item"]; _array = _this select 0; _item = _this select 1; _found = false; { if (_item == typeOf _x) exitWith {_found = true}; }forEach _array; _found; }; MDLALA_fnc_visualMineDetector = { private ["_unit","_visualiseDetector"]; _unit = _this select 0; if ([attachedObjects _unit,"Item_MineDetector"] call MDLALA_fnc_returnAttachedObjects) exitWith {}; _unit switchMove "AmovPercMstpSrasWrflDnon_AmovPercMstpSrasWpstDnon_end"; _visualiseDetector = createVehicle ["Item_MineDetector", (getPosATL _unit), [], 0, "NONE"]; _visualiseDetector attachTo [_unit, [0.01, 0, 0.6], "LeftHandMiddle1"]; waitUntil {isNil {_unit getVariable "MineDetectorStart"}}; deleteVehicle _visualiseDetector; _unit switchMove "AmovPercMstpSrasWrflDnon_AmovPercMstpSrasWpstDnon_end"; }; MDLALA_fnc_MineDetector_selectAction = { private ["_walkingalready","_unit","_action","_actionid","_minedo"]; _unit = _this select 0; _action = _this select 1; _actionid = _this select 2; _walkingalready = _unit getVariable ["MineDetectorWalk",false]; if (isForcedWalk _unit && !_walkingalready) then {_unit setVariable ["MineDetectorWalking",isForcedWalk _unit,true];}; if (_action && !_walkingalready) then { _unit setUserActionText [_actionid,"Stop MineDetector"]; if (MDMineDetectorWalkOnly == 1) then { _unit forceWalk true; }; _unit setVariable ["MineDetectorWalk",true,true]; _minedo = [_unit,true,_actionid] spawn MDLALA_fnc_Mine_Noise; _unit setVariable ["MineDetectorStart",_minedo,true]; if (MDMineDetectorVisualiseDetector == 1) then { [_unit] spawn MDLALA_fnc_visualMineDetector; }; } else { _unit setUserActionText [_actionid,"Use MineDetector"]; if (isNil {_unit getVariable "MineDetectorWalking"}) then { _unit forceWalk false; }; _unit setVariable ["MineDetectorWalk",false,true]; _unit setVariable ["MineDetectorWalking",nil,true]; terminate (_unit getVariable "MineDetectorStart"); _unit setVariable ["MineDetectorStart",nil,true]; }; }; MDLALA_fnc_MineDetector_addAction = { private ["_unit"]; _unit = _this select 0; if (isNil {_unit getVariable "MDMineDetectorActions"}) then { _unit addAction ["Use MineDetector",{[(_this select 0),true,(_this select 2)] spawn MDLALA_fnc_MineDetector_selectAction;}, [], 0, false, true, "", '"MineDetector" in items _target']; _unit setVariable ["MDMineDetectorActions",true,true] }; }; sleep 0.1; if (MDMineDetectorAction isEqualTo 1) then { [player] spawn MDLALA_fnc_MineDetector_addAction; player addEventHandler ["Respawn",{ (_this select 0) setVariable ["MDMineDetectorActions",nil,true]; [(_this select 0)] spawn MDLALA_fnc_MineDetector_addAction; }]; } else { [player] spawn MDLALA_fnc_Mine_Noise; player addEventHandler ["Respawn",{ [(_this select 0)] spawn MDLALA_fnc_Mine_Noise;} ]; }; systemChat "Mine Detector: Initialized";