/*
    Weather Control System
	by Aaron Clark - EpochMod.com

	This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.
	http://creativecommons.org/licenses/by-nc-nd/4.0/

	Improvements and or bugfixes and other contributions are welcome via the github:
	https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/ChangeWeather.sqf
*/

private ["_tempOVRD","_rainOVRD","_fogOVRD","_overcastOVRD","_windOVRD","_arr","_response","_windValX","_windValZ","_WeatherChangeTime","_force","_rnd_temp","_fog","_rain","_overcast"];

// Initalize variable for tracking time between runs.
if (isNil "EPOCH_lastWeatherChange") then {
	EPOCH_lastWeatherChange = diag_tickTime;
};

// get the time between weather change events to use as tranistion time.
_WeatherChangeTime = diag_tickTime - EPOCH_lastWeatherChange;

// increment timer to current time.
EPOCH_lastWeatherChange = diag_tickTime;

_force = false;

// use config static weather if set.
if !(EPOCH_WeatherStaticForecast isEqualTo []) then {
	_tempOVRD = EPOCH_WeatherStaticForecast select 0;
	_rainOVRD = EPOCH_WeatherStaticForecast select 1;
	_fogOVRD = EPOCH_WeatherStaticForecast select 2;
	_overcastOVRD = EPOCH_WeatherStaticForecast select 3;
	_windOVRD = EPOCH_WeatherStaticForecast select 4;
} else {

	// Make database call to get "Weather:InstanceID" that can be set in the database to allow for weather controls outside of the game.
	_response = ["Weather", (call EPOCH_fn_InstanceID)] call EPOCH_fnc_server_hiveGETRANGE;
	if ((_response select 0) == 1 && (_response select 1) isEqualType [] && !((_response select 1) isEqualTo[])) then {
		_arr = _response select 1;
		_tempOVRD = _arr select 0;
		_rainOVRD = _arr select 1;
		_fogOVRD = _arr select 2;
		_overcastOVRD = _arr select 3;
		_windOVRD = _arr select 4;
	};
};

// get random temp.
_rnd_temp = if (sunOrMoon < 1) then { (random 35) + 15 } else { (random 75) + 50 };

// push temp to all players and JIP.
missionNamespace setVariable ["EPOCH_CURRENT_WEATHER", if (isNil "_tempOVRD") then { round(_rnd_temp) } else { _tempOVRD }, true];

// fog, rain, overcast.
_fog = if (isNil "_fogOVRD") then { [random 0.2, random 0.2, random 20] } else { _fogOVRD };
_rain = if (isNil "_rainOVRD") then { random 1 } else { _rainOVRD };
_overcast = if (isNil "_overcastOVRD") then { random 1 } else { _overcastOVRD };

_WeatherChangeTime setFog _fog;
_WeatherChangeTime setOvercast _overcast;
_WeatherChangeTime setRain _rain;

// wind.
_windValX = random 10 - 5;
_windValZ = random 10 - 5;
if (_rain > 0.5) then {
	_windValX = random 20 - 10;
	_windValZ = random 20 - 10;
};

if !(isNil "_windOVRD") then {
	_windValX = _windOVRD select 0;
	_windValZ = _windOVRD select 1;
};

setWind[_windValX, _windValZ, true];

// will force weather change if set to true (will cause lag).
if (_force) then {
	forceWeatherChange;
};

diag_log format["Epoch: Weather Change - fog: %1 rain: %2 overcast: %3 windx: %4 windz: %5 forced: %6", _fog, _overcast, _rain, _windValX, _windValZ, _force];