Browse Source

Merge pull request #185 from 501st-Aux-Mod-Team/rewrite-jammers

Rework jammers to basic functionality
Erliens 3 years ago
parent
commit
64cdce0dae

+ 1 - 1
addons - Copy/RD501_Droids/droid_inits.hpp

@@ -19,7 +19,7 @@ class Extended_Init_EventHandlers
 	{
 		class rd501_jammer
 		{
-			init = "[_this select 0, 300, 160] call rd501_fnc_addJammer";
+			init = "[_this select 0, 300, 160] call rd501_fnc_jammersAdd";
 		};
 	};
 	class macro_new_unit_class(opfor,BX_shield)

+ 11 - 9
addons - Copy/RD501_Main/XEH_postinit.sqf

@@ -91,24 +91,26 @@ if(!isDedicated) then {
 		],
 		false
 	] call cba_fnc_addKeybind;
-}
+};
 
 // Surrender stun
 call macro_fnc_name(stun);
 
 // Jammers
-["rd501_addJammerLocal", {
-	_this call rd501_fnc_addJammerLocal
+["rd501_jammersClear", {
+	_this call rd501_fnc_jammersClear;
+}] call CBA_fnc_addEventHandler;
+
+["rd501_jammersAddServer", {
+	_this call rd501_fnc_jammersAddServer;
 }] call CBA_fnc_addEventHandler;
 
-["rd501_clearAllJammers", {
-	_this call rd501_fnc_clearAllJammers
+["rd501_jammersRemoveServer", {
+	_this call rd501_fnc_jammersRemoveServer;
 }] call CBA_fnc_addEventHandler;
 
-["rd501_jammerServerPFH", {
-	[{
-		_this call rd501_fnc_jammersServerPFH
-	}, 1] call CBA_fnc_addPerFrameHandler;
+["rd501_jammersUpdateLocal", {
+	_this call rd501_fnc_jammersUpdateLocal;
 }] call CBA_fnc_addEventHandler;
 
 // Fired Deployables

+ 11 - 5
addons - Copy/RD501_Main/XEH_preInit.sqf

@@ -125,12 +125,18 @@ macro_prep_xeh(medical_ccp\fnc_canBandageNearbyCCP.sqf,canBandageNearbyCCP)
 macro_prep_xeh(medical_ccp\fnc_canStitchNearbyCCP.sqf,canStitchNearbyCCP)
 
 // Jammer
-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)
+macro_prep_xeh(jammer\fnc_jammersAdd.sqf,jammersAdd)
+macro_prep_xeh(jammer\fnc_jammersAddServer.sqf,jammersAddServer)
+macro_prep_xeh(jammer\fnc_jammersClear.sqf,jammersClear)
+macro_prep_xeh(jammer\fnc_jammersClientPFH.sqf,jammersClientPFH)
+macro_prep_xeh(jammer\fnc_jammersGetLocal.sqf,jammersGetLocal)
+macro_prep_xeh(jammer\fnc_jammersRemove.sqf,jammersRemove)
+macro_prep_xeh(jammer\fnc_jammersRemoveServer.sqf,jammersRemoveServer)
+macro_prep_xeh(jammer\fnc_jammersServerPFH.sqf,jammersServerPFH)
+macro_prep_xeh(jammer\fnc_jammersUpdateLocal.sqf,jammersUpdateLocal)
+macro_prep_xeh(jammer\fnc_jammersUpdateServer.sqf,jammersUpdateServer)
+
 // Impulse
 macro_prep_xeh(impulse\fnc_impulseApply.sqf,impulseApply)
 macro_prep_xeh(impulse\fnc_impulseIncrease.sqf,impulseIncrease)

+ 0 - 9
addons - Copy/RD501_Main/functions/jammer/fnc_addJammer.sqf

@@ -1,9 +0,0 @@
-params["_jammer", ["_radius", 300], ["_strength", 160], ["_active", true]];
-
-_jammers = missionNamespace getVariable ["rd501_jammers",[]];
-
-_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;

+ 0 - 9
addons - Copy/RD501_Main/functions/jammer/fnc_addJammerLocal.sqf

@@ -1,9 +0,0 @@
-params["_jammer", "_radius", "_strength", "_active"];
-if(!hasInterface) exitWith { };
-if(player getVariable ["rd501_jammers_pfh", -1] == -1) exitWith {
-	private _handler = [{
-			_this call rd501_fnc_jammersPFH;
-		}, 0.5, [player]] call CBA_fnc_addPerFrameHandler;
-	player setVariable ["rd501_jammers_pfh", _handler];
-	_handler
-};

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

@@ -1,17 +0,0 @@
-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

+ 2 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersAdd.sqf

@@ -0,0 +1,2 @@
+params["_jammer", ["_radius", 300], ["_strength", 160], ["_active", true]];
+["rd501_jammersAddServer", [_jammer, _radius, _strength, _active]] call cba_fnc_serverEvent;

+ 18 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersAddServer.sqf

@@ -0,0 +1,18 @@
+params["_jammer", "_radius", "_strength", "_active"];
+
+if(!isServer) exitWith { diag_log "[RD501 Jammers] Attempted to add to jammers from a non server context"; };
+
+_jammers = localNamespace getVariable ["rd501_jammers_server",[]];;
+_jammers pushBack [_jammer, _radius, _strength, _active];
+diag_log format["[RD501 Jammers] Added Jammer '%1'", [_jammer, _radius, _strength, _active]];
+localNamespace setVariable ["rd501_jammers_server",_jammers];
+
+private _pfhHandle = localNamespace getVariable ["rd501_jammers_serverPFH", -1];
+if(_pfhHandle isEqualTo -1) then {
+	private _handle = [{
+		_this call rd501_fnc_jammersServerPFH;
+	}, 2, []] call CBA_fnc_addPerFrameHandler;
+	localNamespace getVariable ["rd501_jammers_serverPFH", _handle];
+	diag_log format["[RD501 Jammers] Started server PFH with handle '%1'", _handle];
+	_handle
+};

+ 6 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersClear.sqf

@@ -0,0 +1,6 @@
+if(isServer) then {
+	diag_log "[RD501 Jammers] Clearing All Jammers";
+	localNamespace setVariable ["rd501_jammers_server",[]];;
+};
+
+true

+ 70 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersClientPFH.sqf

@@ -0,0 +1,70 @@
+params["_args", "_handle"];
+
+_jammers = [] call rd501_jammersGetLocal;
+
+// Exit if jammer list is empty, remove PFH and rely on someone else calling it via jammer placement
+if(!alive player || count _jammers == 0) exitWith {
+	diag_log format["[RD501 Jammers] Exiting Client PFH with handle '%1', no jammers found", _handle];
+	player setVariable ["rd501_jammers_pfh", -1];
+	player setVariable ["tf_receivingDistanceMultiplicator", 1];
+	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", "_active"];
+	if(!_active || _jammer == objNull || !alive _jammer) then {
+		if(_jammer == objNull || !alive _jammer) then 
+		{
+			diag_log format["[RD501 Jammers] Pruning undefined jammer '%1'", _jammer];
+			_jammers set [_foreachIndex, []];
+		};
+		diag_log format["[RD501 Jammers] Skipping inactive, dead or null jammer '%1'", _jammer];
+	}
+	else {
+		private _interferenceFactor = missionNamespace getVariable ["rd501_jammersInterferenceFactor", 0.625];
+		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) * _interferenceFactor;
+			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
+			}
+		};
+	};
+} forEach _jammers;
+
+_jammers = _jammers - [[]]; // remove empty jammers
+
+// Set interference locally
+if(_interference != 1) then {
+	diag_log format["[RD501 Jammers] Experiencing Interference '%1'", _interference];
+};
+player setVariable ["tf_receivingDistanceMultiplicator", _interference];
+player setVariable ["tf_sendingDistanceMultiplicator", 1/_interference];
+
+
+// Can set the list to whatever you want, will give you interference numbers once every 16 updates.
+private _names = missionNamespace getVariable ["rd501_jammersDebugNames", ["CI Mirror"]];
+private _name = [player] call ACE_common_fnc_getName;
+if(_name in _names) then {
+	private _rateLimit = localNamespace getVariable["rd501_jammers_rateLimit", 0];
+	_rateLimit = _rateLimit + 1;
+	localNamespace setVariable["rd501_jammers_rateLimit", _rateLimit];
+	if(_rateLimit % 16 == 0 || _rateLimit == 1) then
+	{
+		private _message = format["Interference: %1", _interference];
+		[_message, true, 4, 4] call ace_common_fnc_displayText;
+	}
+};

+ 1 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersGetLocal.sqf

@@ -0,0 +1 @@
+localNamespace getVariable ["rd501_jammers",[]];

+ 0 - 50
addons - Copy/RD501_Main/functions/jammer/fnc_jammersPFH.sqf

@@ -1,50 +0,0 @@
-params["_args", "_handle"];
-_args params["_player"];
-
-_jammers = missionNamespace getVariable ["rd501_jammers",[]];
-
-// Exit if jammer list is empty, remove PFH and rely on someone else calling it via jammer placement
-if(!alive _player || count _jammers == 0) exitWith {
-	_player setVariable ["rd501_jammers_pfh", -1];
-	_player setVariable ["tf_receivingDistanceMultiplicator", 1];
-	_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", "", "_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
-			}
-		};
-	};
-} forEach _jammers;
-
-_interference = _interference * 0.625; // Rebalance value after testing, to prevent having to change it everywhere
-
-// Set interference locally
-_player setVariable ["tf_receivingDistanceMultiplicator", _interference];
-_player setVariable ["tf_sendingDistanceMultiplicator", 1/_interference];
-
-if([_player] call ACE_common_fnc_getName == "CI Mirror") then {
-	systemChat format["Interference: %1", _interference];
-};

+ 2 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersRemove.sqf

@@ -0,0 +1,2 @@
+params["_jammerToRemove"];
+["rd501_jammersRemoveServer", [_jammerToRemove]] call cba_fnc_serverEvent;

+ 32 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersRemoveServer.sqf

@@ -0,0 +1,32 @@
+params["_jammerObjectToRemove"];
+
+if(!isServer) exitWith { diag_log "[RD501 Jammers] Attempted to remove jammers from a non server context"; };
+
+private _jammers = localNamespace getVariable ["rd501_jammers_server",[]];;
+{
+	_x params["_jammer", "_radius", "_strength", "_active"];
+	if(_jammer isEqualTo _jammerObjectToRemove) exitWith
+	{
+		diag_log format["[RD501 Jammers] Removed Jammer '%1'", [_jammer, _radius, _strength, _active]];
+		_jammers set [_foreachIndex, []];
+	}
+} forEach (_jammers);
+private _previousLength = count _jammers;
+_jammers = _jammers - [[]];
+private _currentLength = count _jammers;
+
+if(_previousLength == _currentLength) exitWith {
+	diag_log format["[RD501 Jammers] Specified jammer '%1' could not be found or was already removed", _jammerObjectToRemove];
+};
+
+localNamespace setVariable ["rd501_jammers_server",_jammers];
+
+private _pfhHandle = localNamespace getVariable ["rd501_jammers_serverPFH", -1];
+if(_pfhHandle isEqualTo -1) then {
+	private _handle = [{
+		_this call rd501_fnc_jammersServerPFH;
+	}, 2, []] call CBA_fnc_addPerFrameHandler;
+	localNamespace getVariable ["rd501_jammers_serverPFH", _handle];
+	diag_log format["[RD501 Jammers] Started server PFH with handle '%1'", _handle];
+	_handle
+};

+ 9 - 14
addons - Copy/RD501_Main/functions/jammer/fnc_jammersServerPFH.sqf

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

+ 19 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersUpdateLocal.sqf

@@ -0,0 +1,19 @@
+params["_jammers"];
+
+// Client
+localNamespace setVariable ["rd501_jammers", _jammers];
+
+diag_log format["[RD501 Jammers] Updated jammers to '%1'", _jammers];
+
+// If we're a client with an interface, and there is no pfh running already, start it.
+if(hasInterface) then {
+	private _pfhHandle = player getVariable ["rd501_jammers_pfh", -1];
+	if(_pfhHandle isEqualTo -1) then {
+		private _handle = [{
+				_this call rd501_fnc_jammersClientPFH;
+			}, 2, [player]] call CBA_fnc_addPerFrameHandler;
+		player setVariable ["rd501_jammers_pfh", _handle];
+		diag_log format["[RD501 Jammers] Started client PFH with handle '%1'", _handle];
+		_handle
+	};
+};

+ 42 - 0
addons - Copy/RD501_Main/functions/jammer/fnc_jammersUpdateServer.sqf

@@ -0,0 +1,42 @@
+params["_jammers"];
+if(!isServer) exitWith { diag_log "[RD501 Jammers] Attempted to update from a non server context"; };
+
+//if previous update has happened before
+//and if the current update is equivalent to it, skip
+private _previousUpdate = localNamespace getVariable["rd501_jammers",-1];
+private _shouldSkip = !(_previousUpdate isEqualTo -1);
+if(_shouldSkip) then {
+	if(count _previousUpdate isEqualTo count _jammers) exitWith
+	{
+		{
+			private _previous = _previousUpdate select _foreachIndex;
+			private _current = _x;
+			if!(_previous isEqualTo _current) exitWith
+			{
+				_shouldSkip = false;
+			}
+		}foreach(_jammers);
+	};
+	_shouldSkip = false;
+};
+if(_shouldSkip) exitWith { };
+
+diag_log "[RD501 Jammers] Broadcasting Delta";
+localNamespace setVariable["rd501_jammers_previousUpdate", _jammers];
+
+[
+	"rd501_jammersUpdateLocal",
+	[_jammers]
+] call CBA_fnc_globalEvent;
+
+// Update the JIP jammer list to match ingame
+private _jipId = localNamespace getVariable ["rd501_jammers_jipId", -1];
+if(_jipId isEqualTo -1) exitWith {
+	_jipId = ["rd501_jammersUpdateLocal", [_jammers]] call CBA_fnc_globalEventJIP;
+	localNamespace setVariable ["rd501_jammers_jipId", _jipId];
+	diag_log format["[RD501 Jammers] Added JIP with handle '%1' and jammers '%2'", _jipId, _jammers];
+};
+
+// Reuse old jip var with new jammers each time updated
+["rd501_jammersUpdateLocal", [_jammers], _jipId] call CBA_fnc_globalEventJIP;
+	diag_log format["[RD501 Jammers] Updated JIP with handle '%1' and jammers '%2'", _jipId, _jammers];

+ 1 - 1
addons - Copy/RD501_Vehicles/land/jammer_truck/config.cpp

@@ -46,7 +46,7 @@ class Extended_Init_EventHandlers
 	class macro_new_vehicle(cis,jammer_truck)
 	{
 		class rd501_jammer {
-			init = "[_this select 0, 600, 160] call rd501_fnc_addJammer";
+			init = "[_this select 0, 600, 160] call rd501_fnc_jammersAdd";
 		};
 	}
 };

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

@@ -2,6 +2,6 @@ params ["_logic"];
 
 if (isNull _logic || !local _logic) exitWith {};
 
-["rd501_clearAllJammers", []] call CBA_fnc_globalEvent;
+["rd501_jammersClear", []] call CBA_fnc_serverEvent;
 
 deleteVehicle _logic;

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

@@ -7,6 +7,6 @@ if(isNull _attach) then {
 	deleteVehicle _logic; // Don't spawn empty jammer
 }else
 {
-	[_attach, _jammerInit select 0, _jammerInit select 1] call rd501_fnc_addJammer;
+	[_attach, _jammerInit select 0, _jammerInit select 1] call rd501_fnc_jammersAdd;
 	deleteVehicle _logic;
 };