Advertisement
Guest User

Untitled

a guest
Nov 10th, 2013
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 24.65 KB | None | 0 0
  1. /* DynamicWeatherEffects.sqf version 1.01 by Engima of Ostgota Ops
  2.  * Description:
  3.  *   Script that generates dynamic (random) weather. Works in single player, multiplayer (hosted and dedicated), and is JIP compatible.
  4.  * Arguments:
  5.  *   [_initialFog]: Optional. Fog when mission starts. Must be between 0 and 1 where 0 = no fog, 1 = maximum fog. -1 = random fog.
  6.  *   [_initialOvercast]: Optional. Overcast when mission starts. Must be between 0 and 1 where 0 = no overcast, 1 = maximum overcast. -1 = random overcast.
  7.  *   [_initialRain]: Optional. Rain when mission starts. Must be between 0 and 1 where 0 = no rain, 1 = maximum rain. -1 = random rain. (Overcast must be greater than or equal to 0.75).
  8.  *   [_initialWind]: Optional. Wind when mission starts. Must be an array of form [x, z], where x is one wind strength vector and z is the other. x and z must be greater than or equal to 0. [-1, -1] = random wind.
  9.  *   [_debug]: Optional. true if debug text is to be shown, otherwise false.
  10.  */
  11.  
  12. private ["_initialFog", "_initialOvercast", "_initialRain", "_initialWind", "_debug"];
  13. private ["_minWeatherChangeTimeMin", "_maxWeatherChangeTimeMin", "_minTimeBetweenWeatherChangesMin", "_maxTimeBetweenWeatherChangesMin", "_rainIntervalRainProbability", "_windChangeProbability"];
  14. private ["_minimumFog", "_maximumFog", "_minimumOvercast", "_maximumOvercast", "_minimumRain", "_maximumRain", "_minimumWind", "_maximumWind", "_minRainIntervalTimeMin", "_maxRainIntervalTimeMin", "_forceRainToStopAfterOneRainInterval", "_maxWind"];
  15.  
  16. if (isNil "_this") then { _this = []; };
  17. if (count _this > 0) then { _initialFog = _this select 0; } else { _initialFog = -1; };
  18. if (count _this > 1) then { _initialOvercast = _this select 1; } else { _initialOvercast = -1; };
  19. if (count _this > 2) then { _initialRain = _this select 2; } else { _initialRain = -1; };
  20. if (count _this > 3) then { _initialWind = _this select 3; } else { _initialWind = [-1, -1]; };
  21. if (count _this > 4) then { _debug = _this select 4; } else { _debug = false; };
  22.  
  23. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  24. // The following variables can be changed to tweak weather behaviour
  25.  
  26. // Minimum time in minutes for the weather (fog and overcast) to change. Must be greater than or equal to 1 and less than or equal to
  27. // _maxWeatherChangeTimeMin. When weather changes, it is fog OR overcast that changes, not both at the same time. (Suggested value: 10).
  28. _minWeatherChangeTimeMin = 10;
  29.  
  30. // Maximum time in minutes for the weather (fog and overcast) to change. Must be greater than or equal to _minWeatherChangeTimeMin.
  31. // (Suggested value: 20).
  32. _maxWeatherChangeTimeMin = 20;
  33.  
  34. // Minimum time in minutes that weather (fog and overcast) stays constant between weather changes. Must be less than or equal to 0 and
  35. // greater than or equal to _minWeatherChangeTimeMin. (Suggested value: 5).
  36. _minTimeBetweenWeatherChangesMin = 5;
  37.  
  38. // Maximum time in minutes that weather (fog and overcast) stays unchanged between weather changes. Must be greater than or equal to
  39. // _minWeatherChangeTimeMin. (Suggested value: 10).
  40. _maxTimeBetweenWeatherChangesMin = 10;
  41.  
  42. // Fog intensity never falls below this value. Must be between 0 and 1 and less than or equal to _maximumFog
  43. // (0 = no fog, 1 = pea soup). (Suggested value: 0).
  44. _minimumFog = 0;
  45.  
  46. // Fog intensity never exceeds this value. Must be between 0 and 1 and greater than or equal to _minimumFog
  47. // (0 = no fog, 1 = pea soup). (Suggested value: 0.8).
  48. _maximumFog = 0;
  49.  
  50. // Overcast intensity never falls below this value. Must be between 0 and 1 and less than or equal to _maximumOvercast
  51. // (0 = no overcast, 1 = maximum overcast). (Suggested value: 0).
  52. _minimumOvercast = 0;
  53.  
  54. // Overcast intensity never exceeds this value. Must be between 0 and 1 and greater than or equal to _minimumOvercast
  55. // (0 = no overcast, 1 = maximum overcast). (Suggested value: 1).
  56. _maximumOvercast = 0;
  57.  
  58. // When raining, rain intensity never falls below this value. Must be between 0 and 1 and less than or equal to _maximumRain
  59. // (0 = no rain, 1 = maximum rain intensity). (Suggested value: 0);
  60. _minimumRain = 0;
  61.  
  62. // When raining, rain intensity never exceeds this value. Must be between 0 and 1 and greater than or equal to _minimumRain
  63. // (0 = no rain, 1 = maximum rain intensity). (Suggested value: 0.8);
  64. _maximumRain = 0;
  65.  
  66. // Wind vector strength never falls below this value. Must be greater or equal to 0 and less than or equal to _maximumWind.
  67. // (Suggested value: 0);
  68. _minimumWind = 0;
  69.  
  70. // Wind vector strength never exceeds this value. Must be greater or equal to 0 and greater than or equal to _minimumWind.
  71. // (Suggested value: 8).
  72. _maximumWind = 8;
  73.  
  74. // Probability in percent for wind to change when weather changes. If set to 0 then wind will never change. If set to 100 then rain will
  75. // change every time the weather (fog or overcast) start to change. (Suggested value: 25);
  76. _windChangeProbability = 25;
  77.  
  78. // A "rain interval" is defined as "a time interval during which it may rain in any intensity (or it may not rain at all)". When overcast
  79. // goes above 0.75, a chain of rain intervals (defined below) is started. It cycles on until overcast falls below 0.75. At overcast
  80. // below 0.75 rain intervals never execute (thus it cannot rain).
  81.  
  82. // Probability in percent (0-100) for rain to start at every rain interval. Set this to 0 if you don't want rain at all. Set this to 100
  83. // if you want it to rain constantly when overcast is greater than 0.75. In short: if you think that it generally rains to often then
  84. // lower this value and vice versa. (Suggested value: 50).
  85. _rainIntervalRainProbability = 0;
  86.  
  87. // Minimum time in minutes for rain intervals. Must be greater or equal to 0 and less than or equal to _maxRainIntervalTimeMin.
  88. // (Suggested value: 0).
  89. _minRainIntervalTimeMin = 0;
  90.  
  91. // Maximum time in minutes for rain intervals. Must be greater than or equal to _minRainIntervalTimeMin. (Suggested value:
  92. // (_maxWeatherChangeTimeMin + _maxTimeBetweenWeatherChangesMin) / 2).
  93. _maxRainIntervalTimeMin = (_maxWeatherChangeTimeMin + _maxTimeBetweenWeatherChangesMin) / 2;
  94.  
  95. // If set to true, then the rain is forced to stop after one rain interval during which it has rained (use this for example if you only want
  96. // small occational cloudbursts ). If set to false, then the rain may stop, but it may also just change intensity for an
  97. // immedeate new rain interval. (Suggested value: false).
  98. _forceRainToStopAfterOneRainInterval = false;
  99.  
  100.  
  101. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. // Don't touch anything beneath this line
  103.  
  104. drn_DynamicWeather_DebugTextEventArgs = []; // Empty
  105.  
  106. "drn_DynamicWeather_DebugTextEventArgs" addPublicVariableEventHandler {
  107.     drn_DynamicWeather_DebugTextEventArgs call drn_fnc_DynamicWeather_ShowDebugTextLocal;
  108. };
  109.  
  110. /*
  111.  * Summary: Shows debug text on local client.
  112.  * Arguments:
  113.  *   _text: Debug text.
  114.  */
  115. drn_fnc_DynamicWeather_ShowDebugTextLocal = {
  116.     private ["_minutes", "_seconds"];
  117.  
  118.     if (!isNull player) then {
  119.         player sideChat (_this select 0);
  120.     };
  121.  
  122.     _minutes = floor (time / 60);
  123.     _seconds = floor (time - (_minutes * 60));
  124.     diag_log ((str _minutes + ":" + str _seconds) + " Debug: " + (_this select 0));
  125. };
  126.  
  127. /*
  128.  * Summary: Shows debug text on all clients.
  129.  * Arguments:
  130.  *   _text: Debug text.
  131.  */
  132. drn_fnc_DynamicWeather_ShowDebugTextAllClients = {
  133.     drn_DynamicWeather_DebugTextEventArgs = _this;
  134.     publicVariable "drn_DynamicWeather_DebugTextEventArgs";
  135.     drn_DynamicWeather_DebugTextEventArgs call drn_fnc_DynamicWeather_ShowDebugTextLocal;
  136. };
  137.  
  138. if (_debug) then {
  139.     ["Starting script WeatherEffects.sqf..."] call drn_fnc_DynamicWeather_ShowDebugTextLocal;
  140. };
  141.  
  142. drn_DynamicWeatherEventArgs = []; // [current overcast, current fog, current rain, current weather change ("OVERCAST", "FOG" or ""), target weather value, time until weather completion (in seconds), current wind x, current wind z]
  143. drn_AskServerDynamicWeatherEventArgs = []; // []
  144.  
  145. drn_fnc_DynamicWeather_SetWeatherLocal = {
  146.     private ["_currentOvercast", "_currentFog", "_currentRain", "_currentWeatherChange", "_targetWeatherValue", "_timeUntilCompletion", "_currentWindX", "_currentWindZ"];
  147.  
  148.     _currentOvercast = _this select 0;
  149.     _currentFog = _this select 1;
  150.     _currentRain = _this select 2;
  151.     _currentWeatherChange = _this select 3;
  152.     _targetWeatherValue = _this select 4;
  153.     _timeUntilCompletion = _this select 5;
  154.     _currentWindX = _this select 6;
  155.     _currentWindZ = _this select 7;
  156.  
  157.     // Set current weather values
  158.     0 setOvercast _currentOvercast;
  159.     0 setFog _currentFog;
  160.     drn_var_DynamicWeather_Rain = _currentRain;
  161.     setWind [_currentWindX, _currentWindZ, true];
  162.  
  163.     // Set forecast
  164.     if (_currentWeatherChange == "OVERCAST") then {
  165.         _timeUntilCompletion setOvercast _targetWeatherValue;
  166.     };
  167.     if (_currentWeatherChange == "FOG") then {
  168.         _timeUntilCompletion setFog _targetWeatherValue;
  169.     };
  170. };
  171.  
  172. if (!isServer) then {
  173.     "drn_DynamicWeatherEventArgs" addPublicVariableEventHandler {
  174.         drn_DynamicWeatherEventArgs call drn_fnc_DynamicWeather_SetWeatherLocal;
  175.     };
  176.  
  177.     waitUntil {!isNil "drn_var_DynamicWeather_ServerInitialized"};
  178.  
  179.     drn_AskServerDynamicWeatherEventArgs = [true];
  180.     publicVariable "drn_AskServerDynamicWeatherEventArgs";
  181. };
  182.  
  183. if (isServer) then {
  184.     drn_fnc_DynamicWeather_SetWeatherAllClients = {
  185.         private ["_timeUntilCompletion", "_currentWeatherChange"];
  186.  
  187.         _timeUntilCompletion = drn_DynamicWeather_WeatherChangeCompletedTime - drn_DynamicWeather_WeatherChangeStartedTime;
  188.         if (_timeUntilCompletion > 0) then {
  189.             _currentWeatherChange = drn_DynamicWeather_CurrentWeatherChange;
  190.         }
  191.         else {
  192.             _currentWeatherChange = "";
  193.         };
  194.  
  195.         drn_DynamicWeatherEventArgs = [overcast, fog, drn_var_DynamicWeather_Rain, _currentWeatherChange, drn_DynamicWeather_WeatherTargetValue, _timeUntilCompletion, drn_DynamicWeather_WindX, drn_DynamicWeather_WindZ];
  196.         publicVariable "drn_DynamicWeatherEventArgs";
  197.         drn_DynamicWeatherEventArgs call drn_fnc_DynamicWeather_SetWeatherLocal;
  198.     };
  199.  
  200.     "drn_AskServerDynamicWeatherEventArgs" addPublicVariableEventHandler {
  201.         call drn_fnc_DynamicWeather_SetWeatherAllClients;
  202.     };
  203.  
  204.     drn_DynamicWeather_CurrentWeatherChange = "";
  205.     drn_DynamicWeather_WeatherTargetValue = 0;
  206.     drn_DynamicWeather_WeatherChangeStartedTime = time;
  207.     drn_DynamicWeather_WeatherChangeCompletedTime = time;
  208.     drn_DynamicWeather_WindX = _initialWind select 0;
  209.     drn_DynamicWeather_WindZ = _initialWind select 1;
  210.  
  211.     if (_initialFog == -1) then {
  212.         _initialFog = (_minimumFog + random (_maximumFog - _minimumFog));
  213.     }
  214.     else {
  215.         if (_initialFog < _minimumFog) then {
  216.             _initialFog = _minimumFog;
  217.         };
  218.         if (_initialFog > _maximumFog) then {
  219.             _initialFog = _maximumFog;
  220.         };
  221.     };
  222.  
  223.     0 setFog _initialFog;
  224.  
  225.     if (_initialOvercast == -1) then {
  226.         _initialOvercast = (_minimumOvercast + random (_maximumOvercast - _minimumOvercast));
  227.     }
  228.     else {
  229.         if (_initialOvercast < _minimumOvercast) then {
  230.             _initialOvercast = _minimumOvercast;
  231.         };
  232.         if (_initialOvercast > _maximumOvercast) then {
  233.             _initialOvercast = _maximumOvercast;
  234.         };
  235.     };
  236.  
  237.     0 setOvercast _initialOvercast;
  238.  
  239.     if (_initialOvercast >= 0.75) then {
  240.         if (_initialRain == -1) then {
  241.             _initialRain = (_minimumRain + random (_minimumRain - _minimumRain));
  242.         }
  243.         else {
  244.             if (_initialRain < _minimumRain) then {
  245.                 _initialRain = _minimumRain;
  246.             };
  247.             if (_initialRain > _maximumRain) then {
  248.                 _initialRain = _maximumRain;
  249.             };
  250.         };
  251.     }
  252.     else {
  253.         _initialRain = 0;
  254.     };
  255.  
  256.     drn_var_DynamicWeather_Rain = _initialRain;
  257.     0 setRain drn_var_DynamicWeather_Rain;
  258.  
  259.     _maxWind = _minimumWind + random (_maximumWind - _minimumWind);
  260.  
  261.     if (drn_DynamicWeather_WindX == -1) then {
  262.         if (random 100 < 50) then {
  263.             drn_DynamicWeather_WindX = -_minimumWind - random (_maxWind - _minimumWind);
  264.         }
  265.         else {
  266.             drn_DynamicWeather_WindX = _minimumWind + random (_maxWind - _minimumWind);
  267.         };
  268.     };
  269.  
  270.     if (drn_DynamicWeather_WindZ == -1) then {
  271.         if (random 100 < 50) then {
  272.             drn_DynamicWeather_WindZ = -_minimumWind - random (_maxWind - _minimumWind);
  273.         }
  274.         else {
  275.             drn_DynamicWeather_WindZ = _minimumWind + random (_maxWind - _minimumWind);
  276.         };
  277.     };
  278.  
  279.     setWind [drn_DynamicWeather_WindX, drn_DynamicWeather_WindZ, true];
  280.  
  281.     sleep 0.05;
  282.  
  283.     publicVariable "drn_var_DynamicWeather_Rain";
  284.     drn_var_DynamicWeather_ServerInitialized = true;
  285.     publicVariable "drn_var_DynamicWeather_ServerInitialized";
  286.  
  287.     // Start weather thread
  288.     [_minWeatherChangeTimeMin, _maxWeatherChangeTimeMin, _minTimeBetweenWeatherChangesMin, _maxTimeBetweenWeatherChangesMin, _minimumFog, _maximumFog, _minimumOvercast, _maximumOvercast, _minimumWind, _maximumWind, _windChangeProbability, _debug] spawn {
  289.         private ["_minWeatherChangeTimeMin", "_maxWeatherChangeTimeMin", "_minTimeBetweenWeatherChangesMin", "_maxTimeBetweenWeatherChangesMin", "_minimumFog", "_maximumFog", "_minimumOvercast", "_maximumOvercast", "_minimumWind", "_maximumWind", "_windChangeProbability", "_debug"];
  290.         private ["_weatherType", "_fogLevel", "_overcastLevel", "_oldFogLevel", "_oldOvercastLevel", "_weatherChangeTimeSek"];
  291.  
  292.         _minWeatherChangeTimeMin = _this select 0;
  293.         _maxWeatherChangeTimeMin = _this select 1;
  294.         _minTimeBetweenWeatherChangesMin = _this select 2;
  295.         _maxTimeBetweenWeatherChangesMin = _this select 3;
  296.         _minimumFog = _this select 4;
  297.         _maximumFog = _this select 5;
  298.         _minimumOvercast = _this select 6;
  299.         _maximumOvercast = _this select 7;
  300.         _minimumWind = _this select 8;
  301.         _maximumWind = _this select 9;
  302.         _windChangeProbability = _this select 10;
  303.         _debug = _this select 11;
  304.  
  305.         // Set initial fog level
  306.         _fogLevel = 2;
  307.         _overcastLevel = 2;
  308.  
  309.         while {true} do {
  310.             // Sleep a while until next weather change
  311.             sleep floor (_minTimeBetweenWeatherChangesMin * 60 + random ((_maxTimeBetweenWeatherChangesMin - _minTimeBetweenWeatherChangesMin) * 60));
  312.  
  313.             if (_minimumFog == _maximumFog && _minimumOvercast != _maximumOvercast) then {
  314.                 _weatherType = "OVERCAST";
  315.             };
  316.             if (_minimumFog != _maximumFog && _minimumOvercast == _maximumOvercast) then {
  317.                 _weatherType = "FOG";
  318.             };
  319.             if (_minimumFog != _maximumFog && _minimumOvercast != _maximumOvercast) then {
  320.  
  321.                 // Select type of weather to change
  322.                 if ((random 100) < 50) then {
  323.                     _weatherType = "OVERCAST";
  324.                 }
  325.                 else {
  326.                     _weatherType = "FOG";
  327.                 };
  328.             };
  329.  
  330.             // DEBUG
  331.             //_weatherType = "OVERCAST";
  332.  
  333.             if (_weatherType == "FOG") then {
  334.  
  335.                 drn_DynamicWeather_CurrentWeatherChange = "FOG";
  336.  
  337.                 // Select a new fog level
  338.                 _oldFogLevel = _fogLevel;
  339.                 _fogLevel = floor ((random 100) / 25);
  340.  
  341.                 while {_fogLevel == _oldFogLevel} do {
  342.                     _fogLevel = floor ((random 100) / 25);
  343.                 };
  344.  
  345.                 if (_fogLevel == 0) then {
  346.                     drn_DynamicWeather_WeatherTargetValue = _minimumFog + (_maximumFog - _minimumFog) * random 0.05;
  347.                 };
  348.                 if (_fogLevel == 1) then {
  349.                     drn_DynamicWeather_WeatherTargetValue = _minimumFog + (_maximumFog - _minimumFog) * (0.05 + random 0.2);
  350.                 };
  351.                 if (_fogLevel == 2) then {
  352.                     drn_DynamicWeather_WeatherTargetValue = _minimumFog + (_maximumFog - _minimumFog) * (0.25 + random 0.3);
  353.                 };
  354.                 if (_fogLevel == 3) then {
  355.                     drn_DynamicWeather_WeatherTargetValue = _minimumFog + (_maximumFog - _minimumFog) * (0.55 + random 0.45);
  356.                 };
  357.  
  358.                 drn_DynamicWeather_WeatherChangeStartedTime = time;
  359.                 _weatherChangeTimeSek = _minWeatherChangeTimeMin * 60 + random ((_maxWeatherChangeTimeMin - _minWeatherChangeTimeMin) * 60);
  360.                 drn_DynamicWeather_WeatherChangeCompletedTime = time + _weatherChangeTimeSek;
  361.  
  362.                 if (_debug) then {
  363.                     ["Weather forecast: Fog " + str drn_DynamicWeather_WeatherTargetValue + " in " + str round (_weatherChangeTimeSek / 60) + " minutes."] call drn_fnc_DynamicWeather_ShowDebugTextAllClients;
  364.                 };
  365.             };
  366.  
  367.             if (_weatherType == "OVERCAST") then {
  368.  
  369.                 drn_DynamicWeather_CurrentWeatherChange = "OVERCAST";
  370.  
  371.                 // Select a new overcast level
  372.                 _oldOvercastLevel = _overcastLevel;
  373.                 //_overcastLevel = floor ((random 100) / 25);
  374.                 _overcastLevel = 3;
  375.  
  376.                 while {_overcastLevel == _oldOvercastLevel} do {
  377.                     _overcastLevel = floor ((random 100) / 25);
  378.                 };
  379.  
  380.                 if (_overcastLevel == 0) then {
  381.                     drn_DynamicWeather_WeatherTargetValue = _minimumOvercast + (_maximumOvercast - _minimumOvercast) * random 0.05;
  382.                 };
  383.                 if (_overcastLevel == 1) then {
  384.                     drn_DynamicWeather_WeatherTargetValue = _minimumOvercast + (_maximumOvercast - _minimumOvercast) * (0.05 + random 0.3);
  385.                 };
  386.                 if (_overcastLevel == 2) then {
  387.                     drn_DynamicWeather_WeatherTargetValue = _minimumOvercast + (_maximumOvercast - _minimumOvercast) * (0.35 + random 0.35);
  388.                 };
  389.                 if (_overcastLevel == 3) then {
  390.                     drn_DynamicWeather_WeatherTargetValue = _minimumOvercast + (_maximumOvercast - _minimumOvercast) * (0.7 + random 0.3);
  391.                 };
  392.  
  393.                 // DEBUG
  394.                 /*
  395.                 if (overcast > 0.8) then {
  396.                     drn_DynamicWeather_WeatherTargetValue = 0.5;
  397.                 }
  398.                 else {
  399.                     drn_DynamicWeather_WeatherTargetValue = 0.85;
  400.                 };
  401.                 */
  402.  
  403.                 drn_DynamicWeather_WeatherChangeStartedTime = time;
  404.                 _weatherChangeTimeSek = _minWeatherChangeTimeMin * 60 + random ((_maxWeatherChangeTimeMin - _minWeatherChangeTimeMin) * 60);
  405.                 drn_DynamicWeather_WeatherChangeCompletedTime = time + _weatherChangeTimeSek;
  406.  
  407.                 if (_debug) then {
  408.                     ["Weather forecast: Overcast " + str drn_DynamicWeather_WeatherTargetValue + " in " + str round (_weatherChangeTimeSek / 60) + " minutes."] call drn_fnc_DynamicWeather_ShowDebugTextAllClients;
  409.                 };
  410.             };
  411.  
  412.             // On average every one fourth of weather changes, change wind too
  413.             if (random 100 < _windChangeProbability) then {
  414.                 private ["_maxWind"];
  415.  
  416.                 _maxWind = _minimumWind + random (_maximumWind - _minimumWind);
  417.  
  418.                 if (random 100 < 50) then {
  419.                     drn_DynamicWeather_WindX = -_minimumWind - random (_maxWind - _minimumWind);
  420.                 }
  421.                 else {
  422.                     drn_DynamicWeather_WindX = _minimumWind + random (_maxWind - _minimumWind);
  423.                 };
  424.                 if (random 100 < 50) then {
  425.                     drn_DynamicWeather_WindZ = -_minimumWind - random (_maxWind - _minimumWind);
  426.                 }
  427.                 else {
  428.                     drn_DynamicWeather_WindZ = _minimumWind + random (_maxWind - _minimumWind);
  429.                 };
  430.  
  431.                 if (_debug) then {
  432.                     ["Wind changes: [" + str drn_DynamicWeather_WindX + ", " + str drn_DynamicWeather_WindZ + "]."] call drn_fnc_DynamicWeather_ShowDebugTextAllClients;
  433.                 };
  434.             };
  435.  
  436.             call drn_fnc_DynamicWeather_SetWeatherAllClients;
  437.  
  438.             sleep _weatherChangeTimeSek;
  439.         };
  440.     };
  441.  
  442.     // Start rain thread
  443.     if (_rainIntervalRainProbability > 0) then {
  444.         [_minimumRain, _maximumRain, _forceRainToStopAfterOneRainInterval, _minRainIntervalTimeMin, _maxRainIntervalTimeMin, _rainIntervalRainProbability, _debug] spawn {
  445.             private ["_minimumRain", "_maximumRain", "_forceRainToStopAfterOneRainInterval", "_minRainIntervalTimeMin", "_maxRainIntervalTimeMin", "_rainIntervalRainProbability", "_debug"];
  446.             private ["_nextRainEventTime", "_forceStop"];
  447.  
  448.             _minimumRain = _this select 0;
  449.             _maximumRain = _this select 1;
  450.             _forceRainToStopAfterOneRainInterval = _this select 2;
  451.             _minRainIntervalTimeMin = _this select 3;
  452.             _maxRainIntervalTimeMin = _this select 4;
  453.             _rainIntervalRainProbability = _this select 5;
  454.             _debug = _this select 6;
  455.  
  456.             if (rain > 0) then {
  457.                 drn_var_DynamicWeather_Rain = rain;
  458.                 publicVariable "drn_var_DynamicWeather_Rain";
  459.             };
  460.  
  461.             _nextRainEventTime = time;
  462.             _forceStop = false;
  463.  
  464.             while {true} do {
  465.  
  466.                 if (overcast > 0.75) then {
  467.  
  468.                     if (time >= _nextRainEventTime) then {
  469.                         private ["_rainTimeSec"];
  470.  
  471.                         // At every rain event time, start or stop rain with 50% probability
  472.                         if (random 100 < _rainIntervalRainProbability && !_forceStop) then {
  473.                             drn_var_DynamicWeather_rain = _minimumRain + random (_maximumRain - _minimumRain);
  474.                             publicVariable "drn_var_DynamicWeather_rain";
  475.  
  476.                             _forceStop = _forceRainToStopAfterOneRainInterval;
  477.                         }
  478.                         else {
  479.                             drn_var_DynamicWeather_rain = 0;
  480.                             publicVariable "drn_var_DynamicWeather_rain";
  481.  
  482.                             _forceStop = false;
  483.                         };
  484.  
  485.                         // Pick a time for next rain change
  486.                         _rainTimeSec = _minRainIntervalTimeMin * 60 + random ((_maxRainIntervalTimeMin - _minRainIntervalTimeMin) * 60);
  487.                         _nextRainEventTime = time + _rainTimeSec;
  488.  
  489.                         if (_debug) then {
  490.                             ["Rain set to " + str drn_var_DynamicWeather_rain + " for " + str (_rainTimeSec / 60) + " minutes"] call drn_fnc_DynamicWeather_ShowDebugTextAllClients;
  491.                         };
  492.                     };
  493.                 }
  494.                 else {
  495.                     if (drn_var_DynamicWeather_rain != 0) then {
  496.                         drn_var_DynamicWeather_rain = 0;
  497.                         publicVariable "drn_var_DynamicWeather_rain";
  498.  
  499.                         if (_debug) then {
  500.                             ["Rain stops due to low overcast."] call drn_fnc_DynamicWeather_ShowDebugTextAllClients;
  501.                         };
  502.                     };
  503.  
  504.                     _nextRainEventTime = time;
  505.                     _forceStop = false;
  506.                 };
  507.  
  508.                 if (_debug) then {
  509.                     sleep 1;
  510.                 }
  511.                 else {
  512.                     sleep 10;
  513.                 };
  514.             };
  515.         };
  516.     };
  517. };
  518.  
  519. drn_var_rainRoutine = [_rainIntervalRainProbability, _debug] spawn {
  520.     private ["_rainIntervalRainProbability", "_debug"];
  521.     private ["_rain", "_rainPerSecond"];
  522.  
  523.     _rainIntervalRainProbability = _this select 0;
  524.     _debug = _this select 1;
  525.  
  526.     if (_debug) then {
  527.         _rainPerSecond = 0.2;
  528.     }
  529.     else {
  530.         _rainPerSecond = 0.03;
  531.     };
  532.  
  533.     if (_rainIntervalRainProbability > 0) then {
  534.         _rain = drn_var_DynamicWeather_Rain;
  535.     }
  536.     else {
  537.         _rain = 0;
  538.     };
  539.  
  540.     0 setRain _rain;
  541.     sleep 0.1;
  542.  
  543.     while {true} do {
  544.         if (_rainIntervalRainProbability > 0) then {
  545.             if (_rain < drn_var_DynamicWeather_Rain) then {
  546.                 _rain = _rain + _rainPerSecond;
  547.                 if (_rain > 1) then { _rain = 1; };
  548.             };
  549.             if (_rain > drn_var_DynamicWeather_Rain) then {
  550.                 _rain = _rain - _rainPerSecond;
  551.                 if (_rain < 0) then { _rain = 0; };
  552.             };
  553.         }
  554.         else {
  555.             _rain = 0;
  556.         };
  557.  
  558.         3 setRain _rain;
  559.  
  560.         sleep 3;
  561.     };
  562. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement