Advertisement
Guest User

DynamicWeatherEffects.sqf

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