fnc_jammersPFH.sqf 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. params["_args", "_handle"];
  2. _args params["_player"];
  3. /*
  4. * _jammers = [
  5. * [_jammer, _radius, _strength],
  6. * ["bis_o1", 1000, 400]
  7. * ];
  8. */
  9. if(!alive _player) exitWith { diag_log format["Player dead for %1", _handle] };
  10. _jammers = missionNamespace getVariable ["rd501_jammers",[]];
  11. // Exit if jammer list is empty, remove PFH and rely on someone else calling it via jammer placement
  12. if(count _jammers == 0) exitWith {
  13. diag_log "Exiting Client PFH";
  14. [_handle] call CBA_fnc_removePerFrameHandler;
  15. _player setVariable ["rd501_jammers_pfh", -1];
  16. _player setVariable ["tf_receivingDistanceMultiplicator", 1];
  17. //_player setVariable ["tf_transmittingDistanceMultiplicator", 1]; // Unused by TFAR 0.9.7
  18. };
  19. // Aggregate the mean interference (multiple jammers allowed)
  20. private _interference = 1;
  21. {
  22. _x params["_jammer", "_radius", "_strength"];
  23. private _distance = _player distance _jammer;
  24. if (_distance < _radius) then {
  25. private _d = _distance/_radius;
  26. private _specificSignal = 1/(1 + ((_d/(1 -_d)) ^ -2.3));
  27. private _specificInterference = _strength * (1 - _specificSignal);
  28. if(_interference == 1) then {
  29. _interference = _specificInterference;
  30. continue
  31. };
  32. _interference = _interference min _specificInterference; // Lowest value
  33. if(_interference < 1) then {
  34. _interference = 1; //prevent 0 from being final value
  35. };
  36. if(_interference > _strength) then {
  37. _interference = _strength; // prevent tfar from being exposed to 1.6e^24 when distance is null
  38. }
  39. };
  40. } forEach _jammers;
  41. // Set interference locally
  42. _player setVariable ["tf_receivingDistanceMultiplicator", _interference];
  43. // _player setVariable ["tf_transmittingDistanceMultiplicator", _interference]; // Unused by TFAR 0.9.7