Просмотр исходного кода

Add Clear All Jammers Module, Bugfixes, Enable/Disable Jammer (#165)

* Add Clear All Jammers logic, cleanup

* space format

* Reorder, handle case where _jammer is null/dead.

* Don't allow placing on ground, just delete module

* Add jammer active/inactive, cleanup, fix dead jammers, add clear module

* Add  Jammer control actions, no jip built in, will have to call from jip
M3ales 4 лет назад
Родитель
Сommit
16ad95aa52

+ 4 - 0
addons - Copy/RD501_Main/XEH_postinit.sqf

@@ -75,6 +75,10 @@ call macro_fnc_name(stun);
 	_this call rd501_fnc_addJammerLocal
 }] call CBA_fnc_addEventHandler;
 
+["rd501_clearAllJammers", {
+	_this call rd501_fnc_clearAllJammers
+}] call CBA_fnc_addEventHandler;
+
 ["rd501_jammerServerPFH", {
 	[{
 		_this call rd501_fnc_jammersServerPFH

+ 2 - 1
addons - Copy/RD501_Main/XEH_preInit.sqf

@@ -142,7 +142,8 @@ macro_prep_xeh(jammer\fnc_addJammer.sqf,addJammer)
 macro_prep_xeh(jammer\fnc_addJammerLocal.sqf,addJammerLocal)
 macro_prep_xeh(jammer\fnc_jammersPFH.sqf,jammersPFH)
 macro_prep_xeh(jammer\fnc_jammersServerPFH.sqf,jammersServerPFH)
-
+macro_prep_xeh(jammer\fnc_clearAllJammers.sqf,clearAllJammers)
+macro_prep_xeh(jammer\fnc_jammerControlActions.sqf,jammerControlActions)
 // Impulse
 macro_prep_xeh(impulse\fnc_impulseApply.sqf,impulseApply)
 macro_prep_xeh(impulse\fnc_impulseIncrease.sqf,impulseIncrease)

+ 3 - 3
addons - Copy/RD501_Main/functions/jammer/fnc_addJammer.sqf

@@ -1,9 +1,9 @@
-params["_jammer", ["_radius", 300], ["_strength", 160]];
+params["_jammer", ["_radius", 300], ["_strength", 160], ["_active", true]];
 
 _jammers = missionNamespace getVariable ["rd501_jammers",[]];
 
-_jipId = ["rd501_addJammerLocal", [_jammer, _radius, _strength]] call CBA_fnc_globalEventJIP;
-_jammers pushBack [_jammer, _radius, _strength, _jipId];
+_jipId = ["rd501_addJammerLocal", [_jammer, _radius, _strength, _active]] call CBA_fnc_globalEventJIP;
+_jammers pushBack [_jammer, _radius, _strength, _jipId, _active];
 
 missionNamespace setVariable ["rd501_jammers",_jammers, true];
 ["rd501_jammerServerPFH", []] call CBA_fnc_serverEvent;

+ 2 - 2
addons - Copy/RD501_Main/functions/jammer/fnc_addJammerLocal.sqf

@@ -1,5 +1,5 @@
-params["_jammer", "_radius", "_strength"];
-if(isDedicated || !hasInterface) exitWith { };
+params["_jammer", "_radius", "_strength", "_active"];
+if(!hasInterface) exitWith { };
 if(player getVariable ["rd501_jammers_pfh", -1] == -1) exitWith {
 	private _handler = [{
 			_this call rd501_fnc_jammersPFH;

+ 17 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_clearAllJammers.sqf

@@ -0,0 +1,17 @@
+if(isServer) then {
+	diag_log "Clearing All Jammers for Server";
+	private _jammers = missionNamespace getVariable ["rd501_jammers", []];
+	{
+		params["_jammer", "_radius", "_strength", "_jipId"];
+		[_jipId] call CBA_fnc_removeGlobalEventJIP;
+	} forEach _jammers;
+	missionNamespace setVariable ["rd501_jammers",[], true];
+};
+
+if(hasInterface) then {
+	diag_log "Clearing All Jammers for Client";
+	missionNamespace setVariable ["rd501_jammers",[]];
+	player setVariable ["rd501_jammers_pfh", -1];
+};
+
+true

+ 77 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammerControlActions.sqf

@@ -0,0 +1,77 @@
+params["_jammer", "_object", ["_useMainActions", true]];
+
+private _fnc_rootCondition = {
+	params ["_target", "_player", "_params"];
+	if(!alive _target) exitWith { false };
+	_params	params["_jammer"];
+	_jammer != objNull && !isNil "_jammer" && alive _jammer && {missionNamespace getVariable ["rd501_jammers", []] findIf {_x select 0 == _jammer} != -1}
+};
+if(_useMainActions) then {
+_action = ["rd501_jammer", "Jammer", "", { }, _fnc_rootCondition, {["ACE_MainActions"]}] call ace_interact_menu_fnc_createAction;
+}
+else {
+	_action = ["rd501_jammer", "Jammer", "", { }, _fnc_rootCondition, {[]}] call ace_interact_menu_fnc_createAction;
+};
+[_object, 0, [], _action] call ace_interact_menu_fnc_addActionToObject;
+
+private _fnc_destroyCondition = {
+	params ["_target", "_player", "_params"];
+	if(!alive _target) exitWith { false };
+	_params params["_jammer"];
+	_jammer == objNull || isNil "_jammer" || !alive _jammer || {missionNamespace getVariable ["rd501_jammers", []] findIf {_x select 0 == _jammer} == -1}
+};
+
+if(_useMainActions) then {
+	_action = ["rd501_jammer_destroyed", "Jammer (Destroyed)", "", { }, _fnc_destroyCondition, {["ACE_MainActions"]}, [_jammer]] call ace_interact_menu_fnc_createAction;
+}
+else {
+	_action = ["rd501_jammer_destroyed", "Jammer (Destroyed)", "", { }, _fnc_destroyCondition, {[]}, [_jammer]] call ace_interact_menu_fnc_createAction;
+};
+[_object, 0, [], _action] call ace_interact_menu_fnc_addActionToObject;
+
+//Enable Jammer
+
+_fnc_enableCondition = {
+		params["","","_params"];
+		_params params["_jammer"];
+		private _jammers = missionNamespace getVariable ["rd501_jammers", []];
+		private _index = _jammers findIf {_x select 0 == _jammer};
+		if(_index == -1) exitWith { false };
+		(_jammers select _index) params ["","","","","_active"];
+		!_active
+};
+
+private _enableStatement = {
+	params ["_target", "_player", "_params"];
+	_params params["_jammer"];
+	private _jammers = missionNamespace getVariable ["rd501_jammers", []];
+	private _index = _jammers findIf {_x select 0 == _jammer};
+	if(_index == -1) exitWith { };
+	(_jammers select _index) set [4, true];
+};
+
+_action = ["rd501_jammer_enable", "Enable Jammer", "", _enableStatement, _fnc_enableCondition, {[]}, [_jammer]] call ace_interact_menu_fnc_createAction;
+[_object, 0, ["rd501_jammer"], _action] call ace_interact_menu_fnc_addActionToObject;
+
+// Disable Jammer
+
+private _fnc_disableCondition = {
+	params["","","_params"];
+	_params params["_jammer"];
+	private _jammers = missionNamespace getVariable ["rd501_jammers", []];
+	private _index = _jammers findIf {_x select 0 == _jammer};
+	if(_index == -1) exitWith { false };
+	(_jammers select _index) params ["","","","","_active"];
+	_active
+};
+private _fnc_disableStatement = {
+	params ["_target", "_player", "_params"];
+	_params params["_jammer"];
+	private _jammers = missionNamespace getVariable ["rd501_jammers", []];
+	private _index = _jammers findIf {_x select 0 == _jammer};
+	if(_index == -1) exitWith { };
+	(_jammers select _index) set [4, false];
+};
+
+_action = ["rd501_jammer_disable", "Disable Jammer", "", _fnc_disableStatement, _fnc_disableCondition, {[]}, [_jammer]] call ace_interact_menu_fnc_createAction;
+[_object, 0, ["rd501_jammer"], _action] call ace_interact_menu_fnc_addActionToObject;

+ 29 - 28
addons - Copy/RD501_Main/functions/jammer/fnc_jammersPFH.sqf

@@ -1,47 +1,48 @@
 params["_args", "_handle"];
 _args params["_player"];
-/*
-*	_jammers = [
-*		[_jammer, _radius, _strength],
-*		["bis_o1", 1000, 400]
-*	];
-*/
-if(!alive _player) exitWith { diag_log format["Player dead for %1", _handle] };
 
 _jammers = missionNamespace getVariable ["rd501_jammers",[]];
 
 // Exit if jammer list is empty, remove PFH and rely on someone else calling it via jammer placement
-if(count _jammers == 0) exitWith {
-	diag_log "Exiting Client PFH";
-	[_handle] call CBA_fnc_removePerFrameHandler;
+if(!alive _player || count _jammers == 0) exitWith {
 	_player setVariable ["rd501_jammers_pfh", -1];
 	_player setVariable ["tf_receivingDistanceMultiplicator", 1];
-	//_player setVariable ["tf_transmittingDistanceMultiplicator", 1]; // Unused by TFAR 0.9.7
+	_player setVariable ["tf_sendingDistanceMultiplicator", 1];
+	[_handle] call CBA_fnc_removePerFrameHandler;
 };
 
 // Aggregate the mean interference (multiple jammers allowed)
 private _interference = 1;
 {
-	_x params["_jammer", "_radius", "_strength"];
-	private _distance = _player distance _jammer;
-	if (_distance < _radius) then {
-		private _d = _distance/_radius;
-		private _specificSignal =  1/(1 + ((_d/(1 -_d)) ^ -2.3));
-		private _specificInterference = _strength * (1 - _specificSignal);
-		if(_interference == 1) then {
-			_interference = _specificInterference;
-			continue
+	_x params["_jammer", "_radius", "_strength", "", "_active"];
+	if(!_active || _jammer == objNull || !alive _jammer) then {
+		diag_log format["Skipping inactive, dead or null jammer"];
+	}
+	else {
+		private _distance = _player distance _jammer;
+		if (_distance < _radius) then {
+			private _d = _distance/_radius;
+			private _specificSignal =  1/(1 + ((_d/(1 -_d)) ^ -2.3));
+			private _specificInterference = _strength * (1 - _specificSignal);
+			if(_interference == 1) then {
+				_interference = _specificInterference;
+				continue
+			};
+			_interference = _interference max _specificInterference;
+			if(_interference < 1) then {
+				_interference = 1; //prevent 0 from being final value
+			};
+			if(_interference > _strength) then {
+				_interference = _strength; // prevent tfar from being exposed to 1.6e^24 when distance is null
+			}
 		};
-		_interference = _interference min _specificInterference; // Lowest value
-		if(_interference < 1) then {
-			_interference = 1; //prevent 0 from being final value
-		};
-		if(_interference > _strength) then {
-			_interference = _strength; // prevent tfar from being exposed to 1.6e^24 when distance is null
-		}
 	};
 } forEach _jammers;
 
 // Set interference locally
 _player setVariable ["tf_receivingDistanceMultiplicator", _interference];
-// _player setVariable ["tf_transmittingDistanceMultiplicator", _interference]; // Unused by TFAR 0.9.7
+_player setVariable ["tf_sendingDistanceMultiplicator", _interference];
+
+if([_player] call ACE_common_fnc_getName == "CI Mirror") then {
+	systemChat format["Interference: %1", _interference];
+};

+ 8 - 8
addons - Copy/RD501_Main/functions/jammer/fnc_jammersServerPFH.sqf

@@ -1,20 +1,19 @@
 params["_args", "_handle"];
 
 if(!isServer) exitWith {
+	diag_log "Exiting Jammer Server PFH :: Not Server";
 	[_handle] call CBA_fnc_removePerFrameHandler;
 };
 
-diag_log "Server PFH Tick";
 private _jammers = missionNamespace getVariable ["rd501_jammers",[]];
- 
+
 {
-	_x params["_jammer", "_radius", "_strength", "_jipId"];
-	diag_log format["Reading %1",_x];
+	_x params["_jammer", "_radius", "_strength", "_jipId", "_active"];
 	if(_jammer isEqualTo objNull || !(alive _jammer)) then {
 		diag_log format["Removing Jammer %1",_jammer];
-	 	_jammers set [_foreachIndex, []];
-		 if(_jipId != -1) then {
- 			[_jipId] call CBA_fnc_removeGlobalEventJIP;
+		_jammers set [_foreachIndex, []];
+		if(_jipId != -1) then {
+			[_jipId] call CBA_fnc_removeGlobalEventJIP;
 		};
 	};
 } forEach _jammers;
@@ -24,6 +23,7 @@ _jammers = _jammers - [[]];
 missionNamespace setVariable ["rd501_jammers", _jammers, true];
 
 if(count _jammers == 0) exitWith {
-	diag_log "Exiting Server PFH";
+	diag_log "Exiting Jammer Server PFH";
+	["rd501_clearAllJammers", []] call CBA_fnc_globalEvent;
 	[_handle] call CBA_fnc_removePerFrameHandler;
 };

+ 2 - 1
addons - Copy/RD501_Zeus/XEH_PREP.sqf

@@ -16,4 +16,5 @@
 [PREP_QUOTE(PREP_CONCAT_3(PREP_PATH,\,PREP_CONCAT_3(fnc_,func,.sqf))),PREP_QUOTE(PREP_CONCAT(rd501_zeus_fnc_,func))] call CBA_fnc_compileFunction
 
 PREP(moduleJammerSettings);
-PREP(ui_jammerSettings);
+PREP(ui_jammerSettings);
+PREP(moduleJammerClearAll);

+ 15 - 1
addons - Copy/RD501_Zeus/config.cpp

@@ -14,7 +14,8 @@ class CfgPatches
 			macro_new_ordnance(ModuleDioxis),
 			macro_new_ordnance(ModuleShadow),
 			macro_new_ordnance(OrbitalLaser),
-			rd501_moduleJammerSettings
+			rd501_moduleJammerSettings,
+			rd501_moduleClearAllJammers
 		};
 		weapons[] = {};
 	};
@@ -64,6 +65,19 @@ class CfgVehicles
 	class ModuleOrdnance_F;
 	class ModuleChemlight_F;
 	class ModuleOrdnanceHowitzer_F;
+
+    class rd501_moduleClearAllJammers: Module_F  {
+		author = "RD501";
+        category = "Jammers";
+        function = "rd501_zeus_fnc_moduleJammerClearAll";
+        isGlobal = 1;
+        isTriggerActivated = 0;
+        scope = 1;
+        scopeCurator = 2;
+        curatorCanAttach = 1;
+        displayName = "Clear All Jammers";
+		portrait = "RD501_Zeus\ui\jammer_icon.paa";
+    };
     class rd501_moduleJammerSettings: Module_F  {
 		author = "RD501";
         category = "Jammers";

+ 7 - 0
addons - Copy/RD501_Zeus/functions/fnc_moduleJammerClearAll.sqf

@@ -0,0 +1,7 @@
+params ["_logic"];
+
+if (isNull _logic || !local _logic) exitWith {};
+
+["rd501_clearAllJammers", []] call CBA_fnc_globalEvent;
+
+deleteVehicle _logic;

+ 1 - 1
addons - Copy/RD501_Zeus/functions/fnc_moduleJammerSettings.sqf

@@ -4,7 +4,7 @@ if (isNull _logic) exitWith {};
 private _jammerInit = _logic getVariable ["rd501_ui_jammerInit", [300,160]];
 _attach = attachedTo _logic;
 if(isNull _attach) then {
-	[_logic, _jammerInit select 0, _jammerInit select 1] call rd501_fnc_addJammer;
+	deleteVehicle _logic; // Don't spawn empty jammer
 }else
 {
 	[_attach, _jammerInit select 0, _jammerInit select 1] call rd501_fnc_addJammer;