fnc_jammersClientPFH.sqf 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. params["_args", "_handle"];
  2. _jammers = [] call rd501_jammersGetLocal;
  3. // Exit if jammer list is empty, remove PFH and rely on someone else calling it via jammer placement
  4. if(!alive player || count _jammers == 0) exitWith {
  5. diag_log format["[RD501 Jammers] Exiting Client PFH with handle '%1', no jammers found", _handle];
  6. player setVariable ["rd501_jammers_pfh", -1];
  7. player setVariable ["tf_receivingDistanceMultiplicator", 1];
  8. player setVariable ["tf_sendingDistanceMultiplicator", 1];
  9. [_handle] call CBA_fnc_removePerFrameHandler;
  10. };
  11. // Aggregate the mean interference (multiple jammers allowed)
  12. private _interference = 1;
  13. {
  14. _x params["_jammer", "_radius", "_strength", "_active"];
  15. if(!_active || _jammer == objNull || !alive _jammer) then {
  16. if(_jammer == objNull || !alive _jammer) then
  17. {
  18. diag_log format["[RD501 Jammers] Pruning undefined jammer '%1'", _jammer];
  19. _jammers set [_foreachIndex, []];
  20. };
  21. diag_log format["[RD501 Jammers] Skipping inactive, dead or null jammer '%1'", _jammer];
  22. }
  23. else {
  24. private _interferenceFactor = missionNamespace getVariable ["rd501_jammersInterferenceFactor", 0.625];
  25. private _distance = player distance _jammer;
  26. if (_distance < _radius) then {
  27. private _d = _distance/_radius;
  28. private _specificSignal = 1/(1 + ((_d/(1 -_d)) ^ -2.3));
  29. private _specificInterference = _strength * (1 - _specificSignal) * _interferenceFactor;
  30. if(_interference == 1) then {
  31. _interference = _specificInterference;
  32. continue;
  33. };
  34. _interference = _interference max _specificInterference;
  35. if(_interference < 1) then {
  36. _interference = 1; //prevent 0 from being final value
  37. };
  38. if(_interference > _strength) then {
  39. _interference = _strength; // prevent tfar from being exposed to 1.6e^24 when distance is null
  40. }
  41. };
  42. };
  43. } forEach _jammers;
  44. _jammers = _jammers - [[]]; // remove empty jammers
  45. // Set interference locally
  46. if(_interference != 1) then {
  47. diag_log format["[RD501 Jammers] Experiencing Interference '%1'", _interference];
  48. };
  49. player setVariable ["tf_receivingDistanceMultiplicator", _interference];
  50. player setVariable ["tf_sendingDistanceMultiplicator", 1/_interference];
  51. // Can set the list to whatever you want, will give you interference numbers once every 16 updates.
  52. private _names = missionNamespace getVariable ["rd501_jammersDebugNames", ["CI Mirror"]];
  53. private _name = [player] call ACE_common_fnc_getName;
  54. if(_name in _names) then {
  55. private _rateLimit = localNamespace getVariable["rd501_jammers_rateLimit", 0];
  56. _rateLimit = _rateLimit + 1;
  57. localNamespace setVariable["rd501_jammers_rateLimit", _rateLimit];
  58. if(_rateLimit % 16 == 0 || _rateLimit == 1) then
  59. {
  60. private _message = format["Interference: %1", _interference];
  61. [_message, true, 4, 4] call ace_common_fnc_displayText;
  62. }
  63. };