diff --git a/Changelogs/0.6.0.0.txt b/Changelogs/0.6.0.0.txt new file mode 100644 index 00000000..cc7ea180 --- /dev/null +++ b/Changelogs/0.6.0.0.txt @@ -0,0 +1,16 @@ +== WIP == + +[Added] Option to drink from predetermined sources. @Ignatz-HeMan + +[Added] Epoch Events 3.0: Allow external events based on server side configs and pbos. + +New server side events can be added just dropping the pbo into @epochhive/addons folder. +To make your own use Dynamic Debris Event as a template. + +[Added] Dynamic Debris Epoch Event. Dynamically spawns vehicle and other debris on the roadways. +Scans the roads on startup and uses a random seed generator to determine the locations of debris. +Debris is spawned using createSimpleObject and is made to conform with the upper most roadway surface. + +[Added] Epoch Dev Libs by @raymix + +[Fixed] BE kick since 1.70. diff --git a/Server_Install_Pack/@epochhive/epochconfig.hpp b/Server_Install_Pack/@epochhive/epochconfig.hpp index 0443bfd0..5a1ab89a 100644 --- a/Server_Install_Pack/@epochhive/epochconfig.hpp +++ b/Server_Install_Pack/@epochhive/epochconfig.hpp @@ -12,7 +12,7 @@ lootMultiplier = 0.5; // 1 = max loot bias. This controls how much loot can payo // Events WeatherStaticForecast[] = {}; // Default: {75.5,0,{0,0,0},0,{1,1}}; // Clear day; {19,1,{1,1,40},1,{5,5}}; // Cold Foggy Rainy Overcast Windy; Format: {temp ,rain ,fog ,overcast ,wind } events[] = { - { 3600, "CarnivalSpawner", 0 , 1}, // SECOND , EVENT , INIT 1 = run script at startup, 0 normal delay, PREPOSTFIX 1 = use pre/postfix path (inside epoch settings pbo) 0 = use full file path + { 3600, "CarnivalSpawner", 0 , 1}, // SECOND , EVENT , INIT 1 = run script at startup or 0 normal delay, PREPOSTFIX 1 = use pre/postfix path (inside epoch settings pbo) 0 = use full file path // { 1800, "PaydayEvent", 0, 1}, // { 1200, "MessageServer", 0, 1}, { 2700, "AirDrop", 0 , 1}, diff --git a/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp b/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp index 9003c6b4..19b3ef81 100644 --- a/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp +++ b/Sources/epoch_config/Configs/CfgEpochClient/WorldInteractions.hpp @@ -638,8 +638,23 @@ class CfgWorldInteractions { class locomotive_01_v2_f_p3d : Wrecks {}; class excavator_01_abandoned_f_p3d : Wrecks {}; - - - + class Land_Wreck_Skodovka_F : Wrecks {}; + class Land_Wreck_CarDismantled_F : Wrecks {}; + class Land_Wreck_Truck_F : Wrecks {}; + class Land_Wreck_Car2_F : Wrecks {}; + class Land_Wreck_Car_F : Wrecks {}; + class Land_Wreck_Car3_F : Wrecks {}; + class Land_Wreck_Hunter_F : Wrecks {}; + class Land_Wreck_Van_F : Wrecks {}; + class Land_Wreck_Offroad_F : Wrecks {}; + class Land_Wreck_UAZ_F : Wrecks {}; + class Land_Wreck_Ural_F : Wrecks {}; + class Land_Wreck_Truck_dropside_F : Wrecks {}; + class Land_Wreck_HMMWV_F : Wrecks {}; + class Land_GarbageWashingMachine_F : Trash {}; + class Land_GarbageHeap_01_F : Trash {}; + class Land_GarbageHeap_02_F : Trash {}; + class Land_GarbageHeap_03_F : Trash {}; + class Land_GarbageHeap_04_F : Trash {}; }; diff --git a/Sources/epoch_config/build.hpp b/Sources/epoch_config/build.hpp index 62344aa7..59864879 100644 --- a/Sources/epoch_config/build.hpp +++ b/Sources/epoch_config/build.hpp @@ -1 +1 @@ -build=757; +build=773; diff --git a/Sources/epoch_server/build.hpp b/Sources/epoch_server/build.hpp index 62344aa7..59864879 100644 --- a/Sources/epoch_server/build.hpp +++ b/Sources/epoch_server/build.hpp @@ -1 +1 @@ -build=757; +build=773; diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf index fc3bfc27..b84303f6 100644 --- a/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf +++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_onPlayerDisconnect.sqf @@ -30,10 +30,8 @@ if (!isNull _player) then { }; // Delete any left over units with same PUID { - if ((_x getVariable["PUID", "0"]) == _uid) then { - deleteVehicle _x; - }; -} forEach allUnits; + deleteVehicle _x; +} forEach (allUnits select {_x getVariable["PUID", "0"] == _uid}); _uid call EPOCH_server_disconnect; ['Disconnected', [_uid, _name]] call EPOCH_fnc_server_hiveLog; _return diff --git a/Sources/epoch_server/config.cpp b/Sources/epoch_server/config.cpp index 2c17b445..1362b215 100644 --- a/Sources/epoch_server/config.cpp +++ b/Sources/epoch_server/config.cpp @@ -9,7 +9,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = 0.1; - requiredAddons[] = {"A3_epoch_server_core","A3_epoch_config","A3_server_settings"}; + requiredAddons[] = {"A3_epoch_server_core","A3_epoch_config","A3_server_settings","A3_server_events"}; #include "build.hpp" }; }; diff --git a/Sources/epoch_server/system/server_monitor.fsm b/Sources/epoch_server/system/server_monitor.fsm index f0a7683b..a9b8b6f8 100644 --- a/Sources/epoch_server/system/server_monitor.fsm +++ b/Sources/epoch_server/system/server_monitor.fsm @@ -4,15 +4,14 @@ item0[] = {"Init",0,250,600.000000,-575.000000,700.000000,-525.000000,0.000000,"Init"}; item1[] = {"_",8,218,600.000000,-500.000000,700.000000,-450.000000,0.000000,""}; item2[] = {"Process",2,250,600.000000,-350.000000,700.000000,-300.000000,0.000000,"Process"}; -item3[] = {"De_simulate_Vehicle",4,218,750.000000,-225.000000,850.000000,-175.000000,2.000000,"De-simulate" \n "Vehicle Check"}; -item4[] = {"Simulate_Vehicle",4,218,750.000000,-300.000000,850.000000,-250.000000,1.000000,"Simulate" \n "Vehicle Check"}; -item5[] = {"CMD_queue",4,218,450.000000,-450.000000,550.000000,-400.000000,10.000000,"CMD queue"}; -item6[] = {"Save_Players",4,218,450.000000,-375.000000,550.000000,-325.000000,3.000000,"Save" \n "Players"}; -item7[] = {"Cleanup",4,218,750.000000,-375.000000,850.000000,-325.000000,8.000000,"Cleanup"}; -item8[] = {"Events",4,4314,450.000000,-225.000000,550.000000,-175.000000,0.000000,"Events"}; -item9[] = {"Save_Vehicles",4,218,450.000000,-300.000000,550.000000,-250.000000,4.000000,"Save" \n "Vehicles"}; -item10[] = {"Cleanup_Handler",4,218,750.000000,-450.000000,850.000000,-400.000000,8.000000,"Cleanup" \n "Handler"}; -item11[] = {"Server_FPS",4,218,600.000000,-225.000000,700.000000,-175.000000,0.000000,"Server FPS"}; +item3[] = {"Vehicle_and_Player",4,218,740.131958,-228.950928,840.131958,-178.950928,1.000000,"" \n "Vehicle and Player" \n "Checks"}; +item4[] = {"CMD_queue",4,218,450.000000,-450.000000,550.000000,-400.000000,10.000000,"CMD queue"}; +item5[] = {"Save_Players",4,218,450.000000,-375.000000,550.000000,-325.000000,3.000000,"Save" \n "Players"}; +item6[] = {"Cleanup",4,218,750.000000,-375.000000,850.000000,-325.000000,8.000000,"Cleanup"}; +item7[] = {"Events_and_Resta",4,4314,450.000000,-225.000000,550.000000,-175.000000,0.000000,"Events" \n "and" \n "Restart"}; +item8[] = {"Save_Vehicles",4,218,450.000000,-300.000000,550.000000,-250.000000,4.000000,"Save" \n "Vehicles"}; +item9[] = {"Cleanup_Handler",4,218,750.000000,-450.000000,850.000000,-400.000000,8.000000,"Cleanup" \n "Handler"}; +item10[] = {"Server_FPS",4,218,600.000000,-148.030182,700.000000,-98.030182,0.000000,"Server FPS"}; link0[] = {0,1}; link1[] = {1,2}; link2[] = {2,3}; @@ -23,18 +22,16 @@ link6[] = {2,7}; link7[] = {2,8}; link8[] = {2,9}; link9[] = {2,10}; -link10[] = {2,11}; -link11[] = {3,2}; -link12[] = {4,2}; -link13[] = {5,2}; -link14[] = {6,2}; -link15[] = {7,2}; -link16[] = {8,2}; -link17[] = {9,2}; -link18[] = {10,2}; -link19[] = {11,2}; +link10[] = {3,2}; +link11[] = {4,2}; +link12[] = {5,2}; +link13[] = {6,2}; +link14[] = {7,2}; +link15[] = {8,2}; +link16[] = {9,2}; +link17[] = {10,2}; globals[] = {0.000000,0,0,0,0,640,480,1,3,6316128,1,275.180084,1161.319580,208.497711,-659.879456,898,884,1}; -window[] = {2,-1,-1,-1,-1,968,208,1500,208,3,916}; +window[] = {2,-1,-1,-32000,-32000,786,26,1318,26,3,916}; *//*%FSM*/ class FSM { @@ -46,15 +43,24 @@ class FSM { name = "Init"; init = /*%FSM*/"diag_log ""Loaded Server FSM"";" \n + "" \n + "_cfgSecConf = (configFile >> ""CfgSecConf"");" \n + "_cfgSecConf_vehicles = (_cfgSecConf >> ""vehicles"");" \n + "_safeVehicles = [_cfgSecConf_vehicles, ""safeVehicles"", [""I_UAV_01_F"",""B_Heli_Transport_01_F"",""Steerable_Parachute_F"",""NonSteerable_Parachute_F"",""Land_Camping_Light_F"",""container_epoch""]] call EPOCH_fnc_returnConfigEntry;" \n "" \n "_serverSettingsConfig = configFile >> ""CfgEpochServer"";" \n "_ahInitAuthCfg = [_serverSettingsConfig, ""antihack_ahInitAuthCfg"", [0,180]] call EPOCH_fnc_returnConfigEntry;" \n "_events = [_serverSettingsConfig, ""events"", []] call EPOCH_fnc_returnConfigEntry;" \n "_simulationHandler = [_serverSettingsConfig, ""simulationHandlerOld"", false] call EPOCH_fnc_returnConfigEntry;" \n - "" \n "_initAhInitBanOrLog = _ahInitAuthCfg select 0;" \n "_initTimeLimit = _ahInitAuthCfg select 1;" \n "" \n + "// Load Epoch Events 3.0" \n + "{" \n + " diag_log format[""Loading Settings for %1 event..."",configName _x];" \n + " _events pushBack [getNumber (_x >> ""delay""),getText (_x >> ""script""),getNumber (_x >> ""runOnStart""),getNumber (_x >> ""usePrefix""),getNumber (_x >> ""runNumTimes"")];" \n + "} forEach (""isClass _x"" configClasses (configFile >> ""CfgEpochServerEvents""));" \n + "" \n "_cmdDelay = EPOCH_hiveAdminCmdTime;" \n "_cmdRun = EPOCH_hiveAdminCmdExec;" \n "_savePlayerList = EPOCH_hiveAdminSavePlayerList;" \n @@ -66,8 +72,6 @@ class FSM "_serverLocked = false;" \n "_serverRestarting = false;" \n "" \n - "_activeVehicles = [];" \n - "_toBeDesimulated = [];" \n "_players = [];" \n "_prevPlayers = [];" \n "_cleanupItems = [];" \n @@ -76,8 +80,6 @@ class FSM "_serverFpsTime = diag_tickTime;" \n "_serverFPSCheckFine = true;" \n "" \n - "_safeVehicles = [""I_UAV_01_F"",""B_Heli_Transport_01_F"",""Steerable_Parachute_F"",""NonSteerable_Parachute_F"",""Land_Camping_Light_F"",""container_epoch""];" \n - "" \n "_delayTimeSim = diag_tickTime;" \n "_delayTimeCMD = diag_tickTime;" \n "_delayTimeDeSim = diag_tickTime;" \n @@ -91,74 +93,73 @@ class FSM "_instanceID = call EPOCH_fn_InstanceID;" \n "" \n "_checkAuth = {" \n - " _puid = _this select 0;" \n - " _player = _this select 1;" \n - " if !(isNull _player) then {" \n - " if !(_puid call EPOCH_server_Authed) then {" \n - " _lastCheck = _player getVariable ""LAST_AUTH_CHECK"";" \n - " if (isNil ""_lastCheck"") then {" \n - " _player setVariable[""LAST_AUTH_CHECK"", diag_tickTime];" \n - " _lastCheck = diag_tickTime;" \n - " };" \n - " if (diag_tickTime - _lastCheck > _initTimeLimit) then {" \n - " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n - " if (_initAhInitBanOrLog == 0) then {" \n - " 'epochserver' callExtension format['820|%1|EpochMod.com Autoban #R2', _puid];" \n - " ['ahb', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n - " } else {" \n - " ['ahl', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n - " };" \n - " };" \n - " } else {" \n - " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n - " };" \n - " };" \n + " params [""_puid"",""_player""];" \n + " if !(isNull _player) then {" \n + " if !(_puid call EPOCH_server_Authed) then {" \n + " private _lastCheck = _player getVariable ""LAST_AUTH_CHECK"";" \n + " if (isNil ""_lastCheck"") then {" \n + " _player setVariable[""LAST_AUTH_CHECK"", diag_tickTime];" \n + " _lastCheck = diag_tickTime;" \n + " };" \n + " if (diag_tickTime - _lastCheck > _initTimeLimit) then {" \n + " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n + " if (_initAhInitBanOrLog == 0) then {" \n + " 'epochserver' callExtension format['820|%1|EpochMod.com Autoban #R2', _puid];" \n + " ['ahb', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n + " } else {" \n + " ['ahl', format['%1 (%2): Player not Authenticated', name _player, _puid]] call EPOCH_fnc_server_hiveLog;" \n + " };" \n + " };" \n + " } else {" \n + " _player setVariable[""LAST_AUTH_CHECK"", nil];" \n + " };" \n + " };" \n "};" \n "" \n "_cleanIt = {" \n - " if !(isNull _this) then {" \n - " _lastCheck = _this getVariable ""LAST_CHECK"";" \n - " if (isNil ""_lastCheck"") then {" \n - " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n - " _lastCheck = diag_tickTime;" \n - " };" \n - " if (diag_tickTime - _lastCheck > 1200) then {" \n - " _list = _this nearEntities[[""Epoch_Male_F"", ""Epoch_Female_F"", ""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 45];" \n - " if ({ isPlayer _x }count _list == 0) then {" \n - " _this setVariable [""LAST_CHECK"",nil];" \n - " //diag_log format[""DEBUG: _cleanIT del %1"", _this];" \n - " deleteVehicle _this;" \n - "" \n - " };" \n - " };" \n - " };" \n + " if !(isNull _this) then {" \n + " private _lastCheck = _this getVariable ""LAST_CHECK"";" \n + " if (isNil ""_lastCheck"") then {" \n + " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n + " _lastCheck = diag_tickTime;" \n + " };" \n + " if (diag_tickTime - _lastCheck > 1200) then {" \n + " private _list = (_this nearEntities [[""Epoch_Male_F"",""Epoch_Female_F"",""LandVehicle"",""Ship"",""Air"",""Tank""], 45]) select {isPlayer _x};" \n + " if (_list isEqualTo []) then {" \n + " _this setVariable [""LAST_CHECK"",nil];" \n + " //diag_log format[""DEBUG: _cleanIT del %1"", _this];" \n + " deleteVehicle _this;" \n + " };" \n + " };" \n + " };" \n "};" \n "" \n "_cleanIt2 = {" \n - " if !(isNull _this) then {" \n - " _removed = false;" \n - " _lastCheck = _this getVariable ""LAST_CHECK"";" \n - " if (isNil ""_lastCheck"") then {" \n - " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n - " _lastCheck = diag_tickTime;" \n - " };" \n - " if (diag_tickTime - _lastCheck > 1200) then {" \n - " _list = _this nearEntities[[""Epoch_Male_F"", ""Epoch_Female_F"", ""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 45];" \n - " if ({ isPlayer _x }count _list == 0) then {" \n - " {" \n - " deleteVehicle _x;" \n - " }forEach nearestObjects[_this, [""WeaponHolder""], 2];" \n - " _this setVariable [""LAST_CHECK"",nil];" \n - " //diag_log format[""DEBUG: _cleanIT2 del %1"", _this];" \n - " deleteVehicle _this;" \n - " _removed = true;" \n - " };" \n - " };" \n - " if !(_removed) then {" \n - " EPOCH_cleanupQueue pushBack _this;" \n - " };" \n - " };" \n - "};"/*%FSM*/; + " if !(isNull _this) then {" \n + " private _removed = false;" \n + " private _lastCheck = _this getVariable ""LAST_CHECK"";" \n + " if (isNil ""_lastCheck"") then {" \n + " _this setVariable[""LAST_CHECK"", diag_tickTime];" \n + " _lastCheck = diag_tickTime;" \n + " };" \n + " if (diag_tickTime - _lastCheck > 1200) then {" \n + " private _list = (_this nearEntities [[""Epoch_Male_F"",""Epoch_Female_F"",""LandVehicle"",""Ship"",""Air"",""Tank""], 45]) select {isPlayer _x};" \n + " if (_list isEqualTo []) then {" \n + " {" \n + " deleteVehicle _x;" \n + " }forEach nearestObjects[_this, [""WeaponHolder""], 2];" \n + " _this setVariable [""LAST_CHECK"",nil];" \n + " //diag_log format[""DEBUG: _cleanIT2 del %1"", _this];" \n + " deleteVehicle _this;" \n + " _removed = true;" \n + " };" \n + " };" \n + " if !(_removed) then {" \n + " EPOCH_cleanupQueue pushBack _this;" \n + " };" \n + " };" \n + "};" \n + ""/*%FSM*/; precondition = /*%FSM*/""/*%FSM*/; class Links { @@ -203,6 +204,21 @@ class FSM ""/*%FSM*/; }; /*%FSM*/ + /*%FSM*/ + class Cleanup_Handler + { + priority = 8.000000; + to="Process"; + precondition = /*%FSM*/""/*%FSM*/; + condition=/*%FSM*/"((diag_tickTime - _lastObjectCleanup) > 300)"/*%FSM*/; + action=/*%FSM*/"_lastObjectCleanup = diag_tickTime;" \n + "" \n + "// TODO need better way allMissionObjects is not performant" \n + "if (_cleanupItems isEqualTo []) then {" \n + " _cleanupItems = allMissionObjects ""groundWeaponHolder"" + entities ""WeaponHolderSimulated"";" \n + "};"/*%FSM*/; + }; + /*%FSM*/ /*%FSM*/ class Cleanup { @@ -220,21 +236,6 @@ class FSM "};"/*%FSM*/; }; /*%FSM*/ - /*%FSM*/ - class Cleanup_Handler - { - priority = 8.000000; - to="Process"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"((diag_tickTime - _lastObjectCleanup) > 300)"/*%FSM*/; - action=/*%FSM*/"_lastObjectCleanup = diag_tickTime;" \n - "" \n - "// TODO need better way allMissionObjects is not performant" \n - "if (_cleanupItems isEqualTo []) then {" \n - " _cleanupItems = allMissionObjects ""groundWeaponHolder"" + entities ""WeaponHolderSimulated"";" \n - "};"/*%FSM*/; - }; - /*%FSM*/ /*%FSM*/ class Save_Vehicles { @@ -275,41 +276,12 @@ class FSM "if (_savePlayerList) then {" \n " [""PLAYERS"", (call EPOCH_fn_InstanceID), _players] call EPOCH_fnc_server_hiveSET;" \n "};" \n - "" \n + "// Group cleanup" \n "{if (units _x isEqualTo []) then {deleteGroup _x}}forEach allGroups"/*%FSM*/; }; /*%FSM*/ - /*%FSM*/ - class De_simulate_Vehicle - { - priority = 2.000000; - to="Process"; - precondition = /*%FSM*/""/*%FSM*/; - condition=/*%FSM*/"((diag_tickTime - _delayTimeDeSim) > 12)"/*%FSM*/; - action=/*%FSM*/"_delayTimeDeSim = diag_tickTime;" \n - "" \n - "if !(_activeVehicles isEqualTo []) then {" \n - " _selectedVehicle = _activeVehicles deleteAt 0;" \n - " if !(isNull _selectedVehicle) then {" \n - " _deSim = false;" \n - " if (crew _selectedVehicle isEqualTo []) then {" \n - " if ((getPos _selectedVehicle) select 2 < 1) then {" \n - " if ({isPlayer _x} count (_selectedVehicle nearEntities[[""CAManBase"", ""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 300]) == 0) then {" \n - " _selectedVehicle enableSimulationGlobal false;" \n - " _deSim = true;" \n - " };" \n - " };" \n - " };" \n - " // add vehicle to back of list for later de-simulation" \n - " if !(_deSim) then {" \n - " _activeVehicles pushBack _selectedVehicle;" \n - " };" \n - " };" \n - "};"/*%FSM*/; - }; - /*%FSM*/ - /*%FSM*/ - class Simulate_Vehicle + /*%FSM*/ + class Vehicle_and_Player { priority = 1.000000; to="Process"; @@ -317,39 +289,37 @@ class FSM condition=/*%FSM*/"((diag_tickTime - _delayTimeSim) > 5)"/*%FSM*/; action=/*%FSM*/"_delayTimeSim = diag_tickTime;" \n "_playersTemp = [];" \n - "{ " \n - " {" \n - " if !(typeOf _x in _safeVehicles) then {" \n - " if (_x call EPOCH_server_getVToken) then {" \n - " if (_simulationHandler && !(simulationEnabled _x)) then {" \n - " _x enableSimulationGlobal true;" \n - " _activeVehicles pushBack _x;" \n - " };" \n - " } else {" \n - " if ((objectCurators _x) isEqualTo []) then {" \n - " diag_log format[""DEBUG: Invalid Vehicle Token, deleted %1"",_x];" \n - " deleteVehicle _x;" \n - " };" \n - " };" \n - " };" \n - " }forEach (_x nearEntities[[""LandVehicle"", ""Ship"", ""Air"", ""Tank""], 300]);" \n + "{" \n + " private _vehicle = vehicle _x;" \n + " // if player is inside a vehicle check vehicle is in allowed safe vehicles list." \n + " if (_vehicle != _x && {!(typeOf _vehicle in _safeVehicles)}) then {" \n + " // check if vehicle has token set server side and ignore vehicle if was spawned by a Curator (zeus)" \n + " if ((objectCurators _vehicle) isEqualTo [] && {!(_vehicle call EPOCH_server_getVToken)}) then {" \n + " diag_log format[""ADMIN: Invalid Vehicle detected and deleted %1 with %2 driving"",_vehicle,_x];" \n + " deleteVehicle _vehicle;" \n + " };" \n + " };" \n "" \n - " _pUID = getPlayerUID _x;" \n + " private _pUID = getPlayerUID _x;" \n + " // Add all player UIDs to array for use later." \n + " if (_pUID != """") then { _playersTemp pushBack _pUID; };" \n "" \n - " if !(_x call EPOCH_server_isPAdmin) then {" \n - " if (isObjectHidden _x) then {" \n - " _x hideObjectGlobal false;" \n - " };" \n - " if (_pUID != """") then {" \n - " _playersTemp pushBack _pUID;" \n - " [_pUID, _x] call _checkAuth;" \n - " };" \n - " } else {" \n - " if (_pUID != """") then { _playersTemp pushBack _pUID; };" \n - " };" \n + " // If player is not admin check perform checks." \n + " if !(_x call EPOCH_server_isPAdmin) then {" \n + " // check if player is hidden and if so force back visable." \n + " if (isObjectHidden _x) then {" \n + " _x hideObjectGlobal false;" \n + " diag_log format[""ADMIN: Warning!!! player was hidden and forced visable %1"",_x];" \n + " };" \n + " // check player has authenticated with reverse token check." \n + " if (_pUID != """") then {" \n + " [_pUID, _x] call _checkAuth;" \n + " };" \n + " };" \n "" \n "}forEach allPlayers;" \n - "_players = _playersTemp;"/*%FSM*/; + "_players = _playersTemp;" \n + ""/*%FSM*/; }; /*%FSM*/ /*%FSM*/ @@ -374,8 +344,8 @@ class FSM ""/*%FSM*/; }; /*%FSM*/ - /*%FSM*/ - class Events + /*%FSM*/ + class Events_and_Resta { priority = 0.000000; to="Process"; @@ -383,30 +353,51 @@ class FSM condition=/*%FSM*/"((diag_tickTime - _pvehTime) > 20)"/*%FSM*/; action=/*%FSM*/"// Epoch Events" \n "_pvehTime = diag_tickTime;" \n + "_eventsMarkedForRemoval = [];" \n "{" \n - " _x params [""_time"", ""_scriptName"", [""_runAtStart"",0],[""_usePrePostfix"",1]];" \n - " _eventKey = format[""EPOCH_EVENT_%1"", _forEachIndex];" \n - " _lastTime = missionNamespace getVariable _eventKey;" \n - " if (isNil ""_lastTime"") then {" \n - " _startTime = diag_tickTime;" \n - " if (_runAtStart isEqualTo 1) then {" \n - " _startTime = diag_tickTime - _time;" \n - " };" \n - " missionNamespace setVariable[_eventKey, _startTime];" \n - " _lastTime = _startTime;" \n - " };" \n - " if ((diag_tickTime - _lastTime) >= _time) then {" \n - " missionNamespace setVariable[_eventKey, diag_tickTime];" \n - " _preFix = """";" \n - " _postFix = """";" \n - " if (_usePrePostfix == 1) then {" \n - " _preFix = ""\epoch_server_settings\EpochEvents\"";" \n - " _postFix = "".sqf"";" \n - " };" \n - " _handle = [] execVM format[""%1%2%3"",_preFix,_scriptName,_postFix];" \n - " diag_log format[""DEBUG: _event %1"", _scriptName];" \n - " };" \n + " _x params [""_time"", ""_scriptName"", [""_runAtStart"",0], [""_usePrePostfix"",1], [""_runNumTimes"",-1], [""_input"",[]]];" \n + " _eventKey = format[""EPOCH_EVENT_%1"", _forEachIndex];" \n + " _eventCounter = format[""EPOCH_EVENT_COUNTER_%1"", _forEachIndex];" \n + " _lastTime = missionNamespace getVariable _eventKey;" \n + " _counter = missionNamespace getVariable [_eventCounter,0];" \n + " if (isNil ""_lastTime"") then {" \n + " _startTime = diag_tickTime;" \n + " if (_runAtStart isEqualTo 1) then {" \n + " _startTime = diag_tickTime - _time;" \n + " };" \n + " missionNamespace setVariable[_eventKey, _startTime];" \n + " _lastTime = _startTime;" \n + " };" \n + " if (_counter >= _runNumTimes && _runNumTimes != -1) then {" \n + " _eventsMarkedForRemoval pushBack _forEachIndex;" \n + " } else {" \n + " if ((diag_tickTime - _lastTime) >= _time) then {" \n + " missionNamespace setVariable[_eventKey, diag_tickTime];" \n + " _preFix = """";" \n + " _postFix = """";" \n + " if (_usePrePostfix == 1) then {" \n + " _preFix = ""\epoch_server_settings\EpochEvents\"";" \n + " _postFix = "".sqf"";" \n + " };" \n + " if (_usePrePostfix == 2) then {" \n + " _preFix = ""\epoch_server_events\EpochEvents\"";" \n + " _postFix = "".sqf"";" \n + " };" \n + " _handle = _input execVM format[""%1%2%3"",_preFix,_scriptName,_postFix];" \n + " _counter = _counter + 1;" \n + " missionNamespace setVariable[_eventCounter, _counter];" \n + " diag_log format[""DEBUG: _event %1"", _scriptName];" \n + " };" \n + " };" \n "} forEach _events;" \n + "// remove expired events" \n + "" \n + "if !(_eventsMarkedForRemoval isEqualTo []) then {" \n + " {" \n + " _removed = _events deleteAt (_eventsMarkedForRemoval deleteAt _forEachIndex);" \n + " diag_log format[""DEBUG: removing event: %1"",_removed];" \n + " } forEach ([] + _eventsMarkedForRemoval);" \n + "};" \n "" \n "// restart script" \n "if (_scriptBasedRestart) then {" \n @@ -444,7 +435,6 @@ class FSM " };" \n " };" \n "};" \n - "" \n ""/*%FSM*/; }; /*%FSM*/ @@ -457,4 +447,4 @@ class FSM { }; }; -/*%FSM*/ \ No newline at end of file +/*%FSM*/ diff --git a/Sources/epoch_server_core/build.hpp b/Sources/epoch_server_core/build.hpp index 62344aa7..59864879 100644 --- a/Sources/epoch_server_core/build.hpp +++ b/Sources/epoch_server_core/build.hpp @@ -1 +1 @@ -build=757; +build=773; diff --git a/Sources/epoch_server_debris_event/EpochEvents/DynamicDebris.sqf b/Sources/epoch_server_debris_event/EpochEvents/DynamicDebris.sqf new file mode 100644 index 00000000..2ced8bf9 --- /dev/null +++ b/Sources/epoch_server_debris_event/EpochEvents/DynamicDebris.sqf @@ -0,0 +1,110 @@ +/* + Author/s: + Aaron Clark - EpochMod.com + + Description: + Spawns Debris Dynamically on Roadways. + + Improvements and or bugfixes and other contributions are welcome via the github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settings/EpochEvents/DebrisSpawner.sqf +*/ +//[[[cog import generate_private_arrays ]]] +private ["_allRoads","_debris","_debrisCounter","_debrisLocations","_debrisLocationsKey","_expiresDebris","_export","_hiveKey","_instanceID","_intersections","_marker","_maxDebrisLimit","_object","_offsetX","_offsetY","_position","_response","_rng","_seed","_selectedDebris","_worldSize"]; +//[[[end]]] + +_expiresDebris = 604800; +_debris = [ + "Land_GarbageBags_F", + "Land_GarbagePallet_F", + "Land_GarbageWashingMachine_F", + "Land_GarbageHeap_01_F", + "Land_GarbageHeap_03_F", + "Land_GarbageHeap_04_F", + "Land_Wreck_Skodovka_F", + "Land_Wreck_CarDismantled_F", + "Land_Wreck_Truck_F", + "Land_Wreck_Car2_F", + "Land_Wreck_Car_F", + "Land_Wreck_Car3_F", + "Land_Wreck_Hunter_F", + "Land_Wreck_Van_F", + "Land_Wreck_Offroad_F", + "Land_Wreck_UAZ_F", + "Land_Wreck_Ural_F", + "Land_Wreck_Truck_dropside_F", + "Land_Wreck_HMMWV_F" +]; +_debrisCounter = 0; +_worldSize = worldSize/2; +_instanceID = call EPOCH_fn_InstanceID; +_maxDebrisLimit = 500; + +_debrisLocationsKey = format ["%1:%2", _instanceID, worldname]; +_response = ["DebrisLocations", _debrisLocationsKey] call EPOCH_fnc_server_hiveGETRANGE; + +_response params [["_status",0],["_data",[]] ]; +_debrisLocations = []; +if (_status == 1 && _data isEqualType [] && !(_data isEqualTo [])) then { + _debrisLocations = _data; +} else { + diag_log format["DEBUG: Generating new Debris Locations... this is only done once every %1 days.",(_expiresDebris/86400)]; + _allRoads = [_worldSize,_worldSize] nearRoads _worldSize; + _seed = random 999999; + diag_log format["DEBUG: Generating new Debris Locations... with seed %1",_seed]; + { + _position = getPosWorld _x; + _position params ["_posX","_posY"]; + _rng = _seed random [_posX,_posY]; + if (_rng > 0.95) then { + _debrisLocations pushBack _position; + }; + } forEach _allRoads; + ["DebrisLocations", _debrisLocationsKey, _expiresDebris, _debrisLocations] call EPOCH_fnc_server_hiveSETEX; +}; + +for "_i" from 1 to _maxDebrisLimit do { + + _hiveKey = format ["%1:%2", _instanceID, _i]; + _response = ["Debris", _hiveKey] call EPOCH_fnc_server_hiveGETRANGE; + _response params [["_status",0],["_data",[]] ]; + + if (_status == 1 && _data isEqualType [] && !(_data isEqualTo [])) then { + + _data params ["_selectedDebris","_posWorld", "_vectorDir", "_vectorUp"]; + _object = createSimpleObject [_selectedDebris, _posWorld]; + _object setVectorDirAndUp [_vectorDir,_vectorUp]; + _object setPosWorld _posWorld; + _debrisCounter = _debrisCounter + 1; + + } else { + + _position = selectRandom _debrisLocations; + _debrisLocations = _debrisLocations - _position; + + _marker = createMarker[str(_position), _position]; + _marker setMarkerShape "ICON"; + _marker setMarkerType "waypoint"; + _marker setMarkerColor "ColorGreen"; + + _selectedDebris = selectRandom _debris; + _offsetX = (random 10) - 5; + _offsetY = (random 10) - 5; + _position set [0,(_position select 0) + _offsetX]; + _position set [1,(_position select 1) + _offsetY]; + _position set [2,0]; + + _intersections = lineIntersectsSurfaces [[_position select 0,_position select 1,1000], _position, objNull, objNull, true, 1]; + if !(_intersections isEqualTo []) then { + (_intersections select 0) params ["_intersectPosASL","_surfaceNormal","_intersectObject","_parentObject"]; + _object = createSimpleObject [_selectedDebris, _intersectPosASL]; + _object setDir random 360; + _object setVectorUp _surfaceNormal; + _object setPosASL _intersectPosASL; + _export = [_selectedDebris,getPosWorld _object, vectorDir _object, vectorUp _object]; + ["Debris", _hiveKey, _expiresDebris, _export] call EPOCH_fnc_server_hiveSETEX; + _debrisCounter = _debrisCounter + 1; + }; + }; +}; + +EP = _debrisCounter; diff --git a/Sources/epoch_server_debris_event/build.hpp b/Sources/epoch_server_debris_event/build.hpp new file mode 100644 index 00000000..59864879 --- /dev/null +++ b/Sources/epoch_server_debris_event/build.hpp @@ -0,0 +1 @@ +build=773; diff --git a/Sources/epoch_server_debris_event/config.cpp b/Sources/epoch_server_debris_event/config.cpp new file mode 100644 index 00000000..a474dd72 --- /dev/null +++ b/Sources/epoch_server_debris_event/config.cpp @@ -0,0 +1,37 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + Epoch Server Event (DynamicDebris) + + Licence: + Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike + + Github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settngs/config.cpp +*/ + +#define _ARMA_ + +class CfgPatches { + class A3_server_debris_event { + requiredVersion = 0.1; + requiredAddons[] = {"A3_server_events"}; + #include "build.hpp" + }; +}; + +// import settings +class CfgEpochServerEvents +{ + class DynamicDebris { + delay = 120; // delay in seconds between executions , + script = "\epoch_server_debris_event\EpochEvents\DynamicDebris.sqf"; // script: name or full path if usePrefix is set to 0 + runOnStart = 1; // runOnStart: 1 = run script at startup, 0 normal delay + usePrefix = 0; // usePrefix: 1 = pre/postfix path (use if file is inside epoch settings pbo EpochEvents folder), 2 = pre/postfix path (use if file inside epoch events pbo EpochEvents folder), 0 = use full file path + runNumTimes = 1; // runNumTimes: -1 = no limit, 0 = disabled, 1+ = number of times to execute before removing event. + input[] = {}; // array input to execVM at time of run and accessed with _this inside of script. + }; +}; diff --git a/Sources/epoch_server_debris_event/license.txt b/Sources/epoch_server_debris_event/license.txt new file mode 100644 index 00000000..35440e4b --- /dev/null +++ b/Sources/epoch_server_debris_event/license.txt @@ -0,0 +1,9 @@ +Epoch Mod for Arma 3 +http://epochmod.com +by Epoch Mod Team +https://github.com/EpochModTeam/Epoch + +The contents of this pbo are under the following license: +http://www.bistudio.com/community/licenses/arma-public-license-share-alike + +Keep this file and file headers with attribution intact for proper use. \ No newline at end of file diff --git a/Sources/epoch_server_debris_event/treeView.txt b/Sources/epoch_server_debris_event/treeView.txt new file mode 100644 index 00000000..b6fdaf30 Binary files /dev/null and b/Sources/epoch_server_debris_event/treeView.txt differ diff --git a/Sources/epoch_server_events/build.hpp b/Sources/epoch_server_events/build.hpp new file mode 100644 index 00000000..59864879 --- /dev/null +++ b/Sources/epoch_server_events/build.hpp @@ -0,0 +1 @@ +build=773; diff --git a/Sources/epoch_server_events/config.cpp b/Sources/epoch_server_events/config.cpp new file mode 100644 index 00000000..1d9d43f9 --- /dev/null +++ b/Sources/epoch_server_events/config.cpp @@ -0,0 +1,47 @@ +/* + Author: Aaron Clark - EpochMod.com + + Contributors: + + Description: + BASE Epoch Server Events !!!DO NOT EDIT THIS FILE!!! Copy the epoch_server_debris_event to make new ones. + + Licence: + Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike + + Github: + https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server_settngs/config.cpp +*/ + +#define _ARMA_ + +class CfgPatches { + class A3_server_events { + requiredVersion = 0.1; + requiredAddons[] = {}; + #include "build.hpp" + }; +}; + +// import settings +class CfgEpochServerEvents +{ + /* EXAMPLES ONLY !!! DO NOT EDIT THIS FILE make a copy of the Dynamic Debris Event !!! + class ContainerSpawner { + delay = 1200; // delay in seconds between executions , + script = "\epoch_server_events\EpochEvents\ContainerSpawner.sqf"; // script: name or full path if usePrefix is set to 0 + runOnStart = 0; // runOnStart: 1 = run script at startup, 0 normal delay + usePrefix = 0; // usePrefix: 1 = use pre/postfix path (inside epoch settings pbo EpochEvents folder) 0 = use full file path + runNumTimes = -1; // runNumTimes: -1 = no limit, 0 = disabled, 1+ = number of times to execute before removing event. + input[] = {}; // array input to execVM at time of run and accessed with _this inside of script. + }; + class AirDrop { + delay = 2700; // delay in seconds between executions , + script = "AirDrop"; // script: name or full path if usePrefix is set to 0 + runOnStart = 0; // runOnStart: 1 = run script at startup, 0 normal delay + usePrefix = 2; // usePrefix: 1 = use pre/postfix path (inside epoch settings pbo EpochEvents folder) 0 = use full file path + runNumTimes = -1; // runNumTimes: -1 = no limit, 0 = disabled, 1+ = number of times to execute before removing event. + input[] = {}; // array input to execVM at time of run and accessed with _this inside of script. + }; + */ +}; diff --git a/Sources/epoch_server_events/license.txt b/Sources/epoch_server_events/license.txt new file mode 100644 index 00000000..35440e4b --- /dev/null +++ b/Sources/epoch_server_events/license.txt @@ -0,0 +1,9 @@ +Epoch Mod for Arma 3 +http://epochmod.com +by Epoch Mod Team +https://github.com/EpochModTeam/Epoch + +The contents of this pbo are under the following license: +http://www.bistudio.com/community/licenses/arma-public-license-share-alike + +Keep this file and file headers with attribution intact for proper use. \ No newline at end of file diff --git a/Sources/epoch_server_events/treeView.txt b/Sources/epoch_server_events/treeView.txt new file mode 100644 index 00000000..855c3796 Binary files /dev/null and b/Sources/epoch_server_events/treeView.txt differ diff --git a/Sources/epoch_server_settings/build.hpp b/Sources/epoch_server_settings/build.hpp index 62344aa7..59864879 100644 --- a/Sources/epoch_server_settings/build.hpp +++ b/Sources/epoch_server_settings/build.hpp @@ -1 +1 @@ -build=757; +build=773; diff --git a/Sources/epoch_server_settings/configs/security/security_checks.h b/Sources/epoch_server_settings/configs/security/security_checks.h index b8a07b86..26caadc2 100644 --- a/Sources/epoch_server_settings/configs/security/security_checks.h +++ b/Sources/epoch_server_settings/configs/security/security_checks.h @@ -16,6 +16,10 @@ class CfgSecConf { debug = "false"; + class vehicles { + safeVehicles[] = {"I_UAV_01_F","B_Heli_Transport_01_F","Steerable_Parachute_F","NonSteerable_Parachute_F","Land_Camping_Light_F","container_epoch"}; + }; + class remoteExecClient{ functions[] = {"bankBalance", "resetGroup", "groupUpdate", "groupUidUpdate", "healPlayer","tradeComplete"}; // code diff --git a/Sources/mpmissions/epoch.Altis/treeView.txt b/Sources/mpmissions/epoch.Altis/treeView.txt index b14aebcc..b1f42065 100644 Binary files a/Sources/mpmissions/epoch.Altis/treeView.txt and b/Sources/mpmissions/epoch.Altis/treeView.txt differ diff --git a/build.txt b/build.txt index 39071e3e..88483ae8 100644 --- a/build.txt +++ b/build.txt @@ -1 +1 @@ -757 +773