diff --git a/SQF/dayz_server/system/server_weather.fsm b/SQF/dayz_server/system/server_weather.fsm new file mode 100644 index 000000000..fabe4430e --- /dev/null +++ b/SQF/dayz_server/system/server_weather.fsm @@ -0,0 +1,472 @@ +/*%FSM*/ +/*%FSM*/ +/* +item0[] = {"Init",0,250,-40.348839,-141.860458,49.651161,-91.860458,0.000000,"Init"}; +item1[] = {"Winter",4,218,-188.538055,-142.324219,-98.538559,-92.324203,0.000000,"Winter"}; +item2[] = {"Summer",4,218,102.997711,-141.329483,192.997635,-91.329491,0.000000,"Summer"}; +item3[] = {"Initial_Weather",2,250,-188.646942,-61.923744,-98.647324,-11.923735,0.000000,"Initial" \n "Weather" \n "Settings"}; +item4[] = {"Initial_Weather_1",2,250,102.293213,-59.535393,192.293106,-9.535398,0.000000,"Initial" \n "Weather" \n "Settings"}; +item5[] = {"Dynamic",4,218,-329.250580,71.166527,-239.250580,121.166656,0.000000,"Dynamic"}; +item6[] = {"Dynamic",4,218,218.953949,71.415863,308.953918,121.415939,0.000000,"Dynamic"}; +item7[] = {"Wait",2,250,-328.546112,168.298981,-238.546051,218.298904,0.000000,"Wait"}; +item8[] = {"Wait_1",2,250,218.914642,170.498108,308.914825,220.498215,0.000000,"Wait"}; +item9[] = {"Ready",4,218,-328.654816,242.721832,-238.654816,292.721832,0.000000,"Ready"}; +item10[] = {"Static",4,218,-157.608826,11.221905,-67.609406,61.222015,0.000000,"Static"}; +item11[] = {"Static",4,218,75.503952,10.589214,165.503632,60.589310,0.000000,"Static"}; +item12[] = {"Ready",4,218,219.836456,249.480164,309.836395,299.480164,0.000000,"Ready"}; +item13[] = {"End",1,250,-40.321423,10.661306,49.678623,60.661461,0.000000,"End"}; +item14[] = {"Invalid_Option",4,218,-40.038357,-66.470139,49.961643,-16.470152,0.000000,"Invalid" \n "Option"}; +item15[] = {"Set_Weather",2,250,-211.722900,243.535065,-121.722931,293.535065,0.000000,"Set Weather"}; +item16[] = {"Return",8,218,-211.614197,168.298981,-121.614273,218.298737,0.000000,"Return"}; +item17[] = {"Set_Weather_1",2,250,106.104187,248.682190,196.104202,298.682190,0.000000,"Set Weather"}; +item18[] = {"Return",8,218,106.772743,172.461502,196.772736,222.461502,0.000000,"Return"}; +item19[] = {"PV_Delay",2,250,-328.769989,335.746979,-238.769974,385.746979,0.000000,"PV Delay"}; +item20[] = {"Delay",4,218,-212.201813,335.746979,-122.201813,385.746979,0.000000,"Delay"}; +item21[] = {"PV_Delay_1",2,4346,219.507141,333.036072,309.507141,383.036072,0.000000,"PV Delay"}; +item22[] = {"Delay",4,218,107.005257,333.713837,197.005264,383.713837,0.000000,"Delay"}; +link0[] = {0,1}; +link1[] = {0,2}; +link2[] = {0,14}; +link3[] = {1,3}; +link4[] = {2,4}; +link5[] = {3,5}; +link6[] = {3,10}; +link7[] = {4,6}; +link8[] = {4,11}; +link9[] = {5,7}; +link10[] = {6,8}; +link11[] = {7,9}; +link12[] = {8,12}; +link13[] = {9,19}; +link14[] = {10,13}; +link15[] = {11,13}; +link16[] = {12,21}; +link17[] = {14,13}; +link18[] = {15,16}; +link19[] = {16,7}; +link20[] = {17,18}; +link21[] = {18,8}; +link22[] = {19,20}; +link23[] = {20,15}; +link24[] = {21,22}; +link25[] = {22,17}; +globals[] = {0.000000,0,0,0,0,640,480,1,26,6316128,1,-441.001495,496.288025,744.435730,-164.875015,1178,910,1}; +window[] = {2,-1,-1,-1,-1,785,26,1466,26,3,1196}; +*//*%FSM*/ +class FSM +{ + fsmName = "dze_weather"; + class States + { + /*%FSM*/ + class Init + { + name = "Init"; + init = /*%FSM*/"_minChangeTime = DZE_WeatherVariables select 0;" \n + "_maxChangeTime = DZE_WeatherVariables select 1;" \n + "_minFog = DZE_WeatherVariables select 2;" \n + "_maxFog = DZE_WeatherVariables select 3;" \n + "_minOvercast = DZE_WeatherVariables select 4;" \n + "_maxOvercast = DZE_WeatherVariables select 5;" \n + "_minRain = DZE_WeatherVariables select 6;" \n + "_maxRain = DZE_WeatherVariables select 7;" \n + "_minWind = DZE_WeatherVariables select 8;" \n + "_maxWind = DZE_WeatherVariables select 9;" \n + "_windProb = DZE_WeatherVariables select 10;" \n + "_minSnow = DZE_WeatherVariables select 11;" \n + "_maxSnow = DZE_WeatherVariables select 12;" \n + "_blizzardProb = DZE_WeatherVariables select 13;" \n + "_blizzardInterval = DZE_WeatherVariables select 14;"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Summer + { + priority = 0.000000; + to="Initial_Weather_1"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"DZE_Weather in [1,2]"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Invalid_Option + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"!(DZE_Weather in [1,2,3,4])"/*%FSM*/; + action=/*%FSM*/"diag_log ""Weather Error: invalid option for variable DZE_Weather!"";" \n + "" \n + "DZE_serverWeatherArray = [0, 0, 0, 0, 0, 0, ""none"", false];"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Winter + { + priority = 0.000000; + to="Initial_Weather"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"DZE_Weather in [3,4]"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Initial_Weather + { + name = "Initial_Weather"; + init = /*%FSM*/"_fog = (_minFog + random (_maxFog - _minFog));" \n + "_overcast = (_minOvercast + random (_maxOvercast - _minOvercast));" \n + "_rain = 0;" \n + "_snow = 0;" \n + "_type = ""NONE"";" \n + "_blizzard = false;" \n + "" \n + "if (_overcast > .70) then {" \n + " _snow = (_minSnow + random (_maxSnow - _minSnow));" \n + " if (_blizzardProb > 0) then {_blizzard = (random 1 <= _blizzardProb);};" \n + "};" \n + "" \n + "_windX = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + "_windY = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + "" \n + "_changeTime = _minChangeTime * 60 + random ((_maxChangeTime - _minChangeTime) * 60);" \n + "if (_blizzard && {_blizzardInterval > 0}) then {_changeTime = _blizzardInterval * 60};" \n + "" \n + "// Populate the server's global array" \n + "PVDZE_SetWeather = [_overcast, _fog, _rain, _windX, _windY, _snow, _type, _blizzard];" \n + "" \n + "// Set weather parameters locally on the server - I'm not sure if this is necessary because weather is not synced in A2OA." \n + "0 setRain _rain;" \n + "0 setOvercast _overcast;" \n + "0 setFog _fog;" \n + "setWind [_windX, _windY, true];" \n + "" \n + "diag_log text format [""Weather Forecast: Overcast: %1, Fog: %2, Rain: %3, WindX: %4, WindY: %5, Snow: %6, Blizzard: %7, Change Time: %8"",_overcast,_fog,_rain,_windX,_windY,_snow,_blizzard,_changeTime];"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Static + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"DZE_Weather == 3"/*%FSM*/; + action=/*%FSM*/"diag_log ""Static Winter Weather Enabled"";"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Dynamic + { + priority = 0.000000; + to="Wait"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"DZE_Weather == 4"/*%FSM*/; + action=/*%FSM*/"diag_log ""Dynamic Winter Weather Starting"";" \n + "" \n + "_bypassOvercast = _minOvercast == _maxOvercast; // if values are the same then bypass." \n + "_bypassFog = _minFog == _maxFog; // if values are the same then bypass."/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Initial_Weather_1 + { + name = "Initial_Weather_1"; + init = /*%FSM*/"_fog = (_minFog + random (_maxFog - _minFog));" \n + "_overcast = (_minOvercast + random (_maxOvercast - _minOvercast));" \n + "_rain = 0;" \n + "_snow = 0;" \n + "_type = ""NONE"";" \n + "_blizzard = false;" \n + "" \n + "if (_overcast > .70) then {" \n + " _rain = (_minRain + random (_maxRain - _minRain));" \n + "};" \n + "" \n + "_windX = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + "_windY = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + "" \n + "_changeTime = _minChangeTime * 60 + random ((_maxChangeTime - _minChangeTime) * 60);" \n + "" \n + "// Populate the server's global array" \n + "PVDZE_SetWeather = [_overcast, _fog, _rain, _windX, _windY, _snow, _type, _blizzard];" \n + "" \n + "// Set weather parameters locally on the server - I'm not sure if this is necessary because weather is not synced in A2OA." \n + "0 setRain _rain;" \n + "0 setOvercast _overcast;" \n + "0 setFog _fog;" \n + "setWind [_windX, _windY, true];" \n + "" \n + "diag_log text format [""Weather Forecast: Overcast: %1, Fog: %2, Rain: %3, WindX: %4, WindY: %5, Snow: %6, Blizzard: %7, Change Time: %8"",_overcast,_fog,_rain,_windX,_windY,_snow,_blizzard,_changeTime];"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Static + { + priority = 0.000000; + to="End"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"DZE_Weather == 1"/*%FSM*/; + action=/*%FSM*/"diag_log ""Static Summer Weather Enabled"";"/*%FSM*/; + }; + /*%FSM*/ + /*%FSM*/ + class Dynamic + { + priority = 0.000000; + to="Wait_1"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"DZE_Weather == 2" \n + ""/*%FSM*/; + action=/*%FSM*/"diag_log ""Dynamic Summer Weather Starting"";" \n + "" \n + "_bypassOvercast = _minOvercast == _maxOvercast; // if values are the same then bypass." \n + "_bypassFog = _minFog == _maxFog; // if values are the same then bypass."/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Wait + { + name = "Wait"; + init = /*%FSM*/"_time = diag_tickTime;"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Ready + { + priority = 0.000000; + to="PV_Delay"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _time) > _changeTime"/*%FSM*/; + action=/*%FSM*/"DZE_WeatherEndThread = true; // Used to end existing rain, snow, and blizzard threads on the clients." \n + "publicVariable ""DZE_WeatherEndThread"";"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Wait_1 + { + name = "Wait_1"; + init = /*%FSM*/"_time = diag_tickTime;"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Ready + { + priority = 0.000000; + to="PV_Delay_1"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _time) > _changeTime"/*%FSM*/; + action=/*%FSM*/"DZE_WeatherEndThread = true; // Used to end existing rain, snow, and blizzard threads on the clients." \n + "publicVariable ""DZE_WeatherEndThread"";"/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class End + { + name = "End"; + init = /*%FSM*/""/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + }; + }; + /*%FSM*/ + /*%FSM*/ + class Set_Weather + { + name = "Set_Weather"; + init = /*%FSM*/"diag_log ""DEBUG Weather: Setting Weather."";" \n + "" \n + "// Change one type, fog or overcast, per cycle." \n + "_type = call {" \n + " if (_bypassFog && !_bypassOvercast) exitWith {""OVERCAST""};" \n + " if (_bypassOvercast && !_bypassFog) exitWith {""FOG""};" \n + " // Select random type of weather to change if no bypass. Make overcast changes 75% of the time." \n + " [""FOG"",""OVERCAST""] select (random 1 < .75);" \n + "};" \n + "" \n + "if (_type == ""FOG"") then {" \n + " _fog = (_minFog + random (_maxFog - _minFog));" \n + "};" \n + "" \n + "if (_type == ""OVERCAST"") then {" \n + " _overcast = (_minOvercast + random (_maxOvercast - _minOvercast));" \n + " if (_overcast > 0.70) then {" \n + " _snow = (_minSnow + random (_maxSnow - _minSnow));" \n + " if (_blizzardProb > 0) then {_blizzard = (random 1 <= _blizzardProb);};" \n + " } else {" \n + " _snow = 0;" \n + " _blizzard = false;" \n + " };" \n + "};" \n + "" \n + "// On average every one fourth of weather changes, change wind too" \n + "if (random 1 < _windProb) then {" \n + " _windX = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + " _windY = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + "};" \n + "" \n + "_changeTime = _minChangeTime * 60 + random ((_maxChangeTime - _minChangeTime) * 60);" \n + "if (_blizzard && {_blizzardInterval > 0}) then {_changeTime = _blizzardInterval * 60};" \n + "" \n + "// Set weather parameters on all clients" \n + "PVDZE_SetWeather = [_overcast, _fog, _rain, _windX, _windY, _snow, _type, _blizzard];" \n + "publicVariable ""PVDZE_SetWeather"";" \n + "" \n + "// Set weather parameters locally on the server - I'm not sure if this is necessary because weather is not synced in A2OA." \n + "0 setRain _rain;" \n + "0 setOvercast _overcast;" \n + "0 setFog _fog;" \n + "setWind [_windX, _windY, true];" \n + "" \n + "diag_log text format [""Weather Forecast: Overcast: %1, Fog: %2, Rain: %3, WindX: %4, WindY: %5, Snow: %6, Blizzard: %7, Change Time: %8"",_overcast,_fog,_rain,_windX,_windY,_snow,_blizzard,_changeTime];"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Return + { + priority = 0.000000; + to="Wait"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"true"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class Set_Weather_1 + { + name = "Set_Weather_1"; + init = /*%FSM*/"// Change one type, fog or overcast, per cycle." \n + "_type = call {" \n + " if (_bypassFog && !_bypassOvercast) exitWith {""OVERCAST""};" \n + " if (_bypassOvercast && !_bypassFog) exitWith {""FOG""};" \n + " // Select random type of weather to change if no bypass. Make overcast changes 75% of the time." \n + " [""FOG"",""OVERCAST""] select (random 1 < .75);" \n + "};" \n + "" \n + "if (_type == ""FOG"") then {" \n + " _fog = (_minFog + random (_maxFog - _minFog));" \n + "};" \n + "" \n + "if (_type == ""OVERCAST"") then {" \n + " _overcast = (_minOvercast + random (_maxOvercast - _minOvercast));" \n + " if (_overcast > 0.70) then {" \n + " _rain = (_minRain + random (_maxRain - _minRain));" \n + " } else {" \n + " _rain = 0;" \n + " };" \n + "};" \n + "" \n + "// On average every one fourth of weather changes, change wind too" \n + "if (random 1 < _windProb) then {" \n + " _windX = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + " _windY = [(_minWind + random (_maxWind - _minWind)),-(_minWind + random (_maxWind - _minWind))] select (random 1 < .50);" \n + "};" \n + "" \n + "_changeTime = _minChangeTime * 60 + random ((_maxChangeTime - _minChangeTime) * 60);" \n + "" \n + "// Set weather parameters on all clients" \n + "PVDZE_SetWeather = [_overcast, _fog, _rain, _windX, _windY, _snow, _type, _blizzard];" \n + "publicVariable ""PVDZE_SetWeather"";" \n + "" \n + "// Set weather parameters locally on the server - I'm not sure if this is necessary because weather is not synced in A2OA." \n + "0 setRain _rain;" \n + "0 setOvercast _overcast;" \n + "0 setFog _fog;" \n + "setWind [_windX, _windY, true];" \n + "" \n + "diag_log text format [""Weather Forecast: Overcast: %1, Fog: %2, Rain: %3, WindX: %4, WindY: %5, Snow: %6, Blizzard: %7, Change Time: %8"",_overcast,_fog,_rain,_windX,_windY,_snow,_blizzard,_changeTime];"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Return + { + priority = 0.000000; + to="Wait_1"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"true"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class PV_Delay + { + name = "PV_Delay"; + init = /*%FSM*/"_time = diag_tickTime;" \n + "" \n + "// Need to sleep the loop for 5 seconds to ensure that the clients have time to react to the PV"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Delay + { + priority = 0.000000; + to="Set_Weather"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _time) > 5"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + /*%FSM*/ + class PV_Delay_1 + { + name = "PV_Delay_1"; + init = /*%FSM*/"_time = diag_tickTime;" \n + "" \n + "// Need to sleep the loop for 5 seconds to ensure that the clients have time to react to the PV"/*%FSM*/; + precondition = /*%FSM*/""/*%FSM*/; + class Links + { + /*%FSM*/ + class Delay + { + priority = 0.000000; + to="Set_Weather_1"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"(diag_tickTime - _time) > 5"/*%FSM*/; + action=/*%FSM*/""/*%FSM*/; + }; + /*%FSM*/ + }; + }; + /*%FSM*/ + }; + initState="Init"; + finalStates[] = + { + "End", + }; +}; +/*%FSM*/ \ No newline at end of file