diff --git a/Changelogs/0.3.8.0.txt b/Changelogs/0.3.8.0.txt
index 4bb28a94..8c513452 100644
--- a/Changelogs/0.3.8.0.txt
+++ b/Changelogs/0.3.8.0.txt
@@ -55,7 +55,8 @@ Build: 439
[Changed] Increased range for vehicle interactions to fix issues with access to larger vehicles. Thanks to Grahame for the report: http://epochmod.com/forum/index.php?/topic/41894-cannot-unlock-large-vehicles/
[Changed] Preloading sapper by spawning one on the map at server start.
[Changed] Change to github markdown for credits and license.
-[Fixed] BE kick since 1.58 hotfix.
+[Fixed] suppress loot spawning at main traders. Thanks to Ghostrider-DbD- for the report. http://epochmod.com/forum/topic/41954-loot-spawning-at-traders/
+[Fixed] BE kick since 1.58 hotfix. http://epochmod.com/forum/topic/41961-rscdebugconsole_watch-battleye-kick/?do=findComment&comment=275456
[Fixed] Use object as input for remoteExec instead of owner. http://epochmod.com/forum/topic/41959-be-carefull-with-remoteexec-and-owner/
[Fixed] Attempt fix issues with temporary angle and rotation issues with base building.
[Fixed] Check for base kit item is in players inventory before spawning ghost.
diff --git a/Changelogs/0.3.9.0.txt b/Changelogs/0.3.9.0.txt
new file mode 100644
index 00000000..f49fd334
--- /dev/null
+++ b/Changelogs/0.3.9.0.txt
@@ -0,0 +1,25 @@
+[Added] Player option to Morph into a random antagonist (from deathMorphClass) after death. The array 'deathMorphClass' found in CfgEpochClient can be used to specify what antagonists to randomly spawn.
+[Added] Player option to detonate body after death. Sacrifice yourself by generating a runaway thermal cascade using the nano bots within your body. Nothing left to revive.
+[Added] Server function to allow remote exec of setVariable on client - Allows client to ask another client to set a local variable, via the server. Server can run same function.
+[Changed] Sapper groan or detonate can be triggered by setting a variable on the target or sapper.
+[Changed] Server can be asked by a client / server to trigger an antagonist on another client. Antagonist is then run on target PC, independent from caller of function.
+[Changed] Epoch Unit Spawn code. Now can be called specifying the target of the antagonist. Antagonist will run on target client PC.
+[Changed] Sapper defaults tweaked to make them more responsive.
+[Changed] New Sapper antagonist config options:
+reflexSpeed - Set the loop pause. Defaults have been lowered to make sapper more responsive.
+nestChance - A percentage chance, at each sapper spawn, that he will create a nest.
+hideLevel - (Fear Emotion) Set level at which sapper will go into hiding based on fear of armed players, being shot near etc.
+chargeLevel - (Anger Emotion) Set level at which sapper will trigger 'charge the player' mode.
+[Changed] New UAV Support Troops antagonist config options:
+unitTypes - an array of soldier classes to randomly choose from. Custom weapons to-do, use soldiers with default weapon loadout or handle weapons with custom script.
+maxUnitNum - Maximum number of units to spawn per UAV.
+minAISkill - Minimum value for any AI skill.
+maxAimingAccuracy -> maxGeneral - Set the maximum value for each available AI skill. A random number between minAISkill and the value for each will be set as that skill.
+[Fixed] Prevent empty group menu display. Thanks to He-Man! for the fix.
+[Fixed] Group system marked player as "Dead Player" if moderator status was change while player offline. Thanks to He-Man! for the fix.
+[Fixed] Group system invite and kick from group options not working. Thanks to He-Man for the fixes: http://epochmod.com/forum/topic/41893-group-menu-broken-kick-invite-for-admin-not-possible/#comment-275429
+[Fixed] Missing texture issues with some base building objects since 0.3.8.
+[Info] RConPort 2306 added to example-beserver.cfg for changes since A3 1.58.
+[Info] Removed old .bikey and added new one for 0390.
+[Info] Requires Arma 3 1.58 or higher.
+[Info] A big thanks to Isaac, Axeman's chief tester.
diff --git a/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo b/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo
index f8684d92..5da1437b 100644
Binary files a/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo and b/Server_Install_Pack/@epochhive/addons/a3_epoch_server.pbo differ
diff --git a/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo b/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo
index 11514ac8..f1f572b1 100644
Binary files a/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo and b/Server_Install_Pack/@epochhive/addons/a3_epoch_server_settings.pbo differ
diff --git a/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo b/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo
index 6ad3db9d..8d9f34f1 100644
Binary files a/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo and b/Server_Install_Pack/@epochhive/addons/epoch_server_core.pbo differ
diff --git a/Server_Install_Pack/@epochhive/epochah.hpp b/Server_Install_Pack/@epochhive/epochah.hpp
index 9e2e337f..1dcf5ac3 100644
--- a/Server_Install_Pack/@epochhive/epochah.hpp
+++ b/Server_Install_Pack/@epochhive/epochah.hpp
@@ -2,11 +2,18 @@
antihack_Enabled = true; // built-in Anti-Hack
antihack_cfgPatchesCheck = true; // cfgPatches (AddOn Check)
antihack_PVSPrefix = "EPAH_"; // used to help whitelist pveh variables in BE without BEC and watchdog, leave blank to use no prefix.
-antihack_cfgPatchesCfg[] = {0}; // 0 == BAN - 1 = LOG
+antihack_cfgPatchesMode[] = {2}; // 0 == BAN - 1 = LOG, 2 = KICK
antihack_ahInitAuthCfg[] = {0,180}; // 0 == BAN - 1 = LOG, 60 = ban or log if anti hack is not started in 180 seconds
antihack_whitelistedCfgPatches[] = {"A3Data","A3_BaseConfig_F","A3_Dubbing_Radio_F","A3_Functions_F","A3_Functions_F_EPA","A3_Functions_F_EPC","A3_Language_F_MP_Mark","A3_LanguageMissions_F_MP_Mark","Map_VR","A3_Map_VR_Scenes","CUP_A10_Data","CUP_Afghan_Data","CUP_Air2_Data","CUP_Air3_Data","CUP_Air_Data","CUP_Air_d_baf_Data","CUP_Air_e_Data","CUP_Air_pmc_Data","CUP_CA_animals2","CA_animals2","CUP_Animations_Data","CUP_Animations_Config","CUP_Bohemia_Data","CUP_Bootcamp_acr_Data","CUP_Buildings2_Data","CUP_Buildings2_Ind_Cementworks_Data","CUP_Buildings_Data","CUP_Ca_acr_Data","CUP_CA_Config","CAData","CUP_Ca_e_Data","CUP_Ca_pmc_Data","CUP_Characters2_Data","CUP_Chernarus_Data","CUP_Chernarus_Summer_Data","CUP_Cti_buildings_Data","CUP_CA_Data","CUP_CAData_ParticleEffects","CAData_ParticleEffects","CUP_Data_baf_Data","CUP_dbe1_data","CUP_Desert2_Data","CUP_Desert2_Objects","Desert2_Objects","CUP_Desert_Data","CUP_Desert_e_Data","CUP_Hotfix_Data","CUP_L39_Data","CUP_CALanguage","CALanguage","CUP_CALanguage_ACR","CALanguage_ACR","CUP_CALanguage_missions","CALanguage_missions","CUP_CALanguage_missions_e","CALanguage_missions_e","CUP_Misc3_Data","CUP_CAMisc","CUP_Misc_Data","CAMisc","CUP_Misc_acr_Data","CUP_Misc_e_Data","CUP_CA_MPA","CA_MPA","CUP_CA_Plants2_Clutter","CA_Plants2_Clutter","CUP_CAPlants","CAPlants","CUP_CA_Plants_E_Clutter","CA_Plants_E_Clutter","CUP_Provinggrounds_pmc_Data","CUP_CARoads2","CARoads2","CUP_CARoads2Dam","CARoads2Dam","CUP_CARoads","CARoads","CUP_CARoads_E","CARoads_E","CUP_CARoads_PMC","CARoads_PMC","CUP_CARocks2","CARocks2","CUP_CARocks","CARocks","CUP_CARocks_E","CARocks_E","CUP_Sara_Data","CUP_Saralite_Data","CUP_Shapur_baf_Data","CUP_CASigns","CASigns","CUP_CASigns_E","CASigns_E","CUP_Sounds_Data","CUP_Sounds_Config","CASounds","CUP_Sounds_e_Data","CUP_Structures_Data","CUP_pond_test","pond_test","CUP_Structures_e_Data","CUP_Structures_pmc_Data","CUP_Takistan_Data","CUP_Tracked2_Data","CUP_Tracked_Data","CUP_Tracked_e_Data","CUP_CAFonts","CAFonts","CUP_Utes_Data","CUP_Water2_Data","CUP_Water_Data","CUP_Weapons2_Data","CUP_Weapons_Data","CUP_Weapons_e_Data","CUP_Weapons_pmc_Data","CUP_Wheeled2_Data","CUP_Wheeled_Data","CUP_Wheeled_e_Data","CUP_Zargabad_Data","CUP_A1AlwaysDummy","CAVideo2_PMC","CA_AnimsHotfix","CA_CutSceneAnims","CAIntroAnims","CAUSMCD","CAVoice","CAweapons3_aks74pso","CAWeapons3_ammocrates","CAweapons3_ksvk","CAweapons3_m107","CAweapons3_m16a4_acg_gl","CAweapons3_m16a4_acg","CAweapons3_m16a4_gl","CAweapons3_m16a4","CAWeapons3","CTI_buildingsBmp2_hq","CTI_buildingsM113_hq","DSHkM_Mini","M2HD_Mini","MK19_Tripod","Warfare","WarfareBuildings_Stinger_Twice_static","WarfareBuildings_T72_RACS","WarfareBuildings_TOW_Tripod","CUP_AiA_compat","AiA_A1AlwaysDummy","AiA_Afghan_Config","AiA_Afghan_Data","AiA_BaseConfig_F","AiA_Bohemia_Config","AiA_Bohemia_Data","AiA_Bootcamp_acr_Config","AiA_Bootcamp_acr_Data","AiA_Buildings_Config","AiA_Buildings_Data","AiA_Buildings2_Config","AiA_Buildings2_Data","AiA_Buildings2_Ind_Cementworks_Config","AiA_Buildings2_Ind_Cementworks_Data","AiA_Ca_acr_Config","AiA_Ca_acr_Data","AiA_CA_Config","AiA_CA_Config_Data_ParticleEffects","AiA_CA_Data","AiA_Ca_e_Config","AiA_Ca_e_Data","AiA_Ca_pmc_Config","AiA_Ca_pmc_Data","AiA_CBA_A2_xeh_Dummy","AiA_CBA_OA_xeh_Dummy","AiA_cba_xeh_a2_Dummy","AiA_cba_xeh_oa_Dummy","AiA_Chernarus_Config","AiA_Chernarus_Data","AiA_Chernarus_Summer_Config","AiA_Chernarus_Summer_Data","AiA_Core","AiA_Cti_buildings_Config","AiA_Cti_buildings_Data","AiA_Data_baf_Config","AiA_Data_baf_Data","AiA_Desert_Config","AiA_Desert_Data","AiA_Desert_e_Config","AiA_Desert_e_Data","AiA_Desert2_Config","AiA_Desert2_Data","AiA_Hotfix_Config","AiA_Hotfix_Data","AiA_Language_acr_Config","AiA_Language_acr_Data","AiA_Language_baf_Config","AiA_Language_baf_Data","AiA_Language_e_Config","AiA_Language_e_Data","AiA_Language_pmc_Config","AiA_Language_pmc_Data","AiA_Languagemissions_acr_Config","AiA_Languagemissions_acr_Data","AiA_Languagemissions_baf_Config","AiA_Languagemissions_baf_Data","AiA_Languagemissions_pmc_Config","AiA_Languagemissions_pmc_Data","AiA_Misc_acr_Config","AiA_Misc_acr_Data","AiA_Misc_Config","AiA_Misc_Data","AiA_Misc_e_Config","AiA_Misc_e_Data","AiA_Misc2_Config","AiA_Misc2_Data","AiA_Misc3_Config","AiA_Misc3_Data","AiA_Models_DBE1_Config","AiA_Models_DBE1_Data","AiA_Plants_Config","AiA_Plants_Data","AiA_Plants_e_Config","AiA_Plants_e_Data","AiA_Plants_e2_Config","AiA_Plants_e2_Data","AiA_Plants_pmc_Config","AiA_Plants_pmc_Data","AiA_Plants2_Bush_Config","AiA_Plants2_Bush_Data","AiA_Plants2_Clutter_Config","AiA_Plants2_Clutter_Data","AiA_Plants2_Misc_Config","AiA_Plants2_Misc_Data","AiA_Plants2_Plant_Config","AiA_Plants2_Plant_Data","AiA_Plants2_Tree_Config","AiA_Plants2_Tree_Data","AiA_Provinggrounds_pmc_Config","AiA_Provinggrounds_pmc_Data","AiA_Roads_Config","AiA_Roads_Data","AiA_Roads_e_Config","AiA_Roads_e_Data","AiA_Roads_pmc_Config","AiA_Roads_pmc_Data","AiA_Roads2_Config","AiA_Roads2_Data","AiA_Rocks_Config","AiA_Rocks_Data","AiA_Rocks_e_Config","AiA_Rocks_e_Data","AiA_Rocks2_Config","AiA_Rocks2_Data","AiA_Sara_Config","AiA_Sara_Data","AiA_Sara_dbe1_Config","AiA_Sara_dbe1_Data","AiA_Saralite_Config","AiA_Saralite_Data","AiA_Shapur_baf_Config","AiA_Shapur_baf_Data","AiA_Signs_Config","AiA_Signs_Data","AiA_Signs_e_Config","AiA_Signs_e_Data","AiA_Signs2_Config","AiA_Signs2_Data","AiA_Sounds_Config","AiA_Sounds_Data","AiA_StandaloneTerrainPack_Core","AiA_StandaloneTerrains_Core","AiA_Structures_Config","AiA_Structures_Data","AiA_Structures_e_Config","AiA_Structures_e_Data","AiA_Structures_pmc_Config","AiA_Structures_pmc_Data","AiA_Takistan_Config","AiA_Takistan_Data","AiA_Ui_Config","AiA_Ui_Data","AiA_Utes_Config","AiA_Utes_Data","AiA_Water_Config","AiA_Water_Data","AiA_Water2_Config","AiA_Water2_Data","AiA_Weapons_Config","AiA_Weapons_Data","AiA_Weapons_e_Config","AiA_Weapons_e_Data","AiA_Weapons_pmc_Config","AiA_Weapons_pmc_Data","AiA_Weapons2_Config","AiA_Weapons2_Data","AiA_Wheeled_Config","AiA_Wheeled_Data","AiA_Wheeled_e_Config","AiA_Wheeled_e_Data","AiA_Wheeled2_Config","AiA_Wheeled2_Data","AiA_Worlds","AiA_Worlds_Ambient","AiA_Worlds_Author","AiA_Worlds_Clutter","AiA_Worlds_ClutterDist","AiA_Worlds_Delete","AiA_Worlds_DisableInfiniteTerrain","AiA_Worlds_DustEffects","AiA_Worlds_EnvSounds","AiA_Worlds_FullDetailDist","AiA_Worlds_Grid","AiA_Worlds_Intros","AiA_Worlds_Lighting","AiA_Worlds_Lighting_Chernarus","AiA_Worlds_Lighting_Desert","AiA_Worlds_MapSize","AiA_Worlds_MidDetailTexture","AiA_Worlds_NoDetailDist","AiA_Worlds_Seabed","AiA_Worlds_SkyTexture","AiA_Worlds_StreetLamp","AiA_Worlds_Surfaces","AiA_Worlds_Water","AiA_Zargabad_Config","AiA_Zargabad_Data","CUP_StandaloneTerrains_Dummy","CA_ACR","CA_Animals2_Anim_Config","CA_Anims_Char","CA_Anims_E_Wmn","CA_E","CA_PMC","CAAir","CACharacters","CATracked","CAWater","CAWater2","CAWater2_seafox","CAWeapons","CAWeapons_Warfare_weapons","CAWheeled","CAWheeled_E","CAWheeled2","6G30_DBE1","Arma2_Ka52","BI_SRRS","CA_AH64D","CA_AIR_E_MQ9PredatorB","CA_AIR_E_Su25","CA_AIR2_Su25","CA_Animals_E","CA_Animals2_Chicken","CA_Animals2_Cow","CA_Animals2_Dogs","CA_Animals2_Dogs_Fin","CA_Animals2_Dogs_Pastor","CA_Animals2_Goat","CA_Animals2_Rabbit","CA_Animals2_Sheep","CA_Animals2_WildBoar","CA_Anims","CA_Anims_E","CA_Anims_E_Sdr","CA_Anims_Sdr","CA_Anims_Wmn","CA_CommunityConfigurationProject_E","CA_CruiseMissile","CA_Dubbing","CA_Dubbing_Baf","CA_Dubbing_Counterattack","CA_Dubbing_E","CA_Dubbing_PMC","CA_DubbingRadio_E","CA_DubbingRadio_PMC","CA_E_ParticleEffects","CA_Editor","CA_HC_Sounds","CA_Heads","CA_HighCommand","CA_L39","CA_Missions","CA_Missions_AlternativeInjurySimulation","CA_Missions_AmbientCombat","CA_Missions_Armory1","CA_Missions_Armory2","CA_Missions_BAF","CA_Missions_BAF_2","CA_Missions_BAF_Templates_SecOps","CA_Missions_BattlefieldClearance","CA_Missions_E","CA_Missions_E_Armory2","CA_Missions_E_SecOps","CA_Missions_E_Templates_SecOps","CA_Missions_FirstAidSystem","CA_Missions_GarbageCollector","CA_Missions_PMC","CA_Missions_SecOps","CA_Missions_Templates_SecOps","CA_Missions2_PMC","CA_Modules","CA_Modules_Alice","CA_Modules_Animals","CA_Modules_ARTY","CA_Modules_clouds","CA_Modules_Coin","CA_Modules_DynO","CA_Modules_E","CA_Modules_E_DynO","CA_Modules_E_Jukebox","CA_Modules_E_OO","CA_Modules_E_UAV","CA_Modules_E_UAV_Heli","CA_Modules_E_Weather","CA_Modules_Functions","CA_Modules_Marta","CA_Modules_PMC","CA_Modules_PMC_SimpleFIrstAid","CA_Modules_Silvie","CA_Modules_StratLayer","CA_Modules_UAV","CA_Modules_ZoRA","CA_MPA_Challenges","CA_MPA_Core","CA_MPA_MP","CA_MPA_Scenarios","CA_Sounds_Baf","CA_SoundsMissions_E","CA_Support","CAA10","CAAir_BAF","CAAir_BAF_CH_47F","CAAir_E","CAAir_E_A10","CAAir_E_AH64D","CAAir_E_AH6J","CAAir_E_An2","CAAir_E_C130J","CAAir_E_CH_47F","CAAir_E_Halo","CAAir_E_Mi24","CAAir_E_MI8","CAAir_E_UH1H_EP1","CAAir_E_UH60M","CAAir_PMC","CAAir_PMC_KA137","CAAir_PMC_KA60","CAAir2","CAAir2_C130J","CAAir2_ChukarTarget","CAAir2_F35B","CAAir2_MQ9PredatorB","CAAir2_MV22","CAAir2_Pchela1T","CAAir2_UH1Y","CAAir3","CAAir3_Su34","CAAnimals","CACharacters_BAF","CACharacters_BAF_Head","CACharacters_E","CACharacters_E_Head","CACharacters_PMC","CACharacters_PMC_Head","CACharacters_W_BAF","CACharacters2","CAMisc_fix","CAMisc_fix_A2FREE","CAMisc_fix_air","CAMisc_fix_Ch2","CAMisc_fix_Str","CAMisc_fix_Weap","CAMusic","CAMusic_E","CAMusic_PMC","CASounds_E","CASounds_Missions","CATracked_BAF","CATracked_E","CATracked_E_BMP2","CATracked_E_M1_Abrams","CATracked_E_M113","CATracked_E_M2A2_Bradley","CATracked_E_T34","CATracked_E_T55","CATracked_E_T72","CATracked_E_us_m270mlrs","CATracked_E_ZSU","CATracked_W_BAF","CATracked2","CATracked2_2S6M_Tunguska","CATracked2_AAV","CATracked2_BMP3","CATracked2_T34","CATracked2_T90","CATracked2_us_m270mlrs","CAWater2_Destroyer","CAWater2_fishing_boat","CAWater2_Fregata","CAWater2_smallboat_1","CAWeapons_2b14_82mm_Mortar","CAWeapons_AK","CAWeapons_AmmoBoxes","CAWeapons_BAF","CAWeapons_bizon","CAWeapons_Colt1911","CAWeapons_DMR","CAWeapons_E","CAWeapons_E_AGS","CAWeapons_E_AK","CAWeapons_E_AmmoBoxes","CAWeapons_E_Colt1911","CAWeapons_E_D30","CAWeapons_E_DSHKM","CAWeapons_E_FIM92_static","CAWeapons_E_fnfal","CAWeapons_E_G36","CAWeapons_E_GrenadeLauncher","CAWeapons_E_Igla","CAWeapons_E_Javelin","CAWeapons_E_KORD","CAWeapons_E_ksvk","CAWeapons_E_LeeEnfield","CAweapons_E_m107","CAWeapons_E_M110","CAWeapons_E_M119_Howitzer","CAWeapons_E_M136","CAWeapons_E_M14","CAWeapons_E_M16","CAWeapons_E_M240","CAWeapons_E_M252_81mm_Mortar","CAWeapons_E_M2StaticMG","CAWeapons_E_M47","CAWeapons_E_M9","CAWeapons_E_MAAWS","CAWeapons_E_Makarov","CAWeapons_E_Metis","CAWeapons_E_Mk19_MiniTriPod","CAWeapons_E_PK","CAWeapons_E_Podnos_2b14_82mm","CAWeapons_E_RPG18","CAWeapons_E_RPG7","CAWeapons_E_scar","CAWeapons_E_Searchlight","CAWeapons_E_SPG9","CAWeapons_E_STATIC","CAWeapons_E_Stinger","CAWeapons_E_Strela","CAWeapons_E_TOW","CAWeapons_E_ZU23","CAWeapons_Kord","CAweapons_ksvk","CAWeapons_M1014","CAweapons_m107","CAWeapons_M252_81mm_Mortar","CAWeapons_Metis_AT_13","CAWeapons_PMC","CAWeapons_PMC_AA_12","CAWeapons_PMC_AS50","CAWeapons_PMC_XM8","CAWeapons_Saiga12K","CAWeapons_SPG9","CAWeapons_VSS_vintorez","CAWeapons_ZU23","CAWeapons2","CAWeapons2_HuntingRifle","CAWeapons2_RPG18","CAWeapons2_SMAW","CAWheeled_D_BAF","CAWheeled_E_ATV","CAWheeled_E_BRDM2","CAWheeled_E_BTR40","CAWheeled_E_BTR60","CAWheeled_E_HMMWV","CAWheeled_E_Ikarus","CAWheeled_E_LADA","CAWheeled_E_LandRover","CAWheeled_E_M1030","CAWheeled_E_MTVR","CAWheeled_E_Offroad","CAWheeled_E_Old_bike","CAWheeled_E_Old_moto","CAWheeled_E_Pickup","CAWheeled_E_s1203","CAWheeled_E_SCUD","CAWheeled_E_stryker","CAWheeled_E_SUV","CAWheeled_E_TT650","CAWheeled_E_UAZ","CAWheeled_E_Ural","CAWheeled_E_V3S","CAWheeled_E_Volha","CAWheeled_Offroad","CAWheeled_Pickup","CAWheeled_PMC","CAWheeled_PMC_ArmoredSUV","CAWheeled_W_BAF","CAWheeled2_BTR90","CAWheeled2_GAZ39371","CAWheeled2_HMMWV_Ambulance","CAWheeled2_HMMWV_BASE","CAWheeled2_Ikarus","CAWheeled2_Kamaz","CAWheeled2_LADA","CAWheeled2_LAV25","CAWheeled2_M1114_Armored","CAWheeled2_M998A2_Avenger","CAWheeled2_MMT","CAWheeled2_MTVR","CAWheeled2_TowingTractor","CAWheeled2_V3S","CAWheeled2_VWGolf","CAWheeled3","CAWheeled3_M1030","CAWheeled3_TT650","Datsun_armed_DBE1","DBE1","DBE1_UI","DC3_DBE1","HALO_Test","Hilux_armed_DBE1","Warfare2","Warfare2_E","Warfare2Vehicles","CUP_Models_DBE1_Data","CUP_Anims_DBE1","Anims_DBE1","CUP_HMMWV_DBE1","HMMWV_DBE1","CUP_Mercenary_DBE1","Mercenary_DBE1","CUP_Misc_DBE1","Misc_DBE1","CUP_Music_DBE1","Music_DBE1","CUP_NPCs_DBE1","NPCs_DBE1","CUP_ploty_DBE1","ploty_DBE1","CUP_Prisoners_DBE1","Prisoners_DBE1","CUP_Roads_DBE1","Roads_DBE1","CUP_UH60Desert","UH60Desert","CUP_Sara_dbe1_Data","CUP_TKOH_Dummy","HSim_Data_H","HSim_Data_H_data_ParticleEffects","HSim_Data_H_data_ParticleEffects_rotor_blades","HSim_Dubbing_H","HSim_DubbingRadio_H","HSim_Editor_H","Intro_Island_H","HSim_Missions_H","HSim_ModulesCore_H","HSim_ModulesCore_H_AmbientCombat","HSim_ModulesCore_H_DynO","HSim_ModulesCore_H_Functions","HSim_ModulesCore_H_GarbageCollector","HSim_ModulesCore_H_Functions_E","HSim_ModulesCore_H_OO","HSim_ModulesCore_H_Functions_PMC","HSim_Music_H","HSim_Sounds_H","South_Asia_H","HSim_UIFonts_H","United_States_H","HSim_Animals_H","HSim_Animals_H_Anim_Config","HSim_Animals_H_Dog","HSim_Characters_H_Faces","HSim_Characters_H_Heads","HSim_Modules_H","HSim_UI_H","HSim_Weapons_H","HSim_Weapons_H_AK47","HSim_Weapons_H_DShKM","HSim_Weapons_H_Glock","HSim_Weapons_H_HandItems","HSim_Weapons_H_M16","HSim_Weapons_US_H","HSim_Characters_H","HSim_Characters_US_H","HSim_Missions_H_FreeFlight","HSim_Functions_Base_H","HSim_Water_H","HSim_Water_H_Civ_FishingBoat_Large","HSim_Water_H_Civ_Jetboat","HSim_Water_H_Civ_Yacht","HSim_Water_H_Container_Ship","HSim_Water_H_Cruise_Ship","HSim_Water_H_Destroyer","HSim_Water_H_Fishing_Boat","HSim_Water_H_Fregata","HSim_Water_H_LHD","HSim_Water_H_Oil_tanker","HSim_Water_H_Rubber_Boat","HSim_Water_H_Whales","HSim_Water_H_Whales_GreyWhale","HSim_Water_H_Whales_Whale1","HSim_Weapons_H_IGLA","HSim_Weapons_US_H_M2","HSim_Wheeled_H","HSim_Wheeled_H_Ambulance","HSim_Wheeled_H_FireTruck","HSim_Wheeled_H_Hatchback","HSim_Wheeled_H_Military_Offroad_LR","HSim_Wheeled_H_Military_Pickup_DSHKM","HSim_Wheeled_H_Offroad","HSim_Wheeled_H_Police_Car","HSim_Wheeled_H_TowingTractor","HSim_Wheeled_H_Tractor","HSim_Wheeled_H_Trailers","HSim_Wheeled_H_Truck_Light_Transport","HSim_Wheeled_H_Ural","HSim_Wheeled_H_Van_Passenger","HSim_Wheeled_US_H","HSim_Wheeled_US_H_Military_Offroad","HSim_Wheeled_US_H_Military_Truck","HSim_Wheeled_US_H_Pickup_01","HSim_Wheeled_US_H_Pickup_02","HSim_Wheeled_US_H_SUV","HSim_Wheeled_US_H_Truck_US_Type","HSim_Air_H","HSim_Air_H_Aircraft_A","HSim_Air_H_Aircraft_C","HSim_Air_H_Aircraft_D","HSim_Air_H_Aircraft_E_H","HSim_Air_H_Airliner_A","HSim_Air_H_Airliner_B","HSim_Air_H_Parachute","HSim_Air_US_H","HSim_Air_US_H_Helicopters_Heavy","HSim_Air_US_H_Helicopters_Light","HSim_Air_US_H_Helicopters_Medium","HSim_Misc_H","HSim_Misc_H_Antena","HSim_Misc_H_Barels","HSim_Misc_H_Bleacher","HSim_Misc_H_BoardsPack","HSim_Misc_H_CncBlock","HSim_Misc_H_Doghouse","HSim_Misc_H_Engine_Crane","HSim_Misc_H_Fence","HSim_Misc_H_Fire_Extinguisher","HSim_Misc_H_Fire_Suppression","HSim_Misc_H_First_Aid","HSim_Misc_H_Flagpole","HSim_Misc_H_Folding_Ladder","HSim_Misc_H_FuelCan","HSim_Misc_H_Heliport_Furniture","HSim_Misc_H_Helicopter_Parts","HSim_Misc_H_Helipads","HSim_Misc_H_Heliport_Objects","HSim_Misc_H_Helpers","HSim_Misc_H_Info_Board","HSim_Misc_H_Infostands","HSim_Misc_H_Inspection_Visuals","HSim_Misc_H_Interior","HSim_Misc_H_Loudspeakers","HSim_Misc_H_Market","HSim_Misc_H_Office_Objects","HSim_Misc_H_Perimeter_Ligh","HSim_Misc_H_Pike","HSim_Misc_H_Platform_Cart","HSim_Misc_H_Portable_Generator","HSim_Misc_H_Props","HSim_Misc_H_SawHorse","HSim_Misc_H_Shooting_Range","HSim_Misc_H_Signs","HSim_Misc_H_Sink","HSim_Misc_H_Targets","HSim_Misc_H_Tent","HSim_Misc_H_Toilet","HSim_Misc_H_Tools","HSim_Misc_H_Tools_Racking","HSim_Misc_H_Trash","HSim_Misc_H_Weather_Station","HSim_Misc_H_Weld_Gastank","HSim_Misc_H_Wheel_Chocks","HSim_Misc_H_Wheeled_Scaffolding","HSim_Misc_H_wheeled_tool_cart","HSim_Misc_H_Wheeled_Whiteboard","HSim_Misc_H_Winch","HSim_Misc_H_Windsock","HSim_Misc_H_Workbench","HSim_Misc_H_Wrecks","HSim_Structures_H","HSim_Structures_H_Airport_Papi","HSim_Structures_H_Harbour","HSim_Structures_H_Heliports_Heliport_Big","HSim_Structures_H_Heliports_Heliport_Small","HSim_Structures_H_Industrial_A_CraneCon","HSim_Structures_H_Industrial_Rooftop_Objects","HSim_Structures_US_H","HSim_Structures_US_H_Bld_US","HSim_Structures_US_H_Landmarks_Space_Needle","HSim_Tracked_H","HSim_Tracked_H_BMP2","HSim_Tracked_US_H","HSim_Tracked_US_H_M1A2","HSim_Tracked_US_H_MLRS","HSim_Data_H_EditorGroups","HSim_Anims_H","HSim_Anims_H_config_sdr","HSim_Anims_H_config_wmn","CUP_Hsim_Language_H","Hsim_Language_H","CUP_Hsim_Language_missions_H","Hsim_Language_missions_H","Enhanced_Epoch_AiASupport","A3_epoch_assets_1","epoch_objects","A3_epoch_assets_3","Underground_Epoch","A3_epoch_vehicles","a3_epoch_weapons","A3_Data_F","A3_Data_F_Hook","A3_Data_F_ParticleEffects","A3_Data_F_Bootcamp","A3_Data_F_Exp_A","A3_Data_F_Kart_ParticleEffects","A3_Data_F_Mark","A3_Editor_F","A3_Functions_F_Bootcamp","A3_Functions_F_Curator","A3_Functions_F_Exp_A","A3_Functions_F_Heli","A3_Functions_F_Mark","A3_Functions_F_MP_Mark","A3_Language_F","A3_Language_F_Beta","A3_Language_F_Curator","A3_Language_F_EPA","A3_Language_F_EPB","A3_Language_F_EPC","A3_Language_F_Gamma","A3_Language_F_Heli","A3_Language_F_Kart","A3_Language_F_Mark","A3_LanguageMissions_F","A3_LanguageMissions_F_Beta","A3_LanguageMissions_F_Gamma","A3_LanguageMissions_F_Kart","A3_Misc_F","A3_Misc_F_Helpers","A3_Modules_F","A3_Modules_F_DynO","A3_Modules_F_Effects","A3_Modules_F_Events","A3_Modules_F_GroupModifiers","A3_Modules_F_HC","A3_Modules_F_Intel","A3_Modules_F_LiveFeed","A3_Modules_F_Marta","A3_Modules_F_Misc","A3_Modules_F_Multiplayer","A3_Modules_F_ObjectModifiers","A3_Modules_F_Sites","A3_Modules_F_Skirmish","A3_Modules_F_StrategicMap","A3_Modules_F_Supports","A3_Modules_F_UAV","A3_Modules_F_Beta","A3_Modules_F_Beta_FiringDrills","A3_Modules_F_EPB","A3_Modules_F_EPB_Misc","A3_Modules_F_Heli","A3_Modules_F_Heli_SpawnAi","A3_Modules_F_Mark","A3_Modules_F_Mark_FiringDrills","A3_Modules_F_MP_Mark","A3_Modules_F_Mark_Objectives","A3_Music_F","A3_Music_F_Bootcamp","A3_Music_F_EPA","A3_Music_F_EPB","A3_Music_F_EPC","A3_Music_F_Heli","A3_Music_F_Mark","A3_Roads_F","A3_Rocks_F","A3_Sounds_F","A3_Sounds_F_Bootcamp","A3_Sounds_F_EPB","A3_Sounds_F_EPC","A3_Sounds_F_Exp_A","A3_Structures_F","A3_Structures_F_Bridges","A3_Structures_F_Civ","A3_Structures_F_Civ_Accessories","A3_Structures_F_Civ_Ancient","A3_Structures_F_Civ_BellTowers","A3_Structures_F_Civ_Calvaries","A3_Structures_F_Civ_Camping","A3_Structures_F_Civ_Chapels","A3_Structures_F_Civ_Constructions","A3_Structures_F_Civ_Dead","A3_Structures_F_Civ_Garbage","A3_Structures_F_Civ_Graffiti","A3_Structures_F_Civ_InfoBoards","A3_Structures_F_Civ_Kiosks","A3_Structures_F_Civ_Lamps","A3_Structures_F_Civ_Market","A3_Structures_F_Civ_Offices","A3_Structures_F_Civ_Pavements","A3_Structures_F_Civ_PlayGround","A3_Structures_F_Civ_SportsGrounds","A3_Structures_F_Civ_Statues","A3_Structures_F_Civ_Tourism","A3_Structures_F_Dominants","A3_Structures_F_Dominants_Amphitheater","A3_Structures_F_Dominants_Castle","A3_Structures_F_Dominants_Church","A3_Structures_F_Dominants_Hospital","A3_Structures_F_Dominants_Lighthouse","A3_Structures_F_Dominants_WIP","A3_Structures_F_Furniture","A3_Structures_F_Households","A3_Structures_F_Households_Addons","A3_Structures_F_Households_House_Big01","A3_Structures_F_Households_House_Big02","A3_Structures_F_Households_House_Shop01","A3_Structures_F_Households_House_Shop02","A3_Structures_F_Households_House_Small01","A3_Structures_F_Households_House_Small02","A3_Structures_F_Households_House_Small03","A3_Structures_F_Households_Slum","A3_Structures_F_Households_Stone_Big","A3_Structures_F_Households_Stone_Shed","A3_Structures_F_Households_Stone_Small","A3_Structures_F_Households_WIP","A3_Structures_F_Ind","A3_Structures_F_Ind_AirPort","A3_Structures_F_Ind_Cargo","A3_Structures_F_Ind_CarService","A3_Structures_F_Ind_ConcreteMixingPlant","A3_Structures_F_Ind_Crane","A3_Structures_F_Ind_DieselPowerPlant","A3_Structures_F_Ind_Factory","A3_Structures_F_Ind_FuelStation","A3_Structures_F_Ind_FuelStation_Small","A3_Structures_F_Ind_Pipes","A3_Structures_F_Ind_PowerLines","A3_Structures_F_Ind_ReservoirTank","A3_Structures_F_Ind_Shed","A3_Structures_F_Ind_SolarPowerPlant","A3_Structures_F_Ind_Tank","A3_Structures_F_Ind_Transmitter_Tower","A3_Structures_F_Ind_WavePowerPlant","A3_Structures_F_Ind_Windmill","A3_Structures_F_Ind_WindPowerPlant","A3_Structures_F_Items","A3_Structures_F_Items_Documents","A3_Structures_F_Items_Electronics","A3_Structures_F_Items_Cans","A3_Structures_F_Items_Gadgets","A3_Structures_F_Items_Luggage","A3_Structures_F_Items_Medical","A3_Structures_F_Items_Military","A3_Structures_F_Items_Stationery","A3_Structures_F_Items_Tools","A3_Structures_F_Items_Valuables","A3_Structures_F_Items_Vessels","A3_Structures_F_Mil","A3_Structures_F_Mil_BagBunker","A3_Structures_F_Mil_BagFence","A3_Structures_F_Mil_Barracks","A3_Structures_F_Mil_Bunker","A3_Structures_F_Mil_Cargo","A3_Structures_F_Mil_Flags","A3_Structures_F_Mil_Fortification","A3_Structures_F_Mil_Helipads","A3_Structures_F_Mil_Offices","A3_Structures_F_Mil_Radar","A3_Structures_F_Mil_Shelters","A3_Structures_F_Mil_TentHangar","A3_Structures_F_Naval","A3_Structures_F_Naval_Buoys","A3_Structures_F_Naval_Fishing","A3_Structures_F_Naval_Piers","A3_Structures_F_Naval_RowBoats","A3_Structures_F_Research","A3_Structures_F_System","A3_Structures_F_Training","A3_Structures_F_Training_InvisibleTarget","A3_Structures_F_Walls","A3_Structures_F_Bootcamp_Ind_Cargo","A3_Structures_F_Bootcamp_Items_Sport","A3_Structures_F_Bootcamp_System","A3_Structures_F_Bootcamp_Training","A3_Structures_F_Bootcamp_VR_Blocks","A3_Structures_F_Bootcamp_VR_CoverObjects","A3_Structures_F_Bootcamp_VR_Helpers","A3_Structures_F_EPA_Civ_Camping","A3_Structures_F_EPA_Civ_Constructions","A3_Structures_F_EPA_Items_Electronics","A3_Structures_F_EPA_Items_Food","A3_Structures_F_EPA_Items_Medical","A3_Structures_F_EPA_Items_Tools","A3_Structures_F_EPA_Items_Vessels","A3_Structures_F_EPA_Walls","A3_Structures_F_EPB_Civ_Accessories","A3_Structures_F_EPB_Civ_Camping","A3_Structures_F_EPB_Civ_Dead","A3_Structures_F_EPB_Civ_Garbage","A3_Structures_F_EPB_Civ_Graffiti","A3_Structures_F_EPB_Civ_PlayGround","A3_Structures_F_EPB_Furniture","A3_Structures_F_EPB_Items_Documents","A3_Structures_F_EPB_Items_Luggage","A3_Structures_F_EPB_Items_Military","A3_Structures_F_EPB_Items_Vessels","A3_Structures_F_EPB_Naval_Fishing","A3_Structures_F_EPC_Civ_Accessories","A3_Structures_F_EPC_Civ_Camping","A3_Structures_F_EPC_Civ_Garbage","A3_Structures_F_EPC_Civ_InfoBoards","A3_Structures_F_EPC_Civ_Kiosks","A3_Structures_F_EPC_Civ_PlayGround","A3_Structures_F_EPC_Civ_Tourism","A3_Structures_F_EPC_Dominants_GhostHotel","A3_Structures_F_EPC_Dominants_Stadium","A3_Structures_F_EPC_Furniture","A3_Structures_F_EPC_Items_Documents","A3_Structures_F_EPC_Items_Electronics","A3_Structures_F_EPC_Walls","A3_Structures_F_Exp_A","A3_Structures_F_Exp_A_VR_Blocks","A3_Structures_F_Exp_A_VR_Helpers","A3_Structures_F_Heli_Civ_Accessories","A3_Structures_F_Heli_Civ_Constructions","A3_Structures_F_Heli_Civ_Garbage","A3_Structures_F_Heli_Civ_Market","A3_Structures_F_Heli_Furniture","A3_Structures_F_Heli_Ind_AirPort","A3_Structures_F_Heli_Ind_Cargo","A3_Structures_F_Heli_Ind_Machines","A3_Structures_F_Heli_Items_Airport","A3_Structures_F_Heli_Items_Luggage","A3_Structures_F_Heli_Items_Sport","A3_Structures_F_Heli_Items_Tools","A3_Structures_F_Heli_VR_Helpers","A3_Structures_F_Kart_Civ_SportsGrounds","A3_Structures_F_Kart_Mil_Flags","A3_Structures_F_Mark_Items_Military","A3_Structures_F_Mark_Items_Sport","A3_Structures_F_Mark_Mil_Flags","A3_Structures_F_Mark_Training","A3_Structures_F_Mark_VR_Helpers","A3_Structures_F_Mark_VR_Shapes","A3_Structures_F_Mark_VR_Targets","A3_UIFonts_F","CUP_Buildings_Config","CABuildings","CUP_CABuildings_Misc","CABuildings_Misc","CUP_Desert2_Buildings","Desert2_Buildings","CUP_CA_desert2_Characters","CA_desert2_Characters","CUP_Desert_Config","Desert","CUP_DBE1_Hotfix","DBE1_Hotfix","CUP_CALanguage_e","CALanguage_e","CUP_CALanguage_PMC","CALanguage_PMC","CUP_CALanguage_missions_PMC","CALanguage_missions_PMC","CUP_CAWater2_seafox_EP1","CAWater2_seafox_EP1","CUP_CA_Plants2","CA_Plants2","CUP_CA_Plants2_Plant","CA_Plants2_Plant","CUP_CA_Plants2_Tree","CA_Plants2_Tree","CUP_CA_Plants_E2","CA_Plants_E2","CUP_CA_Plants_E","CA_Plants_E","CUP_CA_Plants_E_Misc","CA_Plants_E_Misc","CUP_CA_Plants_E_Plant","CA_Plants_E_Plant","CUP_CA_Plants_E_Tree","CA_Plants_E_Tree","CUP_Sara_Config","Sara","CUP_Saralite_Config","SaraLite","CUP_CASigns2","CASigns2","CUP_Structures_Config","CAStructures","CUP_CAStructures_A_BuildingWIP","CAStructures_A_BuildingWIP","CUP_CAStructures_A_CraneCon","CAStructures_A_CraneCon","CUP_CAStructuresLand_A_MunicipalOffice","CAStructuresLand_A_MunicipalOffice","CUP_CAStructuresBarn_W","CAStructuresBarn_W","CUP_CAStructures_Castle","CAStructures_Castle","CUP_CAStructuresHouse","CAStructuresHouse","CUP_CAStructuresHouse_A_FuelStation","CAStructuresHouse_A_FuelStation","CUP_CAStructuresHouse_A_Hospital","CAStructuresHouse_A_Hospital","CUP_CAStructuresHouse_A_Office01","CAStructuresHouse_A_Office01","CUP_CAStructuresHouse_A_Office02","CAStructuresHouse_A_Office02","CUP_CAStructuresHouse_a_stationhouse","CAStructuresHouse_a_stationhouse","CUP_CAStructuresHouse_Church_02","CAStructuresHouse_Church_02","CUP_CAStructuresHouse_Church_03","CAStructuresHouse_Church_03","CUP_CAStructuresHouse_Church_05R","CAStructuresHouse_Church_05R","CUP_CAStructuresHouse_HouseBT","CAStructuresHouse_HouseBT","CUP_CAStructuresHouse_HouseV2","CAStructuresHouse_HouseV2","CUP_CAStructuresHouse_HouseV","CAStructuresHouse_HouseV","CUP_CAStructuresLand_Ind_Stack_Big","CAStructuresLand_Ind_Stack_Big","CUP_CAStructures_IndPipe1","CAStructures_IndPipe1","CUP_CAStructuresInd_Quarry","CAStructuresInd_Quarry","CUP_Ind_SawMill","Ind_SawMill","CUP_CAStructures_Mil","CAStructures_Mil","CUP_CAStructures_Misc","CAStructures_Misc","CUP_CAStructures_Misc_Armory","CAStructures_Misc_Armory","CUP_CAStructures_Misc_Armory_Armor_Popuptarget","CAStructures_Misc_Armory_Armor_Popuptarget","CUP_CAStructures_Misc_Powerlines","CAStructures_Misc_Powerlines","CUP_CAStructures_Nav","CAStructures_Nav","CUP_CAStructuresLand_Nav_Boathouse","CAStructuresLand_Nav_Boathouse","CUP_CAStructures_Proxy_BuildingParts","CAStructures_Proxy_BuildingParts","CUP_CAStructures_Proxy_Ruins","CAStructures_Proxy_Ruins","CUP_CAStructures_Rail","CAStructures_Rail","CUP_CAStructuresHouse_rail_station_big","CAStructuresHouse_rail_station_big","CUP_CAStructures_Ruins","CAStructures_Ruins","CUP_CAStructuresShed_Small","CAStructuresShed_Small","CUP_CAStructuresHouse_Shed_Ind","CAStructuresHouse_Shed_Ind","CUP_CAStructures_Wall","CAStructures_Wall","CUP_CAUI","CAUI","CUP_CAWater2_LHD","CAWater2_LHD","CUP_Models_DBE1_Config","Models_DBE1","CUP_Kamenolom_DBE1","Kamenolom_DBE1","CUP_Pila_DBE1","Pila_DBE1","CUP_UI_DBE1","UI_DBE1","CUP_Vysilac_DBE1","Vysilac_DBE1","CUP_Zakladna_DBE1","Zakladna_DBE1","CUP_Sara_dbe1_Config","Sara_dbe1","a3_epoch_structures","A3_Animals_F","A3_Animals_F_AnimConfig","A3_Animals_F_Fishes","A3_Animals_F_Kestrel","A3_Animals_F_Rabbit","A3_Animals_F_Seagull","A3_Animals_F_Snakes","A3_Animals_F_Turtle","A3_Animals_F_Chicken","A3_Animals_F_Dog","A3_Animals_F_Goat","A3_Animals_F_Sheep","A3_Anims_F","A3_Anims_F_Config_Sdr","A3_Anims_F_EPA","A3_Anims_F_EPC","A3_Anims_F_Exp_A","A3_Anims_F_Kart","A3_Anims_F_Mark_Deployment","A3_Language_F_Bootcamp","A3_Language_F_Exp_A","A3_Map_Data","A3_Map_Stratis","A3_Map_Stratis_Scenes","A3_Plants_F_Bush","A3_Props_F_Exp_A","A3_Props_F_Exp_A_Military","A3_Signs_F","A3_Signs_F_AD","A3_Structures_F_Signs_Companies","A3_Structures_F_Bootcamp_Civ_Camping","A3_Structures_F_Bootcamp_Civ_SportsGrounds","A3_Structures_F_Bootcamp_Items_Electronics","A3_Structures_F_Bootcamp_Items_Food","A3_Structures_F_Heli_Items_Electronics","A3_Structures_F_Heli_Items_Food","A3_Structures_F_Kart_Signs_Companies","A3_UI_F","A3_UI_F_Curator","A3_UI_F_Kart","A3_UI_F_Mark","A3_UI_F_MP_Mark","A3_Weapons_F","A3_Weapons_F_NATO","A3_Weapons_F_CSAT","A3_Weapons_F_AAF","A3_weapons_F_FIA","A3_Weapons_F_ItemHolders","A3_Weapons_F_Headgear","A3_Weapons_F_Uniforms","A3_Weapons_F_Vests","A3_Weapons_F_Ammoboxes","A3_Weapons_F_DummyWeapons","A3_Weapons_F_Explosives","A3_Weapons_F_Items","A3_Weapons_F_Launchers_NLAW","A3_Weapons_F_Launchers_LAW","A3_Weapons_F_Launchers_Titan","A3_Weapons_F_EPA_LongRangeRifles_DMR_01","A3_Weapons_F_EBR","A3_Weapons_F_LongRangeRifles_GM6","A3_Weapons_F_LongRangeRifles_M320","A3_Weapons_F_Machineguns_M200","A3_Weapons_F_Machineguns_Zafir","A3_Weapons_F_Pistols_ACPC2","A3_Weapons_F_Pistols_P07","A3_Weapons_F_Pistols_Pistol_heavy_01","A3_Weapons_F_Pistols_Pistol_heavy_02","A3_Weapons_F_Pistols_Rook40","A3_Weapons_F_Rifles_Khaybar","A3_Weapons_F_Rifles_Mk20","A3_Weapons_F_Rifles_MX","A3_Weapons_F_EPB_Rifles_MX_Black","A3_Weapons_F_Rifles_SDAR","A3_Weapons_F_Rifles_TRG20","A3_Weapons_F_Pistols_PDW2000","A3_Weapons_F_Rifles_Vector","a3_weapons_f_rifles_SMG_02","A3_Weapons_F_beta","A3_Weapons_F_Beta_Ammoboxes","A3_Weapons_F_beta_EBR","A3_Weapons_F_EPA_LongRangeRifles_GM6","A3_Weapons_F_EPB_LongRangeRifles_M320","A3_Weapons_F_beta_Rifles_Khaybar","A3_Weapons_F_beta_Rifles_MX","A3_Weapons_F_beta_Rifles_TRG20","A3_Weapons_F_Bootcamp_LongRangeRifles_GM6","A3_Weapons_F_Bootcamp_LongRangeRifles_M320","A3_Weapons_F_EPB_LongRangeRifles_GM3","A3_Weapons_F_gamma","A3_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_EPA_EBR","A3_Weapons_F_EPA_Rifles_MX","A3_Weapons_F_Kart_Pistols_Pistol_Signal_F","A3_Weapons_F_Mark_LongRangeRifles_DMR_01","A3_Weapons_F_Mark_EBR","A3_Weapons_F_Mark_LongRangeRifles_GM6","A3_Weapons_F_Mark_LongRangeRifles_GM6_camo","A3_Weapons_F_Mark_LongRangeRifles_M320","A3_Weapons_F_Mark_LongRangeRifles_M320_camo","A3_Weapons_F_Mark_Machineguns_M200","A3_Weapons_F_Mark_Machineguns_Zafir","A3_Weapons_F_Mark_Rifles_Khaybar","A3_Weapons_F_Mark_Rifles_Mk20","A3_Weapons_F_Mark_Rifles_MX","A3_Weapons_F_Mark_Rifles_SDAR","A3_Weapons_F_Mark_Rifles_TRG20","CUP_Buildings2_Config","CABuildings2","CUP_A_Crane_02","A_Crane_02","CUP_A_GeneralStore_01","A_GeneralStore_01","CUP_CABuildings2_A_Pub","CABuildings2_A_Pub","CUP_A_statue","A_statue","CUP_Barn_Metal","Barn_Metal","CUP_CABuildingParts","CABuildingParts","CUP_CABuildingParts_Signs","CABuildingParts_Signs","CUP_CATEC","CATEC","CUP_Church_01","Church_01","CUP_Farm_Cowshed","Farm_Cowshed","CUP_Farm_WTower","Farm_WTower","CUP_CAHouseBlock_A","CAHouseBlock_A","CUP_CAHouseBlock_B","CAHouseBlock_B","CUP_CAHouseBlock_C","CAHouseBlock_C","CUP_CAHouseBlock_D","CAHouseBlock_D","CUP_HouseRuins","HouseRuins","CUP_Ind_Dopravnik","Ind_Dopravnik","CUP_Ind_Expedice","Ind_Expedice","CUP_Ind_MalyKomin","Ind_MalyKomin","CUP_Ind_Mlyn","Ind_Mlyn","CUP_Ind_Pec","Ind_Pec","CUP_ind_silomale","ind_silomale","CUP_Ind_SiloVelke","Ind_SiloVelke","CUP_Ind_Vysypka","Ind_Vysypka","CUP_Ind_Garage01","Ind_Garage01","CUP_CAStructures_IndPipe1_todo_delete","CAStructures_IndPipe1_todo_delete","CUP_IndPipe2","IndPipe2","CUP_Ind_Shed_01","Ind_Shed_01","CUP_Ind_Shed_02","Ind_Shed_02","CUP_Ind_Tank","Ind_Tank","CUP_Ind_Workshop01","Ind_Workshop01","CUP_CABuildings2_Misc_Cargo","CABuildings2_Misc_Cargo","CUP_Misc_PowerStation","Misc_PowerStation","CUP_Misc_WaterStation","Misc_WaterStation","CUP_Rail_House_01","Rail_House_01","CUP_Shed_small","Shed_small","CUP_Shed_wooden","Shed_wooden","CUP_particle_effects","particle_effects","CUP_Chernarus_Config","Chernarus","CUP_Chernarus_Summer_Config","Chernarus_Summer","CUP_Desert2_Config","Porto","CUP_Hotfix_Config","CA_Hotfix","CUP_CA_QGClutterHotfix","CA_QGClutterHotfix","CUP_CA_Hotfix_vez_ropa","CA_Hotfix_vez_ropa","CUP_CAMisc2","CAMisc2","CUP_Misc3_Config","CAMisc3","CUP_WarfareBuildings","WarfareBuildings","CUP_Misc_e_Config","CAMisc_E","CUP_CAMisc_E_WF","CAMisc_E_WF","CUP_CAMP_Armory_Misc","CAMP_Armory_Misc","CUP_CAMP_Armory_Misc_Concrete_Wall","CAMP_Armory_Misc_Concrete_Wall","CUP_CAMP_Armory_Misc_Entrance_Gate","CAMP_Armory_Misc_Entrance_Gate","CUP_CAMP_Armory_Misc_Info_Board","CAMP_Armory_Misc_Info_Board","CUP_CAMP_Armory_Misc_Infostands","CAMP_Armory_Misc_Infostands","CUP_CAMP_Armory_Misc_Laptop","CAMP_Armory_Misc_Laptop","CUP_CAMP_Armory_Misc_Loudspeakers","CAMP_Armory_Misc_Loudspeakers","CUP_CAMP_Armory_Misc_Plasticpole","CAMP_Armory_Misc_Plasticpole","CUP_CAMP_Armory_Misc_Red_Light","CAMP_Armory_Misc_Red_Light","CUP_CAMP_Armory_Misc_Sign_Armex","CAMP_Armory_Misc_Sign_Armex","CUP_CAMP_Armory_Misc_Sign_Direction","CAMP_Armory_Misc_Sign_Direction","CUP_CA_Plants2_Bush","CA_Plants2_Bush","CUP_CA_Plants2_Misc","CA_Plants2_Misc","CUP_CA_Plants_E_Bush","CA_Plants_E_Bush","CUP_CA_Plants_PMC","CA_Plants_PMC","CUP_CARoads2Bridge","CARoads2Bridge","CUP_CARoads_PMC_Bridge","CARoads_PMC_Bridge","CUP_A_TVTower","A_TVTower","CUP_CAStructures_Nav_pier","CAStructures_Nav_pier","CUP_CAStructures_Railway","CAStructures_Railway","CUP_Structures_e_Config","CAStructures_E","CUP_CAStructures_E_HouseA","CAStructures_E_HouseA","CUP_CAStructures_E_HouseA_A_BuildingWIP","CAStructures_E_HouseA_A_BuildingWIP","CUP_CAStructures_E_HouseA_A_CityGate1","CAStructures_E_HouseA_A_CityGate1","CUP_CAStructures_E_HouseA_A_Minaret","CAStructures_E_HouseA_A_Minaret","CUP_CAStructures_E_HouseA_A_Minaret_Porto","CAStructures_E_HouseA_A_Minaret_Porto","CUP_CAStructures_E_HouseA_A_Mosque_big","CAStructures_E_HouseA_A_Mosque_big","CUP_CAStructures_E_HouseA_A_Mosque_small","CAStructures_E_HouseA_A_Mosque_small","CUP_CAStructures_E_HouseA_A_Office01","CAStructures_E_HouseA_A_Office01","CUP_CAStructures_E_HouseA_a_stationhouse","CAStructures_E_HouseA_a_stationhouse","CUP_CAStructures_E_HouseA_A_Statue","CAStructures_E_HouseA_A_Statue","CUP_CAStructures_E_HouseA_A_Villa","CAStructures_E_HouseA_A_Villa","CUP_CAStructures_E_HouseC","CAStructures_E_HouseC","CUP_CAStructures_E_HouseK","CAStructures_E_HouseK","CUP_CAStructures_E_HouseL","CAStructures_E_HouseL","CUP_CAStructures_E_Ind","CAStructures_E_Ind","CUP_CAStructures_E_Ind_Ind_Coltan_Mine","CAStructures_E_Ind_Ind_Coltan_Mine","CUP_CAStructures_E_Ind_Ind_FuelStation","CAStructures_E_Ind_Ind_FuelStation","CUP_CAStructures_E_Ind_Ind_Garage01","CAStructures_E_Ind_Ind_Garage01","CUP_CAStructures_E_Ind_Oil_Mine","CAStructures_E_Ind_Oil_Mine","CUP_CAStructures_E_Ind_IndPipes","CAStructures_E_Ind_IndPipes","CUP_CAStructures_E_Ind_Misc_PowerStation","CAStructures_E_Ind_Misc_PowerStation","CUP_CAStructures_E_Ind_Ind_Shed","CAStructures_E_Ind_Ind_Shed","CUP_CAStructures_E_Mil","CAStructures_E_Mil","CUP_CAStructures_E_Misc","CAStructures_E_Misc","CUP_CAStructures_E_Misc_Misc_cables","CAStructures_E_Misc_Misc_cables","CUP_CAStructures_E_Misc_Misc_Construction","CAStructures_E_Misc_Misc_Construction","CUP_CAStructures_E_Misc_Misc_Garbage","CAStructures_E_Misc_Misc_Garbage","CUP_CAStructures_E_Misc_Misc_Interier","CAStructures_E_Misc_Misc_Interier","CUP_CAStructures_E_Misc_Misc_Lamp","CAStructures_E_Misc_Misc_Lamp","CUP_CAStructures_E_Misc_Misc_Market","CAStructures_E_Misc_Misc_Market","CUP_CAStructures_E_Misc_Misc_powerline","CAStructures_E_Misc_Misc_powerline","CUP_CAStructures_E_Misc_Misc_Water","CAStructures_E_Misc_Misc_Water","CUP_CAStructures_E_Misc_Misc_Well","CAStructures_E_Misc_Misc_Well","CUP_CAStructures_E_Wall","CAStructures_E_Wall","CUP_CAStructures_E_Wall_Wall_L","CAStructures_E_Wall_Wall_L","CUP_Structures_pmc_Config","CAStructures_PMC","CUP_CAStructures_PMC_Buildings","CAStructures_PMC_Buildings","CUP_CAStructures_PMC_Buildings_Bunker","CAStructures_PMC_Buildings_Bunker","CUP_CAStructures_PMC_Buildings_GeneralStore_PMC","CAStructures_PMC_Buildings_GeneralStore_PMC","CUP_CAStructures_PMC_Buildings_Ruin_Cowshed","CAStructures_PMC_Buildings_Ruin_Cowshed","CUP_CAStructures_PMC_Ind","CAStructures_PMC_Ind","CUP_CAStructures_PMC_FuelStation","CAStructures_PMC_FuelStation","CUP_CAStructures_PMC_Misc","CAStructures_PMC_Misc","CUP_CAStructures_PMC_Misc_Shed","CAStructures_PMC_Misc_Shed","CUP_CAStructures_PMC_Ruins","CAStructures_PMC_Ruins","CUP_CAStructures_PMC_Walls","CAStructures_PMC_Walls","CUP_Takistan_Config","Takistan","CUP_Utes_Config","Utes","CUP_Zargabad_Config","zargabad","CUP_ibr_plants","ibr_plants","a2_epoch_weapons","A3_epoch_assets","A3_Anims_F_Heli","A3_Characters_F","A3_Characters_F_BLUFOR","A3_Characters_F_Civil","A3_Characters_F_Heads","A3_Characters_F_OPFOR","A3_Characters_F_Proxies","A3_Characters_F_Beta","A3_Characters_F_INDEP","A3_Characters_F_Bootcamp","A3_Characters_F_EPB_Heads","A3_Characters_F_Gamma","A3_Characters_F_Mark","A3_Data_F_Curator","A3_Data_F_Curator_Eagle","A3_Data_F_Curator_Intel","A3_Data_F_Curator_Misc","A3_Data_F_Curator_Respawn","3DEN","A3_Data_F_Kart","A3_UAV_F_Characters_F_Gamma","A3_UAV_F_Weapons_F_Gamma_Ammoboxes","A3_Weapons_F_gamma_Items","A3_Map_Altis","A3_Map_Altis_Scenes","A3_Missions_F","A3_Missions_F_Beta","A3_Missions_F_Gamma","A3_Missions_F_Kart","A3_Modules_F_Bootcamp","A3_Modules_F_Curator","A3_Modules_F_Curator_Animals","A3_Modules_F_Curator_CAS","A3_Modules_F_Curator_Curator","A3_Modules_F_Curator_Effects","A3_Modules_F_Curator_Environment","A3_Modules_F_Curator_Flares","A3_Modules_F_Curator_Intel","A3_Modules_F_Curator_Lightning","A3_Modules_F_Curator_Mines","A3_Modules_F_Curator_Misc","A3_Modules_F_Curator_Multiplayer","A3_Modules_F_Curator_Objectives","A3_Modules_F_Curator_Ordnance","A3_Modules_F_Curator_Respawn","A3_Modules_F_Curator_Smokeshells","A3_Modules_F_Exp_A","A3_Modules_F_Kart","A3_Modules_F_Kart_TimeTrials","A3_Props_F_Exp_A_Military_Equipment","A3_Static_F","A3_Static_F_Mortar_01","A3_Static_F_Beta_Mortar_01","A3_Static_F_Gamma","A3_Static_F_Gamma_Mortar_01","A3_Static_F_Mark_Designator_01","A3_Static_F_Mark_Designator_02","A3_Supplies_F_Heli","A3_Supplies_F_Heli_Bladders","A3_Supplies_F_Heli_CargoNets","A3_Supplies_F_Heli_Fuel","A3_Supplies_F_Heli_Slingload","A3_Supplies_F_Mark","A3_UI_F_Bootcamp","A3_UI_F_Exp_A","A3_UI_F_Heli","A3_Weapons_F_Acc","A3_Weapons_F_Beta_Acc","A3_Weapons_F_Bootcamp_Ammoboxes","A3_Weapons_F_EPA","A3_Weapons_F_EPA_Acc","A3_Weapons_F_EPA_Ammoboxes","A3_Weapons_F_EPB","A3_Weapons_F_EPB_Acc","A3_Weapons_F_EPB_Ammoboxes","A3_Weapons_F_EPC","A3_Weapons_F_gamma_Acc","A3_Weapons_F_Kart","A3_Weapons_F_Mark_Acc","CUP_Afghan_Config","Mountains_ACR","CUP_Bohemia_Config","Woodland_ACR","CUP_Bootcamp_acr_Config","Bootcamp_ACR","CUP_Data_baf_Config","CA_BAF","CUP_Desert_e_Config","Desert_E","CUP_CALanguage_Baf","CALanguage_Baf","CUP_CALanguageMissions_baf","CALanguageMissions_baf","CUP_Misc_acr_Config","CAMisc_ACR","CUP_CAMisc_ACR_3DMarkers","CAMisc_ACR_3DMarkers","CUP_CAMisc_ACR_Container","CAMisc_ACR_Container","CUP_CAMisc_ACR_Dog","CAMisc_ACR_Dog","CUP_CAMisc_ACR_Helpers","CAMisc_ACR_Helpers","CUP_CAMisc_ACR_PBX","CAMisc_ACR_PBX","CUP_CAMisc_ACR_ScaffoldingSmall","CAMisc_ACR_ScaffoldingSmall","CUP_CAMisc_ACR_Shooting_range","CAMisc_ACR_Shooting_range","CUP_CAMisc_ACR_Sign_Mines","CAMisc_ACR_Sign_Mines","CUP_CAMisc_ACR_Targets","CAMisc_ACR_Targets","CUP_CAMisc_ACR_Targets_InvisibleTarget","CAMisc_ACR_Targets_InvisibleTarget","CUP_CAMisc_ACR_TestSphere","CAMisc_ACR_TestSphere","CUP_CAMisc_BAF","CAMisc_BAF","CUP_Provinggrounds_pmc_Config","ProvingGrounds_PMC","CUP_Shapur_baf_Config","Shapur_BAF","CUP_BaseConfig_F","A3_Air_F","A3_Air_F_Heli_Light_01","A3_Air_F_Heli_Light_02","A3_Air_F_Beta","A3_Air_F_Beta_Heli_Attack_01","A3_Air_F_Beta_Heli_Attack_02","A3_Air_F_Beta_Heli_Transport_01","A3_Air_F_Beta_Heli_Transport_02","A3_Air_F_Beta_Parachute_01","A3_Air_F_Beta_Parachute_02","A3_Air_F_EPB_Heli_Light_03","A3_Air_F_EPC_Plane_CAS_01","A3_Air_F_EPC_Plane_CAS_02","A3_Air_F_Gamma_Plane_Fighter_03","A3_Air_F_Heli","A3_Air_F_Heli_Heli_Attack_01","A3_Air_F_Heli_Heli_Attack_02","A3_Air_F_Heli_Heli_Light_01","A3_Air_F_Heli_Heli_Light_02","A3_Air_F_Heli_Heli_Light_03","A3_Air_F_Heli_Heli_Transport_01","A3_Air_F_Heli_Heli_Transport_02","A3_Air_F_Heli_Heli_Transport_03","A3_Air_F_Heli_Heli_Transport_04","A3_Armor_F","A3_armor_f_beta","A3_Armor_F_Panther","A3_armor_f_beta_APC_Tracked_02","A3_Armor_F_EPB_APC_tracked_03","A3_Armor_F_EPB_MBT_03","A3_Armor_F_Slammer","A3_Armor_F_T100K","A3_Boat_F","A3_Boat_F_Boat_Armed_01","A3_Boat_F_Boat_Transport_01","A3_Boat_F_Beta_Boat_Armed_01","A3_Boat_F_Beta_Boat_Transport_01","A3_Boat_F_SDV_01","A3_Boat_F_EPC_Submarine_01_F","A3_Boat_F_Civilian_Boat","A3_Boat_F_Trawler","A3_Boat_F_Gamma_Boat_Transport_01","A3_Boat_F_Heli_Boat_Armed_01","A3_Boat_F_Heli_SDV_01","A3_Characters_F_Common","A3_Characters_F_Bootcamp_Common","A3_Characters_F_EPA","A3_Characters_F_EPB","A3_Characters_F_EPC","A3_Characters_F_Kart","A3_Data_F_Curator_Characters","A3_Data_F_Curator_Virtual","A3_Data_F_Exp_A_Virtual","A3_Data_F_Heli","A3_Air_F_Gamma_UAV_01","A3_Air_F_Gamma_UAV_02","A3_Missions_F_Bootcamp","A3_Missions_F_Curator","A3_Missions_F_EPA","A3_Missions_F_EPB","A3_Missions_F_EPC","A3_Missions_F_Exp_A","A3_Missions_F_Heli","A3_Missions_F_Mark","A3_Missions_F_MP_Mark","A3_Modules_F_Bootcamp_Misc","A3_Modules_F_Curator_Chemlights","A3_Soft_F","A3_Soft_F_MRAP_01","A3_Soft_F_MRAP_02","A3_Soft_F_Offroad_01","A3_Soft_F_Quadbike","A3_Soft_F_MRAP_03","A3_Soft_F_Beta_Quadbike","A3_Soft_F_HEMTT","A3_Soft_F_TruckHeavy","A3_Soft_F_EPC_Truck_03","A3_Soft_F_Car","A3_Soft_F_Gamma_Offroad","A3_Soft_F_Gamma_Quadbike","A3_Soft_F_SUV","A3_Soft_F_Gamma_HEMTT","A3_Soft_F_Gamma_TruckHeavy","A3_Soft_F_Truck","A3_Soft_F_Heli_Car","A3_Soft_F_Heli_MRAP_01","A3_Soft_F_Heli_MRAP_02","A3_Soft_F_Heli_MRAP_03","A3_Soft_F_Heli_Quadbike","A3_Soft_F_Heli_SUV","A3_Soft_F_Heli_Truck","A3_Soft_F_Kart_Kart_01","A3_Static_F_Gamma_AA","A3_Static_F_Gamma_AT","A3_Structures_F_Mil_Scrapyard","A3_Structures_F_Wrecks","A3_Structures_F_EPA_Mil_Scrapyard","A3_Weapons_F_Bootcamp","A3_Weapons_F_Mark","A3_Weapons_F_Mark_LongRangeRifles_DMR_02","A3_Weapons_F_Mark_LongRangeRifles_DMR_03","A3_Weapons_F_Mark_LongRangeRifles_DMR_04","A3_Weapons_F_Mark_LongRangeRifles_DMR_05","A3_Weapons_F_Mark_LongRangeRifles_DMR_06","A3_Weapons_F_Mark_Machineguns_MMG_01","A3_Weapons_F_Mark_Machineguns_MMG_02","A3_epoch_language","A3_epoch_vehicles_1","A3_Air_F_EPC_Plane_Fighter_03","A3_Armor_F_AMV","A3_Armor_F_Marid","A3_Armor_F_EPC_MBT_01","A3_Armor_F_APC_Wheeled_03","A3_CargoPoses_F","A3_CargoPoses_F_Heli","A3_Soft_F_Crusher_UGV","A3_Soft_F_Bootcamp_Offroad_01","A3_Soft_F_Bootcamp_Quadbike","A3_Soft_F_Bootcamp_Truck","A3_Soft_F_Heli_Crusher_UGV","CUP_Core","CUP_StandaloneTerrains_Core","CUP_StandaloneTerrains_Core_Faction","CUP_StandaloneTerrains_Core_VehicleClass","CUP_Worlds","CUP_Worlds_Ambient","CUP_Worlds_Author","CUP_Worlds_Clutter","CUP_Worlds_ClutterDist","CUP_Worlds_Delete","CUP_Worlds_DisableInfiniteTerrain","CUP_Worlds_DustEffects","CUP_Worlds_EnvSounds","CUP_Worlds_FullDetailDist","CUP_Worlds_Grid","CUP_Worlds_Intros","CUP_Worlds_Lighting","CUP_Worlds_Lighting_Chernarus","CUP_Worlds_Lighting_Desert","CUP_Worlds_MapSize","CUP_Worlds_MidDetailTexture","CUP_Worlds_NoDetailDist","CUP_Worlds_PictureMap","CUP_Worlds_PictureShot","CUP_Worlds_Seabed","CUP_Worlds_SkyTexture","CUP_Worlds_StreetLamp","CUP_Worlds_Surfaces","CUP_Worlds_Water","A3_epoch_config","CUP_A1_EditorObjects","CUP_A2_EditorObjects","A3_epoch_code","A3_epoch_functions"}; //whitelisted cfgPatches for CUP terrains
-antihack_InvOpenCheck[] = {}; // blank array disables, enable with {6} distance in meters disallows gear access if another player is within this range also disables gear access in vehicles.
-antihack_banReason = "EpochMod.com Autoban";
+antihack_banReason = "EpochMod Autoban";
+antihack_kickReason = "EpochMod Autokick";
+antihack_banReasons[] = {
+ "Mod mismatch, check that the mods you have enabled match server."
+};
+antihack_banDuration = 5; // Default 5 minute ban. -1 = permanent ban.
+antihack_kickReasons[] = {
+ "Mod mismatch, check that the mods you have enabled match server."
+};
antihack_checkFiles[] = { //script check, leave it blank to disable it
{"epoch_code\compile\setup\EPOCH_clientInit.sqf", "EPOCH_clientInit"},
{"epoch_code\compile\EPOCH_onEachFrame.sqf", "EPOCH_onEachFrame"},
@@ -16,10 +23,6 @@ antihack_checkFiles[] = { //script check, leave it blank to disable it
{"epoch_code\compile\interface_event_handlers\EPOCH_KeyDown.sqf", "EPOCH_KeyDown"}
};
antihack_addActionCheck = true; // false to disable addAction checks
-antihack_customVariablesCheck = false; // true enables variable scanning on missionNamespace
-antihack_customVariables[] = {}; //Add global variables from custom scripts, example: {"MyOwnVar","CP_KK"} //Global Variables begin without "_" !!
-antihack_customVariablesCheckMode = 0; // 0 = Ban, 1 = Log, 2 == learning mode (only enable with trusted players in a passwored server to profile your variables keep disabled for normal operation)
-
adminMenu_Owner[] = {};
adminMenu_OwnerSetting[] = {
"ESP-PLAYER",
diff --git a/Server_Install_Pack/MPMissions/epoch.Napf.pbo b/Server_Install_Pack/MPMissions/epoch.Napf.pbo
index 80409988..dd9c51e6 100644
Binary files a/Server_Install_Pack/MPMissions/epoch.Napf.pbo and b/Server_Install_Pack/MPMissions/epoch.Napf.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Altis.pbo b/Server_Install_Pack/mpmissions/epoch.Altis.pbo
index aa1b493c..061e0e42 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Altis.pbo and b/Server_Install_Pack/mpmissions/epoch.Altis.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Australia.pbo b/Server_Install_Pack/mpmissions/epoch.Australia.pbo
index 99faac25..e97cb5ce 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Australia.pbo and b/Server_Install_Pack/mpmissions/epoch.Australia.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo
index e16340f4..43551333 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Bootcamp_ACR.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo b/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo
index 33b56e9e..c7d8be6a 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo and b/Server_Install_Pack/mpmissions/epoch.Bornholm.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo b/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo
index bba9bed1..d1c72c74 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo and b/Server_Install_Pack/mpmissions/epoch.Chernarus.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo b/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo
index 5bcc489e..bd532024 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo and b/Server_Install_Pack/mpmissions/epoch.Chernarus_Summer.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo b/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo
index 3eabe27c..1fe32d25 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo and b/Server_Install_Pack/mpmissions/epoch.Desert_E.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Esseker.pbo b/Server_Install_Pack/mpmissions/epoch.Esseker.pbo
index 821c314c..1062d5d7 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Esseker.pbo and b/Server_Install_Pack/mpmissions/epoch.Esseker.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo
index 6bee9944..e8e95e67 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Mountains_ACR.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Porto.pbo b/Server_Install_Pack/mpmissions/epoch.Porto.pbo
index fabab4f7..b07722f9 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Porto.pbo and b/Server_Install_Pack/mpmissions/epoch.Porto.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo b/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo
index c0f99fa8..f103894a 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo and b/Server_Install_Pack/mpmissions/epoch.ProvingGrounds_PMC.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Sara.pbo b/Server_Install_Pack/mpmissions/epoch.Sara.pbo
index 2c87c366..56840663 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Sara.pbo and b/Server_Install_Pack/mpmissions/epoch.Sara.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo b/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo
index bce3c5a6..c348b9fa 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo and b/Server_Install_Pack/mpmissions/epoch.SaraLite.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo b/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo
index 1fb124d3..1603ea4f 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo and b/Server_Install_Pack/mpmissions/epoch.Sara_dbe1.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo b/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo
index 5f124157..872887f7 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo and b/Server_Install_Pack/mpmissions/epoch.Shapur_BAF.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Stratis.pbo b/Server_Install_Pack/mpmissions/epoch.Stratis.pbo
index 4c54880f..4359f03a 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Stratis.pbo and b/Server_Install_Pack/mpmissions/epoch.Stratis.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Takistan.pbo b/Server_Install_Pack/mpmissions/epoch.Takistan.pbo
index 12a21a12..ea2b5795 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Takistan.pbo and b/Server_Install_Pack/mpmissions/epoch.Takistan.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.VR.pbo b/Server_Install_Pack/mpmissions/epoch.VR.pbo
index 4501466a..2aa44a9c 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.VR.pbo and b/Server_Install_Pack/mpmissions/epoch.VR.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo b/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo
index 3ce2bcf9..56e1a113 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo and b/Server_Install_Pack/mpmissions/epoch.Woodland_ACR.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo b/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo
index 2020d823..a1d41b4e 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo and b/Server_Install_Pack/mpmissions/epoch.Zargabad.pbo differ
diff --git a/Server_Install_Pack/mpmissions/epoch.utes.pbo b/Server_Install_Pack/mpmissions/epoch.utes.pbo
index c501a029..67d3fe7f 100644
Binary files a/Server_Install_Pack/mpmissions/epoch.utes.pbo and b/Server_Install_Pack/mpmissions/epoch.utes.pbo differ
diff --git a/Server_Install_Pack/sc/BattlEye/deleteVehicle.txt b/Server_Install_Pack/sc/BattlEye/deleteVehicle.txt
index fbd50b20..04d1965c 100644
--- a/Server_Install_Pack/sc/BattlEye/deleteVehicle.txt
+++ b/Server_Install_Pack/sc/BattlEye/deleteVehicle.txt
@@ -1 +1 @@
-5 "" !" GroundWeaponHolder$" !" WeaponHolderSimulated$" !" Epoch_(Sapper|SapperB|Cloak|Female_CamoRed)_F$" !" (Land_MPS|Bobber|Rabbit)_EPOCH$" !" (Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH$" !" (Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Cabinet|Freezer|Tarp)_EPOCH$" !" (SapperHead|Jack|SolarGen)_SIM_EPOCH$" !" (Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH$" !" Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH$" !" (Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace|TankTrap)_SIM_EPOCH$" !" (Hesco3|Metal|WoodWall[1-4])_(Ghost|SIM)_EPOCH$" !" (Spike|Metal)_TRAP_SIM_EPOCH$" !" (WoodFoundation|Foundation)_Ghost_EPOCH$" !" I_(Soldier[1-3]|Soldier)_EPOCH$" !" I_(helipilot|helicrew)_F$" !" I_UAV_01_F$" !" (I|B|O)_UAV_AI$" !" I_Boat_Armed_01_minigun_F" !" B_Heli_Transport_01_F" !" Land_Cages_F$"
+5 "" !="[0-9]:[0-9]{1,4}" !" GroundWeaponHolder$" !" WeaponHolderSimulated$" !" Epoch_(Sapper|SapperB|Cloak|Female_CamoRed)_F$" !" (Land_MPS|Bobber|Rabbit)_EPOCH$" !" (Sheep|Goat|Snake|Snake2|Hen|Cock|Fin|Alsatian)_random_EPOCH$" !" (Bed|locker|Filing|Chair|ChairRed|wardrobe|cooker|Couch|Table|Pelican|Fridge|Shelf|ToolRack|Shoebox|Bunk|Cabinet|Freezer|Tarp)_EPOCH$" !" (SapperHead|Jack|SolarGen)_SIM_EPOCH$" !" (Tipi|Workbench|StorageShelf|CinderWallHalf|Foundation|Wood(Floor|LargeWall|Stairs|Ramp|Foundation|Ladder|Tower))_Ghost_EPOCH$" !" Wood(Floor|LargeWall|LargeWallCor|LargeWallDoor|LargeWallDoorL|LargeWallDoorway|Stairs|Stairs2|Ramp|Ladder|Tower)_SIM_EPOCH$" !" (Safe|Workbench|LockBox|CinderWall|CinderWallGarage|CinderWallHalf|PlotPole|Tipi|StorageShelf|Fireplace|TankTrap)_SIM_EPOCH$" !" (Hesco3|Metal|WoodWall[1-4])_(Ghost|SIM)_EPOCH$" !" (Spike|Metal)_TRAP_SIM_EPOCH$" !" (WoodFoundation|Foundation)_Ghost_EPOCH$" !" I_(Soldier[1-3]|Soldier)_EPOCH$" !" I_(helipilot|helicrew)_F$" !" I_UAV_01_F$" !" (I|B|O)_UAV_AI$" !" I_Boat_Armed_01_minigun_F" !" B_Heli_Transport_01_F" !" Land_Cages_F$"
diff --git a/Server_Install_Pack/sc/BattlEye/remoteexec.txt b/Server_Install_Pack/sc/BattlEye/remoteexec.txt
index 1b0c5d4c..8355a220 100644
--- a/Server_Install_Pack/sc/BattlEye/remoteexec.txt
+++ b/Server_Install_Pack/sc/BattlEye/remoteexec.txt
@@ -1 +1 @@
-5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_checkplayer \[[A-Z]{1} [A-Za-z]{4,10} [0-9]{1,3}-[0-9]{1,3}:[0-9]{1,3}( \(.+\)|) REMOTE\]" !="epoch_server_(save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player|(upgrade|updateplayer|create|delete)Group) \[.+\]" !="epoch_server_(knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer) \[.+\]"
+5 "" !="bis_fnc_execvm \[\[.+\],\"initPlayerServer.sqf\"]" !="bis_fnc_effectkilled(airdestruction|secondaries) \[.+\]" !="epoch_server_checkplayer \[[A-Z]{1} [A-Za-z]{4,10} [0-9]{1,3}-[0-9]{1,3}:[0-9]{1,3}( \(.+\)|) REMOTE\]" !="epoch_server_(save(_vehicles|building)|(lock|pack)Storage|(upgrade|remove|paint|maint)build) \[.+\]" !="epoch_server_((load|respawn|dead|invite|revive|teleport)Player|(upgrade|updateplayer|create|delete)Group) \[.+\]" !="epoch_server_(deadplayerdetonate|triggerantagonist|playersetvariable) \[.+\]" !="epoch_server_(knockDownTree|mineRocks|lootAnimal|handle_(say3d|switchmove|sapperObjs)) \[.+\]" !="epoch_server_((repair|fill|lock)Vehicle|(loot|fill)Container|(store|take)Crypto|make(NPC|)Trade) \[.+\]" !="epoch_server_(tradeRequest|equippeditem|packJack|create(object|AirDrop)|airDropCrate|destroytrash|unpackBackpack) \[.+\]" !="epoch_(localcleanup|fnc_saveplayer) \[.+\]"
diff --git a/Server_Install_Pack/sc/BattlEye/scripts.txt b/Server_Install_Pack/sc/BattlEye/scripts.txt
index de3933a8..d818f8e9 100644
--- a/Server_Install_Pack/sc/BattlEye/scripts.txt
+++ b/Server_Install_Pack/sc/BattlEye/scripts.txt
@@ -36,7 +36,7 @@
7 createUnit !="_unit = _grp createUnit[(_arrUnits select _i), _pos, [], 0, \"FORM\"];" !="_driver = _grp createUnit[\"I_UAV_AI\", position _unit, [], 0, \"CAN_COLLIDE\"];" !="axeGeneral = grpVIPGeneral createUnit ["I_officer_F", axeGeneralPos, [], 1, "CAN_COLLIDE"];"
7 createAgent !="_unit = createAgent[_unitClass, _targetPos, [], 256, \"FORM\"];" !="_unit = createAgent [_unitClass, _targetPos, [], 120, \"FORM\"];" !="_animal = createAgent[_randomAIClass, _animalPos, [], 5, \"NONE\"];" !="_unit = createAgent [\"Epoch_Cloak_F\", _pos, [], 0, \"CAN_COLLIDE\"];" !="_unit = createAgent [\"Epoch_Sapper_F\", _targetPos, [], 180, \"FORM\"];" !="_sapper = createAgent ["Epoch_Sapper_F", getPos _cage2, [], 0, "FORM"];"
7 createTeam
-7 createDialog !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog \"TapOut\";" !="if !(createdialog \"Trade\") exitWith {};" !="_ok = createdialog \"Interact\";" !="_ok = createdialog \"TradeNPCMenu\";" !="createDialog \"Epoch_myGroup\";" !="createDialog (if ((Epoch_my_GroupUID == \"\") && (Epoch_my_Group isEqualTo [])) then {\"EPOCH_createGrp\"} else {\"Epoch_myGroup\"});" !="createDialog \"GroupRequests\";" !="_ok = createdialog \"MissionSelect\";" !="createDialog 'Skaronator_AdminMenu';"
+7 createDialog !="createDialog \"rmx_dynamenu\";" !="createDialog \"rmx_craftingUI\";" !="createDialog \"QuickUpgrade\";" !="createDialog \"QuickTake\";" !="createDialog \"InteractBank\";" !="createdialog \"SelectGender\";" !="_handled = createdialog _dialog;" !="if !(createdialog \"InteractItem\") exitWith {};" !="createDialog _tapDiag;" !="if !(createdialog \"Trade\") exitWith {};" !="_ok = createdialog \"Interact\";" !="_ok = createdialog \"TradeNPCMenu\";" !="createDialog \"Epoch_myGroup\";" !="createDialog (if ((Epoch_my_GroupUID == \"\") && (Epoch_my_Group isEqualTo [])) then {\"EPOCH_createGrp\"} else {\"Epoch_myGroup\"});" !="createDialog \"GroupRequests\";" !="_ok = createdialog \"MissionSelect\";" !="createDialog 'Skaronator_AdminMenu';"
7 createDisplay !="createDisplay \"rmx_dynamenu\";" !="_parent createdisplay _displayClass;"
7 deleteMarker
7 setMarker !="CBA_fnc_setMarkerPersistent\"" !="\\fnc_setMarkerPersistent" !="\"setMarkerPersistent"
@@ -55,9 +55,9 @@
7 displayRemoveAllEventHandlers !="_display displayRemoveAllEventHandlers _x;" !="if !(isMultiplayer) then { { (findDisplay 46) displayRemoveAllEventHandlers _x } forEach [\"KeyUp\", \"KeyDown\"] };"
7 removeAllMissionEventHandlers
7 ctrlRemoveAllEventHandlers !="(uiNamespace getVariable 'ESP_map') ctrlRemoveAllEventHandlers 'Draw';" !="ctrlAddEventHandler ['MouseButtonDown'"
-7 removeEventHandler !="displayRemoveEventHandler" !="player removeEventHandler ['Fired', 0];" !"_currentTarget removeEventHandler[\"EpeContactStart\", _onContactEH]" !" [_adminVar,objnull];\npublicvariable _adminVar;\nplayer removeeventhandler [\"respawn\",_respawn];" !="_plyr removeEventHandler [\"FiredNear\", _smokeEH];" !="player removeEventHandler [_ehKey, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler"
+7 removeEventHandler !="displayRemoveEventHandler" !="player removeEventHandler ['Fired', 0];" !"_currentTarget removeEventHandler[\"EpeContactStart\", _onContactEH]" !" [_adminVar,objnull];\npublicvariable _adminVar;\nplayer removeeventhandler [\"respawn\",_respawn];" !="_plyr removeEventHandler [\"FiredNear\", _smokeEH];" !="player removeEventHandler [_ehKey, 0];" !="player removeEventHandler [_x, 0];" !="\"CBA_fnc_removeEventHandler\"" !="\\fnc_removeEventHandler" !="\"removeEventHandler"
7 displayRemoveEventHandler !"BIS_fnc_guiMessage_status" !="(findDisplay 46) displayRemoveEventHandler [_key, _id];"
-7 switchCamera !="vehicle player switchCamera"
+7 switchCamera !="vehicle player switchCamera" !="_antagonist switchCamera \"Internal\";"
7 remoteControl !"fn_moduleRemoteControl.sqf" !="\"BIS_fnc_moduleRemoteControl"\"
7 drawIcon3D !="drawIcon3D[\"\x\addons\a3_epoch_code\Data\Member.paa\",_color,_pos,1,1,0,_text,1,0.025,\"PuristaMedium\"];\n}forEach EPOCH_ESP_TARGETS;" !"drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_stability],_color,(getPosATL EPOCH_stabilityTarget),5,5,0,\"\",1,0.05,\"PuristaMedium\"];" !"drawIcon3D[format[\"\x\addons\a3_epoch_code\Data\UI\loading_bar_%1.paa\",_num],_color,_pos,4,4,0,\"\",1,0.05,\"PuristaMedium\"];" !"EPOCH_drawIcon3dStability" !"EPOCH_drawIcon3d" !"if (_condition) then {\ndrawIcon3D [_icon, _color, _position, _sizeX, _sizeY, _angle, _text," !="drawIcon3D [\"\A3\UI_F_MP_Mark\Data\Tasks\Misc\background.paa\"" !="drawIcon3D[\"x\addons\a3_epoch_code\Data\UI\snap_ca.paa\""
7 drawLine3D !"{\nfor [{_i = 1}, {_i < count _x}, {_i = _i + 1}] do {\ndrawLine3D [_x select (_i - 1), _x select _i, ((BIS_tracedShooter getVari"
diff --git a/Server_Install_Pack/sc/BattlEye/setvariable.txt b/Server_Install_Pack/sc/BattlEye/setvariable.txt
index 73f52477..350d97e5 100644
--- a/Server_Install_Pack/sc/BattlEye/setvariable.txt
+++ b/Server_Install_Pack/sc/BattlEye/setvariable.txt
@@ -1 +1 @@
-5 "" !=(Offer|Accept|BUILD_SLOT|TRADE_ACTIVE|last_targeter) !="bis_fnc_objectvar_var" !="bis_fnc_selectrespawntemplate_respawned"
+5 "" !=(Offer|Accept|BUILD_SLOT|TRADE_ACTIVE|last_targeter|epoch_(antagobj|antagBomb)) !="bis_fnc_objectvar_var" !="bis_fnc_selectrespawntemplate_respawned"
diff --git a/Sources/epoch_code/compile/EPOCH_supportCopter.sqf b/Sources/epoch_code/compile/EPOCH_supportCopter.sqf
index 6f6d9f21..62b3a16b 100644
--- a/Sources/epoch_code/compile/EPOCH_supportCopter.sqf
+++ b/Sources/epoch_code/compile/EPOCH_supportCopter.sqf
@@ -22,16 +22,29 @@ _grp = createGroup RESISTANCE;
_grp setBehaviour "COMBAT";
_grp setCombatMode "RED";
-// TODO: make configized
-_arrUnits = ["I_Soldier_EPOCH", "I_Soldier2_EPOCH", "I_Soldier3_EPOCH"];
+_minAISkill = getNumber (getMissionConfig "CfgEpochUAVSupport" >> "minAISkill");
+_arrUnits = getArray (getMissionConfig "CfgEpochUAVSupport" >> "unitTypes");
+_unitCount = getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxUnitNum");
_arrSkills = ["aimingAccuracy","aimingShake","aimingSpeed","endurance","spotDistance","spotTime","courage","reloadSpeed","commanding","general"];
+_arrVals = [
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxAimingAccuracy"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxAimingShake"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxAimingSpeed"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxEndurance"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxSpotDistance"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxSpotTime"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxCourage"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxReloadSpeed"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxCommanding"),
+getNumber (getMissionConfig "CfgEpochUAVSupport" >> "maxGeneral")
+];
_units = [];
-for "_i" from 0 to ((count _arrUnits)-1) do {
+for "_i" from 0 to (_unitCount - 1) do {
- _unit = _grp createUnit[(_arrUnits select _i), _pos, [], 0, "FORM"];
+ _unit = _grp createUnit[selectRandom _arrUnits, _pos, [], 0, "FORM"];
_units pushBack _unit;
- _unit setSkill 0.6;
+ //_unit setSkill 0.6;
_unit setRank "Private";
_unit enableAI "TARGET";
@@ -41,9 +54,9 @@ for "_i" from 0 to ((count _arrUnits)-1) do {
_unit disableAI "FSM";
for "_i" from 0 to ((count _arrSkills)-1) do {
- _aiskill = ((floor(random 10))+1)/10;
- if (_aiskill<0.6) then {_aiskill=0.6};
- _unit setSkill [_arrSkills select _i,_aiskill];
+ _aiskill = floor random (_arrVals select _i);
+ if (_aiskill<_minAISkill) then {_aiskill=_minAISkill};
+ _unit setSkill [_arrSkills select _i,_arrVals select _i];
};
if (_i == 0) then {
diff --git a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
index eddf17e5..d81cd04b 100644
--- a/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
+++ b/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
@@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
- Contributors:
+ Contributors: Andrew Gregory
Description:
Antagonist spawn function
@@ -12,15 +12,19 @@
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_code/compile/EPOCH_unitSpawn.sqf
*/
-private ["_unit","_sapperNum","_config","_bomb","_targetPos","_grp","_driver","_index","_nonJammer","_nonTrader","_jammers","_jammerRange","_restricted","_disableAI"];
-params ["_unitClass"];
-
+private ["_unit","_sapperNum","_config","_targetPos","_grp","_driver","_index","_nonJammer","_nonTrader","_jammers","_jammerRange","_restricted","_disableAI"];
+params ["_unitClass","_trgt","_doVariable"];
+private _bomb = objNull;
+if(isNil "_doVariable")then{_doVariable=false;};
+if(isNil "_trgt")then{_trgt=player;};
+diag_log format["Epoch: ADMIN: Antagonist %1 Spawning on %2. Do variable: %3.", _unitClass, _trgt, _doVariable];
if(random 100 < 6)then{
[] execFSM "\x\addons\a3_epoch_code\System\Event_Air_Drop.fsm";
};
+if(_doVariable)then{_unitClass call EPOCH_unitSpawnIncrease;};//Assumes Antagonist is required.
_index = EPOCH_spawnIndex find _unitClass;
-if (count(player nearEntities[_unitClass, 800]) >= (EPOCH_playerSpawnArray select _index)) exitWith{};
+if (!_doVariable && (count(_trgt nearEntities[_unitClass, 800]) >= (EPOCH_playerSpawnArray select _index))) exitWith{};
_nonJammer = ["CfgEpochClient", "nonJammerAI", ["B_Heli_Transport_01_F","PHANTOM","Epoch_Cloak_F"]] call EPOCH_fnc_returnConfigEntryV2;
_nonTrader = ["CfgEpochClient", "nonTraderAI", ["B_Heli_Transport_01_F","PHANTOM","Epoch_Cloak_F","GreatWhite_F"]] call EPOCH_fnc_returnConfigEntryV2;
@@ -28,18 +32,22 @@ _nonTraderAIRange = ["CfgEpochClient", "nonTraderAIRange", 150] call EPOCH_fnc_r
_unit = objNull;
-_targetPos = getPosATL player;
+_targetPos = getPosATL _trgt;
_targetPos set [2,0];
_jammers = [];
_config = 'CfgEpochClient' call EPOCH_returnConfig;
_jammerRange = getNumber(_config >> "buildingJammerRange");
_jammers = nearestObjects[_targetPos, ["PlotPole_EPOCH"], _jammerRange];
-if(count _jammers > 0 && (_unitClass in _nonJammer))exitWith{};
+if(count _jammers > 0 && (_unitClass in _nonJammer))exitWith{
+ if(_doVariable)then{["Not allowed near a base - Please respawn !", 5] call Epoch_dynamicText;};
+};
_restricted = [];
_restricted = nearestObjects [_targetPos, ["ProtectionZone_Invisible_F"], _nonTraderAIRange];
-if(count _restricted > 0 && (_unitClass in _nonTrader))exitWith{};
+if(count _restricted > 0 && (_unitClass in _nonTrader))exitWith{
+ if(_doVariable)then{["Not allowed near a trader - Please respawn !", 5] call Epoch_dynamicText;};
+};
_disableAI = {
{_this disableAI _x}forEach["TARGET","AUTOTARGET","FSM"];
@@ -49,11 +57,11 @@ switch _unitClass do {
case "Epoch_Cloak_F": {
_unit = createAgent[_unitClass, _targetPos, [], 256, "FORM"];
_unit call _disableAI;
- [_unit] execFSM "\x\addons\a3_epoch_code\System\cloak.fsm";
+ [_unit,_trgt] execFSM "\x\addons\a3_epoch_code\System\cloak.fsm";
};
case "GreatWhite_F": {
if (surfaceIsWater _targetPos) then{
- if (((_targetPos vectorDiff getPosASL player) select 2) > 25) then{
+ if (((_targetPos vectorDiff getPosASL _trgt) select 2) > 25) then{
_unit = createAgent[_unitClass, _targetPos, [], 120, "FORM"];
_unit call _disableAI;
[_unit] execFSM "\x\addons\a3_epoch_code\System\Shark_Brain.fsm";
@@ -61,19 +69,19 @@ switch _unitClass do {
};
};
case "Epoch_Sapper_F": {
- if(random 100 < 6)then{
+ if(random 100 < 6 && isNull _trgt)then{
_config = 'CfgEpochSapper' call EPOCH_returnConfig;
_sapperNum = 8;
if(getNumber(_config >> "sapperMigrationCount") > 0)then{
_sapperNum = getNumber(_config >> "sapperMigrationCount");
};
- [player,_sapperNum] execVM "epoch_code\compile\EPOCH_callSapperMigration.sqf";
+ [_trgt,_sapperNum] execVM "epoch_code\compile\EPOCH_callSapperMigration.sqf";
}else{
_unit = createAgent[_unitClass, _targetPos, [], 256, "FORM"];
_bomb = createVehicle ["Sapper_Charge_Ammo", _targetPos, [], 0, "CAN_COLLIDE"];
_bomb attachTo [_unit, [0,0,0],"Pelvis"];
_unit call _disableAI;
- sapperHndl = [_unit, _bomb] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain.fsm";
+ sapperHndl = [_unit, _bomb, _trgt] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain.fsm";
_unit addEventHandler ["FiredNear", "sapperHndl setFSMVariable [""_sFiredNear"",[_this select 1, _this select 2]];"];
_unit addEventHandler ["Hit", "sapperHndl setFSMVariable [""_sHit"",[_this select 1, _this select 2]];"];
};
@@ -83,12 +91,12 @@ switch _unitClass do {
_bomb = createVehicle["SapperB_Charge_Ammo", _targetPos, [], 0, "CAN_COLLIDE"];
_bomb attachTo[_unit, [0, 0, 0], "Pelvis"];
_unit call _disableAI;
- sapperHndl = [_unit, _bomb] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain2.fsm";
+ sapperHndl = [_unit, _bomb, _trgt] execFSM "\x\addons\a3_epoch_code\System\Sapper_Brain2.fsm";
_unit addEventHandler["FiredNear", "sapperHndl setFSMVariable [""_sFiredNear"",[_this select 1, _this select 2]];"];
_unit addEventHandler["Hit", "sapperHndl setFSMVariable [""_sHit"",[_this select 1, _this select 2]];"];
};
case "I_UAV_01_F": {
- _targetPos = getPosATL player;
+ _targetPos = getPosATL _trgt;
_targetPos = [_targetPos, 600, 1200, 5, 0, 400, 0] call BIS_fnc_findSafePos;
_targetPos set[2, 600];
_unit = createVehicle["I_UAV_01_F", _targetPos, [], 0, "FLY"];
@@ -97,7 +105,7 @@ switch _unitClass do {
_grp = createGroup RESISTANCE;
_driver = _grp createUnit["I_UAV_AI", position _unit, [], 0, "CAN_COLLIDE"];
_driver moveInAny _unit;
- [_unit, player] execFSM "\x\addons\a3_epoch_code\System\Copter_brain.fsm";
+ [_unit, _trgt] execFSM "\x\addons\a3_epoch_code\System\Copter_brain.fsm";
};
case "PHANTOM": {
[] execFSM "\x\addons\a3_epoch_code\System\Phantom_Brain.fsm";
@@ -107,6 +115,12 @@ switch _unitClass do {
};
};
+if(_doVariable && (!isNull _unit) && (!isNull _trgt))then{
+_trgt setVariable ["EPOCH_antagObj", _unit, true];
+if!(isNull _bomb)then{
+_trgt setVariable ["EPOCH_antagBomb", _bomb, true];
+};
+};
if !(isNull _unit) then {
// send to server
[_unit] remoteExec ["EPOCH_localCleanup",2];
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf
index ab19c739..9db92ecd 100644
--- a/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_dirToFuzzy.sqf
@@ -4,7 +4,7 @@
Contributors:
Description:
- Epoch cursorTarget anywhere
+ Direction from one object to another plus a degree value to chose a random direction within.
Licence:
Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
@@ -18,7 +18,7 @@
Parameter(s):
_this select 0: (ARRAY or OBJECT) - position1
_this select 1: (ARRAY or OBJECT) - position2
- _this select 2: NUMBER - random spread [optional: default 32]
+ _this select 2: NUMBER - random spread [optional: default 32] max 360
Returns:
SCALAR - (direction 0-360)
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf
new file mode 100644
index 00000000..c2b78477
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf
@@ -0,0 +1,65 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors:
+
+ Description:
+ Switch player camera to antagonist. Currently only for use after player death. Return to player body when finished or revived.
+
+ 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/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerAttachToAntagonist.sqf
+
+ Example:
+ [_antagonistObj,_plyrObj] call EPOCH_fnc_playerAttachToAntagonist;
+
+ Parameter(s):
+ _this select 0: OBJECT - Antagonist Object
+ _this select 1: OBJECT - Player Object
+
+ Returns:
+
+*/
+params ["_player", "_antagonist", "_bomb","_killer"];
+private _tapDiag = "TapOut";
+if (visibleMap) then {openMap [false, true];};
+_antagonist switchCamera "Internal";
+if(isNil "_bomb")then{_bomb = objNull;};
+if(typeOf _antagonist == "Epoch_Sapper_F" || typeOf _antagonist == "Epoch_SapperB_F")then{_tapDiag = "TapOut3";};
+createDialog _tapDiag;
+
+diag_log format["Epoch: DEBUG: Attaching player %1 to %2, bomb found: %3",_player,_antagonist,_bomb];
+[_antagonist,_tapDiag,_player,_killer] spawn{
+_antagonist2 = _this select 0;
+_tapDiag2 = _this select 1;
+_player2 = _this select 2;
+_killer2 = _this select 3;
+private _doingGroan = false;
+private _doingBoom = false;
+private _groanTime = diag_tickTime;
+ while {!alive _player2} do {
+ if (playerRespawnTime <= 1) exitWith{ (findDisplay 46) closeDisplay 0; };
+ if (playerRespawnTime > 15 && !dialog) then {createDialog _tapDiag2;};
+ if (isObjectHidden _player2) exitWith {[_player2,Epoch_personalToken,_killer2, "EPOCH_antagObj", objNull, true] remoteExec ["EPOCH_server_playerSetVariable",2];closeDialog 2;};//revivial
+ if((!alive _antagonist2)) exitWith {
+ [_player2,Epoch_personalToken,_killer2, "EPOCH_antagObj", objNull, true] remoteExec ["EPOCH_server_playerSetVariable",2];
+ uiSleep 3;(findDisplay 46) closeDisplay 0;};
+ if(_player2 getVariable["EPOCH_callGroan",false])then{
+ _player2 setVariable["EPOCH_callGroan",false];
+ _doingGroan = true;
+ _groanTime = diag_tickTime;
+ [_player2,Epoch_personalToken,_killer2, "EPOCH_callGroan", true, false] remoteExec ["EPOCH_server_playerSetVariable",2];
+ };
+ if(_player2 getVariable["EPOCH_callBoom",false])then{
+ _player2 setVariable["EPOCH_callBoom",false];
+ _doingBoom = true;
+ [_player2,Epoch_personalToken,_killer2, "EPOCH_callBoom", true, false] remoteExec ["EPOCH_server_playerSetVariable",2];
+ };
+ if(_doingGroan && ctrlEnabled 1602)then{ctrlEnable[1602,false];};
+ if(_doingGroan && !(ctrlEnabled 1602) && diag_tickTime - _groanTime > 16)then{ctrlEnable[1602,true];_doingGroan=false;};
+ if(_doingBoom && ctrlEnabled 1601)then{ctrlEnable[1601,false];};
+ uiSleep 0.1;
+ };
+};
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf
index 61644cbc..6e6e46d0 100644
--- a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeath.sqf
@@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
- Contributors:
+ Contributors: Andrew Gregory
Description:
Player death handler
@@ -22,6 +22,8 @@
Returns:
BOOL
*/
+private _tapDiag = "TapOut";
+private _doRevenge = false;
params ["_unit", "_killer"];
// test ejecting unit from vehicle if dead client side
@@ -36,21 +38,26 @@ EPOCH_buildMode = 0;
EPOCH_snapDirection = 0;
EPOCH_Target = objNull;
+if(player != _killer && (isPlayer _killer || isPlayer (effectiveCommander _killer)))then{_tapDiag = "TapOut2";};//TODO: vehicle check may not always be reliable
+
if (Epoch_canBeRevived) then {
setPlayerRespawnTime 600;
- createDialog "TapOut";
+ createDialog _tapDiag;
} else {
setPlayerRespawnTime 15;
["You can be just revived once per life!", 5] call Epoch_dynamicText;
};
-[] spawn{
+[_killer, _tapDiag] spawn{
+ _killer2 = _this select 0;
+ _tapDiag2 = _this select 1;
while {!alive player} do {
if (playerRespawnTime <= 1) exitWith{ (findDisplay 46) closeDisplay 0; };
- if (playerRespawnTime > 15 && !dialog) then {
- createDialog "TapOut";
- };
+ if (playerRespawnTime > 15 && !dialog) then {createDialog _tapDiag2;};
+ if (isObjectHidden player) then {closeDialog 2;};
+ if(player getVariable["EPOCH_doBoom",false])exitWith{player setVariable ["EPOCH_doBoom",nil];[player] call EPOCH_fnc_playerDeathDetonate;};
+ if(player getVariable["EPOCH_doMorph",false])exitWith{player setVariable ["EPOCH_doMorph",nil];[selectRandom (getArray (getMissionConfig "CfgEpochClient" >> "deathMorphClass")),player,_killer2] call EPOCH_fnc_playerDeathMorph;};
uiSleep 0.1;
};
};
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf
new file mode 100644
index 00000000..770f9bde
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf
@@ -0,0 +1,36 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors:
+
+ Description:
+ Detonate player body.
+
+ 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/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathDetonate.sqf
+
+ Example:
+ [] call EPOCH_fnc_playerDeathDetonate;
+
+ Parameter(s):
+
+ Returns:
+ BOOM
+*/
+params ["_player"];
+openmap [false,false];
+closeDialog 2;
+[_player, Epoch_personalToken] remoteExec ["EPOCH_server_deadPlayerDetonate",2];
+deleteVehicle player;
+player setVariable ["doneBoom", true];
+
+[] spawn{
+ while {!alive player} do {
+ //Handle clean up
+ if(player getVariable["doneBoom",false])exitWith{player setVariable ["doneBoom",nil]; uiSleep 5; (findDisplay 46) closeDisplay 0;};
+ uiSleep 0.1;
+ };
+};
\ No newline at end of file
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf
new file mode 100644
index 00000000..1b06337e
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf
@@ -0,0 +1,38 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors:
+
+ Description:
+ Morph dead player body into an antagonist, called from player death GUI. Dead player camera will attach to antagonist.
+
+ 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/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerDeathMorph.sqf
+
+ Example:
+ [] call EPOCH_fnc_playerDeathMorph;
+
+ Parameter(s):
+ _this select 0: STRING - Antagonist class
+ _this select 1: OBJECT - Player (Victim)
+ _this select 2: OBJECT - Target Player (Killer)
+
+ Returns:
+*/
+params ["_antagonistClass", "_player", "_killer"];
+
+openmap [false,false];
+[_killer,_antagonistClass,true,_player, Epoch_personalToken] remoteExec ["EPOCH_server_triggerAntagonist",2];
+
+[_killer,_player] spawn{
+_killer2 = _this select 0;
+_player2 = _this select 1;
+ while {!alive player} do {
+ if (isObjectHidden _player2) then {closeDialog 2;};
+ if!(isNull (_killer2 getVariable["EPOCH_antagObj",objNull])) exitWith {closeDialog 2;[_player2,(_killer2 getVariable["EPOCH_antagObj",objNull]),(_killer2 getVariable["EPOCH_antagBomb",objNull]),_killer2] call EPOCH_fnc_playerAttachToAntagonist;};
+ uiSleep 0.1;
+ };
+};
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf
new file mode 100644
index 00000000..8630d935
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf
@@ -0,0 +1,30 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors:
+
+ Description:
+ call setVariable from client. Allows the server to call and set a local variable on an object via a player without broadcasting.
+
+ 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/master/Sources/epoch_code/compile/functions/EPOCH_fnc_playerSetVariable.sqf
+
+ Example:
+ [_obj,_var,_value,_local] call EPOCH_fnc_playerSetVariable;
+
+ Parameter(s):
+ _this select 0: OBJECT - Object to attach variable to
+ _this select 1: STRING - Variable Name
+ _this select 2: ANYTHING - Variable Value
+ _this select 3: BOOLEAN - Broadcast ?
+ Returns:
+
+*/
+
+params ["_obj", "_var", "_value", "_local"];
+if(isNil "_local")then{_local = false;};
+diag_log format["Epoch: ADMIN: Attempting Set variable [%2,%3,%4] on %1.", _obj, _var, _value,_local];
+_obj setVariable [_var,_value,_local];
\ No newline at end of file
diff --git a/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf b/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf
new file mode 100644
index 00000000..f8613241
--- /dev/null
+++ b/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf
@@ -0,0 +1,27 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors: Aaron Clark
+
+ Description:
+ Send server message to trigger antagonist on another client. Server returns antagonist object where required. Designed to support additional tap out options (Morphing).
+
+ 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/master/Sources/epoch_code/compile/functions/EPOCH_fnc_triggerAntagonist.sqf
+
+ Example:
+ [_killer, "Epoch_Sapper_F", player, true] call EPOCH_fnc_triggerAntagonist;
+
+ Parameter(s):
+ _this select 0: Target client to trigger antagonist on. (Killer)
+ _this select 1: Antagonist class to spawn, e.g. "Epoch_Sapper_F", see EPOCH_unitSpawn.sqf for full list
+ _this select 2: On target, set variable containing antagonist object. Allows other players / requesting player to attach to antagonist object.
+
+ Returns:
+
+*/
+params ["_target","_antagonist","_doVariable"];
+[_target,_antagonist,_doVariable,player,Epoch_personalToken] remoteExec ["EPOCH_server_triggerAntagonist",2];
\ No newline at end of file
diff --git a/Sources/epoch_config/Configs/CfgClientFunctions.hpp b/Sources/epoch_config/Configs/CfgClientFunctions.hpp
index b724bdb4..2eea97af 100644
--- a/Sources/epoch_config/Configs/CfgClientFunctions.hpp
+++ b/Sources/epoch_config/Configs/CfgClientFunctions.hpp
@@ -112,6 +112,11 @@ class CfgClientFunctions
class fnc_findSapperStalkLocation {};
class fnc_dirToFuzzy {};
class fnc_cursorTarget {};
+ class fnc_triggerAntagonist {};
+ class fnc_playerDeathDetonate {};
+ class fnc_playerDeathMorph {};
+ class fnc_playerSetVariable {};
+ class fnc_playerAttachToAntagonist {};
};
class environment
{
diff --git a/Sources/epoch_config/Configs/CfgEpochClient.hpp b/Sources/epoch_config/Configs/CfgEpochClient.hpp
index 0cf9c1aa..5cf1c020 100644
--- a/Sources/epoch_config/Configs/CfgEpochClient.hpp
+++ b/Sources/epoch_config/Configs/CfgEpochClient.hpp
@@ -1,6 +1,6 @@
/*
Author: Aaron Clark - EpochMod.com
- Contributors:
+ Contributors: Andrew Gregory
Description:
Main Client side configs for the Epoch gamemode
@@ -13,7 +13,7 @@
*/
class CfgEpochClient
{
- epochVersion = "0.3.8.0";
+ epochVersion = "0.3.9.0";
sapperRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 = 1% - 55% if soiled (+ 2% if in city) chance to spawn sapper
droneRngChance = 100; // increase number to reduce chances and reduce to increase. Default 100 = // 2% chance (+ 4% chance if in city) (1% - 2% Half if using silencer) to spawn drone if shot fired
buildingNearbyMilitary = 0; //1 to allow building nearby
@@ -23,6 +23,7 @@ class CfgEpochClient
buildingJammerRange = 75; // jammer range in meters
disableRemoteSensors = true; // disableRemoteSensors true
EPOCH_news[] = {"Word is that Sappers have a new boss.","Dogs will often lure them monsters away.","My dog was blown up. I miss him.."};
+ deathMorphClass[] = {"Epoch_Sapper_F","Epoch_SapperB_F","I_UAV_01_F","Epoch_Cloak_F"};//Random selection of these classes when player morphs after death. Currently available: Epoch_Cloak_F, Epoch_SapperB_F, Epoch_Sapper_F, I_UAV_01_F
antagonistSpawnIndex[] = {
{"Epoch_Cloak_F", 1}, // {"type", limit}
{"GreatWhite_F", 2},
@@ -57,16 +58,16 @@ class CfgEpochClient
// Event handler code
displayAddEventHandler[] = {"keyDown","keyUp"};
- keyDown = "(_this call EPOCH_KeyDown)";
- keyUp = "(_this call EPOCH_KeyUp)";
+ keyDown = "(_this call EPOCH_KeyDown)";
+ keyUp = "(_this call EPOCH_KeyUp)";
addEventHandler[] = {"Respawn","Put","Take","InventoryClosed","InventoryOpened","Fired","Killed","HandleRating","GetInMan","GetOutMan"};
Respawn = "(_this select 0) call EPOCH_clientRespawn";
Put = "(_this select 1) call EPOCH_interact;_this call EPOCH_PutHandler";
- Take = "(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck";
- Fired = "_this call EPOCH_fnc_playerFired;";
- InventoryClosed = "if !(EPOCH_arr_interactedObjs isEqualTo[]) then {[EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; EPOCH_arr_interactedObjs = [];};";
+ Take = "(_this select 1) call EPOCH_interact;_this call EPOCH_UnisexCheck";
+ Fired = "_this call EPOCH_fnc_playerFired;";
+ InventoryClosed = "if !(EPOCH_arr_interactedObjs isEqualTo[]) then {[EPOCH_arr_interactedObjs] remoteExec['EPOCH_server_save_vehicles', 2]; EPOCH_arr_interactedObjs = [];};";
InventoryOpened = "_this spawn EPOCH_initUI;_container = _this select 1;_lockedNear = false;if (_container isKindOf 'GroundWeaponHolder' || _container isKindOf 'WeaponHolderSimulated') then {{if (locked _x in [2, 3] ||_x getVariable['EPOCH_Locked', false]) exitWith {_lockedNear = true}} forEach (player nearSupplies 10);};if (locked _container in [2, 3] || _container getVariable['EPOCH_Locked', false] || _lockedNear) then {[] spawn {disableSerialization;waitUntil {!isNull findDisplay 602};_display = findDisplay 602;_ctrl_cargo = _display displayCtrl 6401;_ctrl_ground = _display displayCtrl 6321;_ctrl_cargo ctrlEnable false;ctrlSetFocus _ctrl_ground;ctrlActivate _ctrl_ground;};};";
- Killed = "_this call EPOCH_fnc_playerDeath;";
+ Killed = "_this call EPOCH_fnc_playerDeath;";
HandleRating = "EPOCH_playerKarma = EPOCH_playerKarma + (_this select 1);0";
HandleDamage = "";
HandleHeal = "";
@@ -108,6 +109,10 @@ class CfgEpochSapper
groanTrig = 16; //Percentage chance of a groan. Min value = 4
sRange = 300; //Distance from target over which sapper will dispose. Range within which sapper code will be aware of targets. Distance up to which sapper will attempt to find a spot to hide in. Min Value = 150.
smellDist = 24; //Distance up to which sapper can smell. Used to decide if sapper can see target when deciding to charge and influences target selection. Is influenced by wind direction. Min Value = 8.
+ reflexSpeed = 0.25; //Sapper brain will pause for this time when checking for new stimulus during each thought process. Lower number equals a more reactive sapper. (Guide Min 0.25 - Max 2.5).
+ nestChance = 2; //Every time a sapper spawns apply this percentage chance that sapper will create a nest.
+ hideLevel = 72; //(Emotion) Sapper fear increases by several factors, higher number of armed player(s) in area / being shot at. Set fear level (out of 100) at which he will go into a 'hide / evade mode'.. temporarily.
+ chargeLevel = 52; //(Emotion) Sapper anger increases by smelling / sensing players, being shot at / hit, too many players on his turf. Set level (Out of 100) at which he is triggered to charge on the current target.
};
class CfgEpochUAV
{
@@ -115,6 +120,22 @@ class CfgEpochUAV
UAVMaxDist = 180; //Maximum distance to choose next position when roaming. Min Value = 42 / Max Value = 400.
UAVHeight = 100; //Set height when roaming, slight randomness is applied to this value. UAV will choose own height when locked onto target. Min Value = 42 / Max Value = 280. UAV can still spot targets from height !
};
+class CfgEpochUAVSupport
+{
+ unitTypes[] = {"I_Soldier_EPOCH", "I_Soldier2_EPOCH", "I_Soldier3_EPOCH"};//Selects from randomly
+ maxUnitNum = 2; //Maximum number of units spawned when UAV spots target.
+ minAISkill = 0.2; //Minumum AI Skill. Skills are chosen randomly between this minimum overall AI skill value and the following max AI skill values, for each of the next skills:
+ maxAimingAccuracy = 0.7;
+ maxAimingShake = 0.9;
+ maxAimingSpeed = 0.6;
+ maxEndurance = 0.4;
+ maxSpotDistance = 0.4;
+ maxSpotTime = 0.3;
+ maxCourage = 0.3;
+ maxReloadSpeed = 0.5;
+ maxCommanding = 0.4;
+ maxGeneral = 0.4;
+};
class CfgEpochAirDrop
{
AirDropFreq = 1200; //AirDropChance, to decide if Air drop occurs, will only be checked once per AirDropFreq time period, for each player. Min value = 120.
diff --git a/Sources/epoch_config/Configs/CfgRemoteExec.hpp b/Sources/epoch_config/Configs/CfgRemoteExec.hpp
index e780ee73..fbef7146 100644
--- a/Sources/epoch_config/Configs/CfgRemoteExec.hpp
+++ b/Sources/epoch_config/Configs/CfgRemoteExec.hpp
@@ -1,7 +1,7 @@
/*
Author: Aaron Clark - EpochMod.com
- Contributors:
+ Contributors: Andrew Gregory
Description:
RemoteExec whitelist for Epoch sandbox gamemode. This also blacklists default A3 remoteExec commands.
@@ -197,6 +197,19 @@ class CfgRemoteExec
allowedTargets=2;
jip = 0;
};
+ class EPOCH_server_triggerAntagonist {
+ allowedTargets=2;
+ jip = 0;
+ };
+ class EPOCH_server_deadPlayerDetonate {
+ allowedTargets=2;
+ jip = 0;
+ };
+ class epoch_server_playersetvariable {
+ allowedTargets=2;
+ jip = 0;
+ };
+
};
class Commands {mode=0;};
};
diff --git a/Sources/epoch_config/build.hpp b/Sources/epoch_config/build.hpp
index d19191ba..45b88f7d 100644
--- a/Sources/epoch_config/build.hpp
+++ b/Sources/epoch_config/build.hpp
@@ -1 +1 @@
-build=439;
+build=443;
diff --git a/Sources/epoch_server/build.hpp b/Sources/epoch_server/build.hpp
index d19191ba..45b88f7d 100644
--- a/Sources/epoch_server/build.hpp
+++ b/Sources/epoch_server/build.hpp
@@ -1 +1 @@
-build=439;
+build=443;
diff --git a/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf b/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf
new file mode 100644
index 00000000..7a498c79
--- /dev/null
+++ b/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf
@@ -0,0 +1,24 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors: Aaron Clark
+
+ Description:
+ Trigger an antagonist on a client. Option to add antagonist object to target as a variable.
+
+ 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/master/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_triggerAntagonist.sqf
+*/
+params ["_target","_antagonistClass","_doVariable","_player","_token"];
+diag_log format["Epoch: ADMIN: Attempting antagonist (%3) trigger from %1 for %2.", getPlayerUID _player, _target, _antagonistClass];
+if !([_player,_token]call EPOCH_server_getPToken)exitWith{};
+
+if(!isNull _target)then{
+diag_log format["Epoch: ADMIN: Calling antagonist (%3) trigger from %1 for %2.", getPlayerUID _player, _target, _antagonistClass];
+
+[_antagonistClass, _target, _doVariable] remoteExec ["EPOCH_unitSpawn",_target];
+//if(!isNull _player)then{hideObjectGlobal _player;};//Do elsewhere, allow revival
+};
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf
index fcb8aae7..93f409d2 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_loadBuildings.sqf
@@ -73,7 +73,6 @@ for "_i" from 0 to _this do {
if (isClass (configFile >> "CfgVehicles" >> _class) && (_damage < 1) && !(_class isKindOf 'Constructions_lockedstatic_F')) then {
_baseObj = createVehicle [_class, [0,0,0], [], 0, "CAN_COLLIDE"];
-
_baseObj setposATL _location;
_baseObj setVectorDirAndUp _worldspace;
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_unsuppported.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_unsuppported.sqf
index 61478a42..46ea0a35 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_unsuppported.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_unsuppported.sqf
@@ -43,7 +43,7 @@ _stableCount = 0;
_playerUID = _x getVariable["BUILD_OWNER", "-1"];
_slot = _x getVariable["EPOCH_secureStorage", "-1"];
deleteVehicle _x;
- _newObj = createVehicle[_class, _objectPos, [], 0, "CAN_COLLIDE"];
+ _newObj = createVehicle[_class, [0,0,0], [], 0, "CAN_COLLIDE"];
_newObj setVariable["BUILD_SLOT", _objSlot, true];
_newObj setposASL _objectPos;
_newObj setVectorDirAndUp[_vDir, _vUP];
diff --git a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf
index d1883ad5..6c2b37fc 100644
--- a/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf
+++ b/Sources/epoch_server/compile/epoch_bases/EPOCH_server_upgradeBUILD.sqf
@@ -33,7 +33,7 @@ if (_objSlot != -1) then {
deleteVehicle _object;
_class = _upgrade select 0;
- _newObj = createVehicle [_class, _objectPos, [], 0, "CAN_COLLIDE"];
+ _newObj = createVehicle [_class, [0,0,0], [], 0, "CAN_COLLIDE"];
_newObj setVariable ["BUILD_SLOT",_objSlot,true];
_newObj call EPOCH_server_buildingInit;
_newObj setposATL _objectPos;
diff --git a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf
index adf85075..50e80763 100644
--- a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf
+++ b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_airDropCrate.sqf
@@ -1,7 +1,7 @@
/*
- Author: Aaron Clark - EpochMod.com
+ Author: Andrew Gregory - EpochMod.com
- Contributors:
+ Contributors: Aaron Clark
Description:
Creates air drop crate
diff --git a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf
index 9d445df6..d988bd83 100644
--- a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf
+++ b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createAirDrop.sqf
@@ -1,7 +1,7 @@
/*
- Author: Aaron Clark - EpochMod.com
+ Author: Andrew Gregory - EpochMod.com
- Contributors:
+ Contributors: Aaron Clark
Description:
Creates helicopter air drop
diff --git a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf
index 61da45db..2adc6d47 100644
--- a/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf
+++ b/Sources/epoch_server/compile/epoch_missions/EPOCH_Server_createObject.sqf
@@ -1,7 +1,7 @@
/*
- Author: Aaron Clark - EpochMod.com
+ Author: Andrew Gregory - EpochMod.com
- Contributors:
+ Contributors: Aaron Clark
Description:
Server side spawing of shipwreck loots
diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayerDetonate.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayerDetonate.sqf
new file mode 100644
index 00000000..941e9fcf
--- /dev/null
+++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_deadPlayerDetonate.sqf
@@ -0,0 +1,22 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors: Aaron Clark
+
+ Description:
+ Detonate a boss sapper bomb at player position.
+
+ 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/master/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_playerDeathOptions.sqf
+*/
+params ["_player", "_token"];
+diag_log format["Epoch: ADMIN: Attempting player detonate on %1.", getPlayerUID _player];
+if !([_player,_token]call EPOCH_server_getPToken)exitWith{};
+
+_pos = getPosATL _player;
+_bomb = createVehicle["SapperB_Charge_Ammo", _pos, [], 0, "CAN_COLLIDE"];
+_bomb setDamage 1;
+hideObjectGlobal _player;
\ No newline at end of file
diff --git a/Sources/epoch_server/compile/epoch_player/EPOCH_server_playerSetVariable.sqf b/Sources/epoch_server/compile/epoch_player/EPOCH_server_playerSetVariable.sqf
new file mode 100644
index 00000000..bb05deac
--- /dev/null
+++ b/Sources/epoch_server/compile/epoch_player/EPOCH_server_playerSetVariable.sqf
@@ -0,0 +1,18 @@
+/*
+ Author: Andrew Gregory - EpochMod.com
+
+ Contributors:
+
+ Description:
+ Call setVariable on specific client.
+
+ 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/master/Sources/epoch_server/compile/epoch_antagonists/EPOCH_server_playerSetVariable.sqf
+*/
+params ["_player","_token","_obj", "_var", "_value", "_local"];
+if !([_player,_token]call EPOCH_server_getPToken)exitWith{};
+diag_log format["Epoch: ADMIN: Attempting Set variable [%2,%3,%4] on %1.", _obj, _var, _value,_local];
+[_obj, _var,_value,_local] remoteExec ['EPOCH_fnc_playerSetVariable', _obj];
\ No newline at end of file
diff --git a/Sources/epoch_server/config.cpp b/Sources/epoch_server/config.cpp
index 9128d65a..89309c60 100644
--- a/Sources/epoch_server/config.cpp
+++ b/Sources/epoch_server/config.cpp
@@ -71,13 +71,14 @@ class CfgServerFunctions
class server_savePlayer {};
class server_loadPlayer {};
class server_checkPlayer {};
- // class server_respawnPlayer {};
class server_onPlayerDisconnect {};
class server_deadPlayer {};
class server_revivePlayer {};
class server_storeCrypto {};
class server_equippedItem {};
class server_unpackBackpack {};
+ class server_deadPlayerDetonate{};
+ class server_playerSetVariable{};
};
class epoch_traders {
class server_loadTraders {};
@@ -132,12 +133,13 @@ class CfgServerFunctions
class server_handle_say3D {};
class server_handle_switchMove {};
class server_handle_sapperObjs {};
+ class server_triggerAntagonist{};
};
};
};
class CfgServerVersion
{
- client = "0.3.8.0";
- config = "0.3.8.0";
+ client = "0.3.9.0";
+ config = "0.3.9.0";
hive = "0.5.1.7";
};
diff --git a/Sources/epoch_server/init/server_securityfunctions.sqf b/Sources/epoch_server/init/server_securityfunctions.sqf
index de59eb35..35516563 100644
--- a/Sources/epoch_server/init/server_securityfunctions.sqf
+++ b/Sources/epoch_server/init/server_securityfunctions.sqf
@@ -12,6 +12,8 @@
Github:
https://github.com/EpochModTeam/Epoch/tree/master/Sources/epoch_server/init/server_securityfunctions.sqf
*/
+private ["_code","_functionName","_remoteExecClientStr","_onLoad","_onUnload","_skn_blockedSpawnMenuUID","_temp","_skn_adminMenuOwner","_case","_skn_adminMenuHigh","_skn_adminMenuLow","_config","_debugClass","_cfg_systemDebug","_skn_systemDebug1","_skn_systemDebug2","_skn_systemDebug3","_skn_systemDebug4","_skn_systemDebug5","_cfg_remoteExecClient","_remoteExecClient_NAMES","_cfg_limits","_skn_playerCryptoLimit","_cfg_learning","_skn_trustedUsers","_str_learningModeCheck","_cfg_quality","_skn_perfMode","_skn_viewDistance","_skn_viewDistanceObects","_skn_terrainGrid","_cfg_blacklistConfig","_skn_badDisplaysArray","_skn_badAnimations","_cfg_variablesConfig","_skn_badVarCheckArray","_skn_nilVarCheckArray","_skn_commandMenuArray","_skn_addEHConfig","_skn_displayAddEHChecks","_skn_addEHArray","_serverSettingsConfig","_skn_enableAntihack","_skn_check_addons","_checkFiles","_skn_check_files","_whitelistPatches","_skn_whitelist_cfgPatches","_skn_adminsOwner","_skn_adminsHigh","_skn_adminsLow","_banReasons","_skn_banReason","_antihack_banDuration","_epoch_banReasons","_kickReasons","_epoch_kickReason","_epoch_kickReasons","_ownerSettings","_skn_adminMenuOwnerSetting","_adminSettings","_skn_adminMenuHighSetting","_lowSettings","_skn_adminMenuLowSetting","_skn_adminMenuMenuKey","_skn_adminMenuInfrontTeleport","_skn_adminMenuBanReasons","_skn_adminMenuCryproCfg","_skn_cfgPatchesCfg","_skn_PVSPrefix","_rndVAR_Count","_skn_rndVA","_skn_PVC_INDEX","_skn_AH_rndVarVehicle","_skn_AH_rndVarPlayer","_skn_AH_rndVarAHInitCheck","_skn_AH_Init","_skn_AH_Code","_skn_AH_Code_CA","_skn_AH_Code_CB","_skn_AH_Ban","_skn_AH_rndVar","_skn_doKickBan","_skn_server_getRealTime","_skn_pv_hackerLog","_skn_pv_adminLog","_skn_server_adminLog","_skn_doAdminRequest","_skn_doAdminLog","_skn_doTokenAuth","_skn_antiTeleportPVC","_skn_Admin_Code","_skn_Admin_Init","_skn_adminRequest_PVC","_skn_adminLog_PVC","_skn_adminLog","_skn_AdminKeyDown","_skn_AdminMenu_Init","_skn_getCtrl","_skn_fnc_Spec","_skn_Update_AdminButtons","_skn_mainMenuCfg","_skn_FillMainMenu","_skn_FillPlayerMenu","_skn_switchMainMenu","_skn_dbClickMainMenu","_skn_spawnMenu","_skn_spawnSpawnMenu","_skn_removespawnMenu","_skn_fillSpawnMenu","_skn_hackerLog","_skn_switchTable","_skn_customBanreason","_skn_flipVehicle","_skn_freeCam","_skn_delete","_skn_deleteMenu","_skn_deleteNow","_skn_doBan","_skn_mapTeleport","_skn_old_esp","_skn_hideAdmin","_skn_old_espMap","_skn_infrontTP","_skn_esp","_skn_godMode","_skn_repairVehicle","_skn_spawnLoot","_skn_mapLootArray","_skn_tg_Spec","_skn_tg_sortOrder","_skn_tg_toggle","_skn_tg_BanPlayer","_skn_tg_delete","_skn_tg_mapTeleport","_skn_tg_spawnTyp","_skn_tg_limitSpawn","_skn_tg_old_espMap","_skn_tg_old_esp","_skn_tg_hideAdmin","_skn_tg_infrontTP","_skn_tg_godMode","_skn_tg_map_player","_skn_tg_map_corpse","_skn_tg_map_loot","_skn_tg_map_vehicle","_skn_tg_map_ai","_skn_tg_map_basebuilding","_skn_t1","_skn_t2","_skn_t3","_skn_t4","_skn_t5","_skn_AH_rndVarAHInitCheckToken","_stringInArray","_displaysArray","_displays","_escapeQuotes","_cfg_displayArray","_skn_adminUIDArray","_skn_adminNAMEArray","_skn_tempuid","_skn_spawnPointCenter","_centerDistance","_sknBanANDSleep","_sknBanANDSleepQuick","_sknPatches","_skn_addonCheckCode","_skn_fileCheckCode","_sknAddActionCheck","_skn_code_ban","_skn_code_init","_skn_code_antihack","_skn_admincode","_skn_admininit"];
+
_config = (configFile >> "CfgSecConf");
if (isClass _config) then {diag_log "Loading config..."};
@@ -75,7 +77,17 @@ _skn_whitelist_cfgPatches = [_serverSettingsConfig, "antihack_whitelistedCfgPatc
_skn_adminsOwner = [_serverSettingsConfig, "adminMenu_Owner", []] call EPOCH_fnc_returnConfigEntry;
_skn_adminsHigh = [_serverSettingsConfig, "adminMenu_High", []] call EPOCH_fnc_returnConfigEntry;
_skn_adminsLow = [_serverSettingsConfig, "adminMenu_Low", []] call EPOCH_fnc_returnConfigEntry;
+_banReasons = [
+ "Mod mismatch, check that the mods you have enabled match server."
+];
_skn_banReason = [_serverSettingsConfig, "antihack_banReason", "EpochMod.com Autoban"] call EPOCH_fnc_returnConfigEntry;
+_antihack_banDuration = [_serverSettingsConfig, "antihack_banDuration", 5] call EPOCH_fnc_returnConfigEntry;
+_epoch_banReasons = [_serverSettingsConfig, "antihack_banReasons", _banReasons] call EPOCH_fnc_returnConfigEntry;
+_kickReasons = [
+ "Mod mismatch, check that mods enabled match server."
+];
+_epoch_kickReason = [_serverSettingsConfig, "antihack_kickReason", "EpochMod.com Autokick"] call EPOCH_fnc_returnConfigEntry;
+_epoch_kickReasons = [_serverSettingsConfig, "antihack_kickReasons", _kickReasons] call EPOCH_fnc_returnConfigEntry;
_ownerSettings = ["ESP-PLAYER","ESP-VEHICLE","ESP-LOOT","OLD-ESP","OLD-MAP","PLAYER-TELEPORT","MAP-TELEPORT","INFRONT-TELEPORT","MAP-PLAYER","MAP-CORPSE","MAP-LOOT","MAP-VEHICLE","MAP-AI","MAP-BASEBUILDING","TARGET-HEAL","TARGET-AMMO","TARGET-KILL","TARGET-CRYPTO","TARGET-VEHICLEREPAIR","VEHICLEFLIP","BANPANNEL","SPAWN-MENU","FREE-CAM","INVISIBLE","SPAWNLOOT","GODMODE","HEAL","VEHICLEREPAIR"];
_skn_adminMenuOwnerSetting = [_serverSettingsConfig, "adminMenu_OwnerSetting", _ownerSettings] call EPOCH_fnc_returnConfigEntry;
_adminSettings = ["PLAYER-TELEPORT","MAP-TELEPORT","TARGET-HEAL","TARGET-AMMO","TARGET-KILL","VEHICLEFLIP","BANPANNEL"];
@@ -86,30 +98,14 @@ _skn_adminMenuMenuKey = [_serverSettingsConfig, "adminMenu_menuKey", 0x3B] call
_skn_adminMenuInfrontTeleport = [_serverSettingsConfig, "adminMenu_infrontTeleport", 0x06] call EPOCH_fnc_returnConfigEntry;
_skn_adminMenuBanReasons = [_serverSettingsConfig, "adminMenu_BanReasons", ["Traderzone","Hacking","Glitch","Combat Log"]] call EPOCH_fnc_returnConfigEntry;
_skn_adminMenuCryproCfg = [_serverSettingsConfig, "adminMenu_cryptoCfg", [2500,1000,500,100,50,-1000]] call EPOCH_fnc_returnConfigEntry;
-_skn_cfgPatchesCfg = [_serverSettingsConfig, "antihack_cfgPatchesCfg", [0]] call EPOCH_fnc_returnConfigEntry;
+_skn_cfgPatchesCfg = [_serverSettingsConfig, "antihack_cfgPatchesMode", [2]] call EPOCH_fnc_returnConfigEntry;
_skn_PVSPrefix = [_serverSettingsConfig, "antihack_PVSPrefix", "EPAH_"] call EPOCH_fnc_returnConfigEntry;
-_skn_customVariablesCheck = [_serverSettingsConfig, "antihack_customVariablesCheck", true] call EPOCH_fnc_returnConfigEntry;
-_skn_customVariables = [_serverSettingsConfig, "antihack_customVariables", []] call EPOCH_fnc_returnConfigEntry;
// build array with X number of random strings
_rndVAR_Count = 84; // 85 = number of (_skn_rndVA deleteAt 0)
_skn_rndVA = call compile('epochserver' callExtension format['810|%1', _rndVAR_Count]);
EPOCH_hiveWhitelistVarsArray = [];
-if (_skn_customVariablesCheck) then{
- _whitelistConfig = _cfg_variablesConfig >> "whitelist";
- _skn_customVariables append(getArray(_whitelistConfig >> "bis")); //BIS Variables
- _skn_customVariables append(getArray(_whitelistConfig >> "epoch")); //Epoch Variables
- _skn_customVariables append(getArray(_whitelistConfig >> "custom")); //Custom Variables
- // Get any automatically added whitelist vars from Learning feature.
- _response = ["AH-WhitelistVars", (call EPOCH_fn_InstanceID)] call EPOCH_fnc_server_hiveGETRANGE;
- if ((_response select 0) == 1 && (_response select 1) isEqualType []) then{
- if !((_response select 1) isEqualTo[]) then{
- EPOCH_hiveWhitelistVarsArray = _response select 1;
- _skn_customVariables append EPOCH_hiveWhitelistVarsArray;
- };
- };
-};
// For client PVC
_skn_PVC_INDEX = _skn_rndVA deleteAt 0;
@@ -150,7 +146,6 @@ if (!_skn_enableAntihack) exitWith {
EPOCH_server_isPAdmin = compileFinal ("false");
EPOCH_server_Authed = compileFinal ("true");
EPOCH_server_disconnect = compileFinal("true");
- EPOCH_server_kickToLobby = compileFinal("true");
};
// Check AH init code
@@ -250,21 +245,6 @@ _skn_t3 = _skn_rndVA deleteAt 0;
_skn_t4 = _skn_rndVA deleteAt 0;
_skn_t5 = _skn_rndVA deleteAt 0;
-_skn_kickToLobby = _skn_rndVA deleteAt 0;
-_skn_whitelistVars = _skn_rndVA deleteAt 0;
-
-if (_skn_customVariablesCheck) then{
- // Gather all random global vars from AH for whitelist var checks
- _skn_customVariables append [_skn_PVC_INDEX,_skn_whitelistVars,_skn_kickToLobby,toLower(_skn_doKickBan),toLower(_skn_doTokenAuth)];
- _skn_customVariables append [_skn_AH_Init,_skn_AH_Code,_skn_AH_Code_CA,_skn_AH_Code_CB,_skn_AH_Ban,_skn_antiTeleportPVC,_skn_Admin_Init];
- _skn_customVariables append [toLower("FW"+_skn_AH_rndVar),toLower("FA"+_skn_AH_rndVar),toLower("FWC"+_skn_AH_rndVar)];
-
- // Globally brodcast whitelist vars array
- missionNamespace setVariable [_skn_whitelistVars,_skn_customVariables,true];
-};
-
-EPOCH_server_kickToLobby = compileFinal ("if !(isNull _this) then {"+_skn_kickToLobby+" = true;(owner _this) publicVariableClient '"+_skn_kickToLobby+"';};");
-
_skn_AH_rndVarAHInitCheckToken = _skn_t1+_skn_t2+_skn_t3+_skn_t4+_skn_t5;
EPOCH_server_Authed = compileFinal("_this in "+_skn_AH_rndVarAHInitCheck);
EPOCH_server_disconnect = compileFinal("
@@ -547,19 +527,9 @@ _sknBanANDSleepQuick = _skn_AH_Ban+"; uiSleep 1";
_sknPatches = [];
"_sknPatches pushBack (configName _x)" configClasses (configFile >> "CfgPatches");
{_sknPatches pushBackUnique _x}forEach _skn_whitelist_cfgPatches;
-_skn_addonCheckCode = if (_skn_check_addons) then {"[] spawn{_config = '!(configName _x in "+str _sknPatches+")' configClasses (configFile >> 'CfgPatches');if !(_config isEqualTo []) then {[format['Disallowed Addon %1',_config],"+str (_skn_cfgPatchesCfg select 0)+"] call "+_skn_AH_Ban+"}};"} else {""};
+_skn_addonCheckCode = if (_skn_check_addons) then {"[] spawn{_config = '!(configName _x in "+str _sknPatches+")' configClasses (configFile >> 'CfgPatches');if !(_config isEqualTo []) then {[format['Disallowed Addon %1',_config],["+str (_skn_cfgPatchesCfg select 0)+",0]] call "+_skn_AH_Ban+"}};"} else {""};
_skn_fileCheckCode = if (_skn_check_files isEqualTo []) then {""} else {"{if (str(compile preprocessFileLineNumbers (_x select 0)) != str(missionNamespace getVariable [_x select 1,'']))exitWith{[format['Modified File %1 (%2/%3)',_x select 1,count toArray str (compile preprocessFileLineNumbers (_x select 0)),count toArray str(missionNamespace getVariable [_x select 1,''])],0] call "+_skn_AH_Ban+"}} forEach "+str _skn_check_files+";"};
-_sknCustomVarCheckModeCode = [_serverSettingsConfig, "antihack_customVariablesCheckMode", 0] call EPOCH_fnc_returnConfigEntry;
-_sknCustomVarCheckCode = if (_skn_customVariablesCheck) then {"
-{
- if !(_x in (missionNamespace getVariable ["+str _skn_whitelistVars+",[]])) then{
- [format['(WIP) Unknown Variable (missionNamespace): %1', _x], ["+str _sknCustomVarCheckModeCode+",[toArray(_x)]]] call "+_sknBanANDSleepQuick+";
- }
-}forEach(allVariables missionNamespace);
-"} else {""};
-
-
_sknAddActionCheck = if ([_serverSettingsConfig, "antihack_addActionCheck", true] call EPOCH_fnc_returnConfigEntry) then{ "
if (player == _ActionVehicle) then[{_ActionCount = _ActionCount + 1}, { _ActionVehicle = player; _ActionCount = 0 }];
_addCase = player addAction['', '', [], -5, false, true, '', 'false'];
@@ -604,66 +574,52 @@ call compile("'"+_skn_doTokenAuth+"' addPublicVariableEventHandler {
};
};");
-
-//[[_case,_time,_name,_uid,_save],[1, 0, 0, 1]]
call compile ("'"+_skn_doKickBan+"' addPublicVariableEventHandler {
_array = _this select 1;
- _player =_array select 2;
- if !([_player,_array select 3] call EPOCH_server_getPToken) exitWith {
+ _array params ['_text','_mode','_player','_token'];
+ if !([_player,_token] call EPOCH_server_getPToken) exitWith {
['ahe', format['Token is different [%1,%2] %3',if (!isNull _player) then { _player getVariable ['"+_skn_AH_rndVarPlayer+"','']}else{'PlayerObj NULL'}, _array select 3, _array]] call EPOCH_fnc_server_hiveLog;
};
- _text = toString(_array select 0);
-
- _mode = _array select 1;
- _data = [];
+ _text = toString(_text);
+ _reasonIndex = -1;
if (_mode isEqualType []) then{
- _mode = (_array select 1) select 0;
- _data = (_array select 1) select 1;
+ _mode = _mode select 0;
+ _reasonIndex = _mode select 1;
};
-
- if (_mode == 0) then{
- ['ahb', format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
- "+_skn_pv_hackerLog+" pushBack [[0,call "+_skn_server_getRealTime+",name _player,getPlayerUID _player,_text],[1, 0, 0, 1]];
- 'epochserver' callExtension format['820|%1|"+_skn_banReason+"',getPlayerUID _player];
- } else {
- if (_mode == 2) then{
- _unknownVar = toString(_data select 0);
- _safeVars = missionNamespace getVariable ["+str _skn_whitelistVars+",[]];
- _trusted = "+_str_learningModeCheck+";
- if !(_unknownVar in _safeVars) then{
- if (_trusted) then {
-
- _safeVars pushBack _unknownVar;
- missionNamespace setVariable ["+str _skn_whitelistVars+",_safeVars,true];
-
- if !(_unknownVar in EPOCH_hiveWhitelistVarsArray) then{
- EPOCH_hiveWhitelistVarsArray pushBack _unknownVar;
- ['AH-WhitelistVars', (call EPOCH_fn_InstanceID), EPOCH_hiveWhitelistVarsArray] call EPOCH_fnc_server_hiveSET;
- };
-
- ['ahl', format['LEARNING: %1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
- "+_skn_pv_hackerLog+" pushBack[[1, call "+_skn_server_getRealTime+", name _player, getPlayerUID _player, format['LEARNING: %1',_text]], []];
- } else {
- ['ahb', format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
- "+_skn_pv_hackerLog+" pushBack [[0,call "+_skn_server_getRealTime+",name _player,getPlayerUID _player,_text],[1, 0, 0, 1]];
- _banID = 1;
- 'epochserver' callExtension format['820|%1|"+_skn_banReason+" #V%2',getPlayerUID _player,_banID];
- };
+ _reason = '';
+ _logName = 'ahl';
+ _logMode = 1;
+ _logColor = [1,1,1,1];
+ switch _mode do {
+ case 0: {
+ _logName = 'ahb';
+ _logColor = [1,0,0,1];
+ _logMode = 0;
+ if (_reasonIndex != -1) then {
+ _reason = "+str(_epoch_banReasons)+" select _reasonIndex;
};
- }else {
- ['ahl', format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
- "+_skn_pv_hackerLog+" pushBack[[1, call "+_skn_server_getRealTime+", name _player, getPlayerUID _player, _text], []];
+ ['ban', _player , format['"+_skn_banReason+" %1',_reason], "+str(_antihack_banDuration)+"] call EPOCH_serverCommand;
+ };
+ case 2: {
+ _logName = 'ahk';
+ _logColor = [0,0,1,1];
+ if (_reasonIndex != -1) then {
+ _reason = "+str(_epoch_kickReasons)+" select _reasonIndex;
+ };
+ ['kick', _player , format['"+_epoch_kickReason+" %1',_reason]] call EPOCH_serverCommand;
};
};
+ "+_skn_pv_hackerLog+" pushBack[[_logMode, call "+_skn_server_getRealTime+", name _player, getPlayerUID _player, _text], _logColor];
+ [_logName, format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
{
if (_x call EPOCH_server_isPAdmin) then {
(owner _x) publicVariableClient '"+_skn_pv_hackerLog+"';
};
- }forEach playableUnits;
+ }forEach allPlayers;
};");
//0 = BAN
//1 = LOG
-//[2,varname] = Self-learning vars from trusted users.
+//2 = KICK
_skn_code_ban = compileFinal ("
_this set [0,toArray (_this select 0)];
@@ -679,7 +635,7 @@ _skn_code_init = compileFinal ("
_start = diag_tickTime;
waitUntil {!isNil '"+_skn_AH_Code+"' || (diag_tickTime-_start > 20)};
if (isNil '"+_skn_AH_Code+"') exitWith {
- "+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],1,player,Epoch_personalToken];
+ "+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],2,player,Epoch_personalToken];
publicVariableServer '"+_skn_doKickBan+"';
(findDisplay 46) closeDisplay 0
};
@@ -694,7 +650,7 @@ _skn_code_init = compileFinal ("
};
uiSleep 5;
if ((isNil '"+_skn_AH_Code_CA+"') || (isNil '"+_skn_AH_Code_CB+"')) then {
- "+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],1,player,Epoch_personalToken];
+ "+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],2,player,Epoch_personalToken];
publicVariableServer '"+_skn_doKickBan+"';
(findDisplay 46) closeDisplay 0
};
@@ -964,7 +920,6 @@ _skn_code_antihack = compileFinal ("
[format['Changed %1 >> onUnload >> %2', _display, getText(configFile>>_display>>'onUnload')],0] call "+_sknBanANDSleep+";
}
}forEach "+str _cfg_displayArray+";
- "+_sknCustomVarCheckCode+"
uiSleep ((random 10)+10);
};
};
@@ -972,9 +927,6 @@ _skn_code_antihack = compileFinal ("
"+_skn_doTokenAuth+" = [_t,player,Epoch_personalToken];
publicVariableServer '"+_skn_doTokenAuth+"';
"+_skn_doTokenAuth+" = nil;
- '"+_skn_kickToLobby+"' addPublicVariableEventHandler {
- [] spawn {waitUntil {(findDisplay 46) closeDisplay 0; false}}
- };
"+_skn_AH_Code_CB+" = true;
true
");
@@ -1006,7 +958,7 @@ call compile ("
if (_x call EPOCH_server_isPAdmin) then {
(owner _x) publicVariableClient '"+_skn_pv_adminLog+"';
};
- }forEach playableUnits;
+ }forEach allPlayers;
true
};
");
diff --git a/Sources/epoch_server_core/build.hpp b/Sources/epoch_server_core/build.hpp
index d19191ba..45b88f7d 100644
--- a/Sources/epoch_server_core/build.hpp
+++ b/Sources/epoch_server_core/build.hpp
@@ -1 +1 @@
-build=439;
+build=443;
diff --git a/Sources/epoch_server_settings/EpochEvents/FastNights.sqf b/Sources/epoch_server_settings/EpochEvents/FastNights.sqf
index c84a40d1..1c0ba512 100644
--- a/Sources/epoch_server_settings/EpochEvents/FastNights.sqf
+++ b/Sources/epoch_server_settings/EpochEvents/FastNights.sqf
@@ -1,4 +1,4 @@
-if (sunOrMoon >= 0.99) then { // adjust this lower to change sooner. Note: "0.99 value, the twilight is still quite dark" https://community.bistudio.com/wiki/sunOrMoon
+if (sunOrMoon < 0.99) then { // adjust this lower to change sooner. Note: "0.99 value, the twilight is still quite dark" https://community.bistudio.com/wiki/sunOrMoon
setTimeMultiplier 13 // adjust this value for slower or faster night cycle ( 24 hours will take 1 hour )
} else {
setTimeMultiplier 5 // adjust this value for slower or faster day cycle ( 12 hours will take 1 hour )
diff --git a/Sources/epoch_server_settings/build.hpp b/Sources/epoch_server_settings/build.hpp
index d19191ba..45b88f7d 100644
--- a/Sources/epoch_server_settings/build.hpp
+++ b/Sources/epoch_server_settings/build.hpp
@@ -1 +1 @@
-build=439;
+build=443;
diff --git a/Sources/epoch_server_settings/config.cpp b/Sources/epoch_server_settings/config.cpp
index d2e5559b..18bd1168 100644
--- a/Sources/epoch_server_settings/config.cpp
+++ b/Sources/epoch_server_settings/config.cpp
@@ -20,7 +20,7 @@ class CfgPatches {
units[] = {};
weapons[] = {};
requiredVersion = 0.1;
- epochVersion = "0.3.8.0";
+ epochVersion = "0.3.9.0";
requiredAddons[] = {};
#include "build.hpp"
};
diff --git a/Tools/Build/build_epoch.bat b/Tools/Build/build_epoch.bat
index 743b4dde..30c6a925 100644
--- a/Tools/Build/build_epoch.bat
+++ b/Tools/Build/build_epoch.bat
@@ -81,8 +81,8 @@ echo build=%BUILDNUMBER%; > !serverBuildInc!
SET SOURCE_PATH=%MAIN_PATH%\Sources\epoch_server
SET OUTPUT_PATH=%MAIN_PATH%\Server_Install_Pack\@EpochHive\addons
SET TEMP_PATH=x\addons\a3_epoch_server
-rd /s/q p:\!TEMP_PATH!
-xcopy /s/e/y/q/i "!SOURCE_PATH!" p:\!TEMP_PATH!
+rd /s/q P:\!TEMP_PATH!
+xcopy /s/e/y/q/i "!SOURCE_PATH!" P:\!TEMP_PATH!
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!TEMP_PATH!" "!OUTPUT_PATH!" -clear -prefix="!TEMP_PATH!" -project="P:\!TEMP_PATH!" -include=!AB_includes_path!
if '%choice%'=='5' (
call :settings
@@ -95,8 +95,8 @@ echo build=%BUILDNUMBER%; > !settingsBuildInc!
SET SOURCE_PATH=%MAIN_PATH%\Sources\epoch_server_settings
SET OUTPUT_PATH=%MAIN_PATH%\Server_Install_Pack\@EpochHive\addons
SET TEMP_PATH=a3_epoch_server_settings
-rd /s/q p:\!TEMP_PATH!
-xcopy /s/e/y/q/i "!SOURCE_PATH!" p:\!TEMP_PATH!
+rd /s/q P:\!TEMP_PATH!
+xcopy /s/e/y/q/i "!SOURCE_PATH!" P:\!TEMP_PATH!
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!TEMP_PATH!" "!OUTPUT_PATH!" -packonly -clear -prefix="!TEMP_PATH!" -project="P:\!TEMP_PATH!" -include=!AB_includes_path!
if '%choice%'=='5' (
call :core
@@ -109,8 +109,8 @@ echo build=%BUILDNUMBER%; > !coreBuildInc!
SET SOURCE_PATH=%MAIN_PATH%\Sources\epoch_server_core
SET OUTPUT_PATH=%MAIN_PATH%\Server_Install_Pack\@EpochHive\addons
SET TEMP_PATH=epoch_server_core
-rd /s/q p:\!TEMP_PATH!
-xcopy /s/e/y/q/i "!SOURCE_PATH!" p:\!TEMP_PATH!
+rd /s/q P:\!TEMP_PATH!
+xcopy /s/e/y/q/i "!SOURCE_PATH!" P:\!TEMP_PATH!
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!TEMP_PATH!" "!OUTPUT_PATH!" -clear -prefix="!TEMP_PATH!" -project="P:\!TEMP_PATH!" -include=!AB_includes_path!
if '%choice%'=='5' (
call :allmaps
@@ -127,10 +127,10 @@ for /f "tokens=*" %%G in ('dir /b /s /a:d "!SOURCE_PATH!\mpmissions\epoch.*"') d
echo building !MISSION! pbo
rd /s/q p:\!MISSION!
rem Moving files into temp folder
- xcopy /s/e/y/q/i/d "!SOURCE_PATH!\mpmissions\!MISSION!" p:\!MISSION!
- xcopy /s/y/q/i/f "!SOURCE_PATH!\description.ext" p:\!MISSION!
- xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_code" p:\!MISSION!\epoch_code
- xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_config" p:\!MISSION!\epoch_config
+ xcopy /s/e/y/q/i/d "!SOURCE_PATH!\mpmissions\!MISSION!" P:\!MISSION!
+ xcopy /s/y/q/i/f "!SOURCE_PATH!\description.ext" P:\!MISSION!
+ xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_code" P:\!MISSION!\epoch_code
+ xcopy /s/e/y/q/i/d "!SOURCE_PATH!\epoch_config" P:\!MISSION!\epoch_config
START "" /min /WAIT "!TOOLS_PATH!\AddonBuilder.exe" "P:\!MISSION!" "!OUTPUT_PATH!" -clear -prefix=\ -project=P:\ -include=!AB_includes_path!
)
goto end
diff --git a/build.txt b/build.txt
index b9310c76..3b4f67fd 100644
--- a/build.txt
+++ b/build.txt
@@ -1 +1 @@
-439
+443