Advertisement
Guest User

dynwea

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