fnc_jammersPFH.sqf 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. params["_args", "_handle"];
  2. _args params["_player"];
  3. /*
  4. * _jammers = [
  5. * [_jammer, _radius, _strength],
  6. * ["bis_o1", 1000, 400]
  7. * ];
  8. */
  9. systemChat "Server PFH";
  10. if(!alive _player) exitWith { systemChat format["Player dead for %1", _handle] };
  11. _jammers = missionNamespace getVariable ["rd501_jammers",[]];
  12. // Exit if jammer list is empty, remove PFH and rely on someone else calling it via jammer placement
  13. if(count _jammers == 0) exitWith {
  14. systemChat "Exiting Client PFH";
  15. [_handle] call CBA_fnc_removePerFrameHandler;
  16. _player setVariable ["rd501_jammers_pfh", -1];
  17. _player setVariable ["tf_receivingDistanceMultiplicator", 1];
  18. _player setVariable ["tf_transmittingDistanceMultiplicator", 1];
  19. };
  20. // Aggregate the mean interference (multiple jammers allowed)
  21. private _signalStrength = 1;
  22. {
  23. _x params["_jammer", "_radius"];
  24. private _distance = _player distance _jammer;
  25. if (_distance < _radius) then {
  26. //cubic bezier curve
  27. // private _t = 0;
  28. // private _m = 1 -_t;
  29. // private _x0 = 0;
  30. // private _x1 = 1.1;
  31. // private _x2 = 0.9;
  32. // private _x3 = 1;
  33. // private _y0 = 0.1;
  34. // private _y1 = 0.5;
  35. // private _y2 = 0.8;
  36. // private _y3 = 1;
  37. // private _xr = (_y0*_m*_m*_m) + (3*_t*_y1*_m*_m) + (3*_t*_t*_y2*_m) + (_t*_t*_t*_y3);
  38. // private _yr = (_x0*_m*_m*_m) + (3*_t*_x1*_m*_m) + (3*_t*_t*_x2*_m) + (_t*_t*_t*_x3);
  39. // _yr simplifies approx to y=1.6t³ - 3.9t² + 3.3t
  40. // or t(1.6t² - 3.9t + 3.3)
  41. private _t = _distance/_radius;
  42. private _specificInterference = _t * ((1.6*_t*_t) - (3.9 * _t) + 3.3);
  43. if(_signalStrength == 1) then {
  44. _signalStrength = _specificInterference;
  45. continue
  46. };
  47. _signalStrength = _signalStrength min _specificInterference; // Lowest value
  48. if(_signalStrength < 0.01) then {
  49. _signalStrength = 0.01; //prevent 0 from being final value
  50. };
  51. if(_signalStrength > 1) then {
  52. _signalStrength = 1; // prevent tfar from being exposed to 1.6e^24 when distance is null
  53. }
  54. };
  55. } forEach _jammers;
  56. // Set interference locally
  57. _player setVariable ["tf_receivingDistanceMultiplicator", _signalStrength];
  58. _player setVariable ["tf_transmittingDistanceMultiplicator", _signalStrength];
  59. systemChat format["Signal Strength: %1", _signalStrength];