bibi8667

Untitled

Feb 24th, 2019
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 96.95 KB | None | 0 0
  1. /*
  2. Authors: Aaron Clark - EpochMod.com
  3. Niklas Wagner - skaronator.com
  4. Contributors:
  5.  
  6. Description:
  7. Arma 3 Epoch ANTIHACK/ADMINTOOL
  8.  
  9. Licence:
  10. Arma Public License Share Alike (APL-SA) - https://www.bistudio.com/community/licenses/arma-public-license-share-alike
  11.  
  12. Github:
  13. https://github.com/EpochModTeam/Epoch/tree/release/Sources/epoch_server/init/server_securityfunctions.sqf
  14. */
  15. private ["_skn_unlock","_skn_adminMenuUnlock","_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","_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_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_daynight","_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_mapAnimalArray","_skn_mapAIArray","_skn_mapBasesArray","_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_animals","_skn_tg_map_vehicle","_skn_tg_map_ai","_skn_tg_map_trader","_skn_tg_map_basebuilding","_skn_t1","_skn_t2","_skn_t3","_skn_t4","_skn_t5","_skn_AH_rndVarAHInitCheckToken","_stringInArray","_displaysArray","_displays","_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","_configs"];
  16.  
  17. _config = (configFile >> "CfgSecConf");
  18. if (isClass _config) then {diag_log "Loading config..."};
  19.  
  20. _debugClass = if ([_config,"debug",false] call EPOCH_fnc_returnConfigEntry) then { "DebugActive" } else { "DebugDisabled" };
  21.  
  22. _cfg_systemDebug = (_config >> _debugClass);
  23. _skn_systemDebug1 = getText(_cfg_systemDebug >> "systemChat1");
  24. _skn_systemDebug2 = getText(_cfg_systemDebug >> "systemChat2");
  25. _skn_systemDebug3 = getText(_cfg_systemDebug >> "systemChat3");
  26. _skn_systemDebug4 = getText(_cfg_systemDebug >> "systemChat4");
  27. _skn_systemDebug5 = getText(_cfg_systemDebug >> "systemChat5");
  28.  
  29. _cfg_remoteExecClient = (_config >> "remoteExecClient");
  30. _remoteExecClient_NAMES = [_cfg_remoteExecClient, "functions", []] call EPOCH_fnc_returnConfigEntry;
  31.  
  32. _cfg_limits = (_config >> "limits");
  33. _skn_playerCryptoLimit = [_cfg_limits, "playerCrypto", 900000] call EPOCH_fnc_returnConfigEntry;
  34.  
  35. _cfg_learning = (_config >> "learning");
  36. _skn_trustedUsers = [_cfg_learning,"trustedUsers",[]] call EPOCH_fnc_returnConfigEntry;
  37. _str_learningModeCheck = if ([_cfg_learning,"mode",true] call EPOCH_fnc_returnConfigEntry) then{"((getPlayerUID _player) in "+str _skn_trustedUsers+")"} else {"true"};
  38.  
  39. _cfg_quality = (_config >> "forcedQuality");
  40. _skn_perfMode = getText(_cfg_quality >> "mode");
  41. _skn_viewDistance = [_cfg_quality >> _skn_perfMode, "viewDistance", 2500] call EPOCH_fnc_returnConfigEntry;
  42. _skn_viewDistanceObects = [_cfg_quality >> _skn_perfMode, "viewDistanceObects", 2000] call EPOCH_fnc_returnConfigEntry;
  43. _skn_terrainGrid = [_cfg_quality >> _skn_perfMode, "terrainGrid", 10] call EPOCH_fnc_returnConfigEntry;
  44.  
  45. _cfg_blacklistConfig = (_config >> "blacklist");
  46. _skn_badDisplaysArray = [_cfg_blacklistConfig, "badDisplays", [-1337,17,19,30,32,45,59,69,71,125,132,155,156,157,162,165,166,167,312,1320,1321,2727,2928,2929,316000]] call EPOCH_fnc_returnConfigEntry;
  47. _skn_badAnimations = [_cfg_blacklistConfig, "animations", ['AmovPercMstpSnonWnonDnon_exerciseKata','AmovPercMstpSnonWnonDnon_exercisePushup','GestureSpasm1','GestureSpasm4','GestureNod']] call EPOCH_fnc_returnConfigEntry;
  48.  
  49. _cfg_variablesConfig = (_config >> "variables");
  50. _skn_badVarCheckArray = [_cfg_variablesConfig, "badVars", ['EPOCH_GMODE','ESP_map','ESP_mainMap','ESP_adminMap','AntiAntiAntiAntiHax','fnc_usec_damageHandler','fnc_usec_unconscious','VAGINA_secret','yolo','VERSION','life_fnc_handleDamage','EPOCH_spawnVehicle_PVS','CLASS911_Menu','nuke_vars','JJMMEE_INIT_MENU','PLAYERON','PLAYERNEXT2','ALTISLIFEON','LY_Menu','PLAY','LY_SwaggerLikeUs','BIS_fnc_dbg_reminder_value','BIS_fnc_dbg_reminder']] call EPOCH_fnc_returnConfigEntry;
  51. _skn_nilVarCheckArray = [_cfg_variablesConfig, "nilVars", ['EPOCH_antiWallCount','EPOCH_playerEnergy','EPOCH_playerHunger','EPOCH_playerStamina','EPOCH_playerCrypto','EPOCH_target','EPOCH_ESP_TARGETS','EPOCH_ESPMAP_TARGETS','EPOCH_taxRate','EPOCH_ESP_VEHICLEPLAYER','EPOCH_ESP_PLAYER','EPOCH_ESP_VEHICLES']] call EPOCH_fnc_returnConfigEntry;
  52. _skn_commandMenuArray = [(_config >> "commandMenu"), "menus",['','RscSelectTeam','RscTeam','RscMenuTeam','RscMoveHigh','#GETIN','#RscStatus','#WATCH0','RscCombatMode','RscMenuReply','RscCallSupport','#CUSTOM_RADIO','#User:BIS_fnc_addCommMenuItem_menu','RscRadio','RscReply','#ACTION','RscMenuFormations','#WATCH','RscGroupRootMenu','RscMainMenu','RscMenuMove','RscWatchDir','RscWatchMoveDir','#User:BIS_Menu_GroupCommunication','RscMenuStatus','RscFormations']] call EPOCH_fnc_returnConfigEntry;
  53.  
  54. _skn_addEHConfig = (_config >> "addEventHandler");
  55. _skn_displayAddEHChecks = [_skn_addEHConfig, "checks",[]] call EPOCH_fnc_returnConfigEntry;
  56.  
  57. _skn_addEHArray = [];
  58. {
  59. _code = ["CfgEpochClient", _x, ""] call EPOCH_fnc_returnConfigEntryV2;
  60. _skn_addEHArray pushBack [_x,_code,(_code != "")];
  61. } forEach _skn_displayAddEHChecks;
  62.  
  63. _serverSettingsConfig = configFile >> "CfgEpochServer";
  64. _skn_enableAntihack = [_serverSettingsConfig, "antihack_Enabled", true] call EPOCH_fnc_returnConfigEntry;
  65. _skn_check_addons = [_serverSettingsConfig, "antihack_cfgPatchesCheck", true] call EPOCH_fnc_returnConfigEntry;
  66. _checkFiles = [
  67. ["epoch_code\compile\setup\EPOCH_clientInit.sqf", "EPOCH_clientInit"],
  68. ["epoch_code\compile\EPOCH_onEachFrame.sqf", "EPOCH_onEachFrame"],
  69. ["epoch_code\compile\setup\EPOCH_client_rejectPlayer.sqf", "EPOCH_client_rejectPlayer"],
  70. ["epoch_code\compile\setup\EPOCH_clientRespawn.sqf", "EPOCH_clientRespawn"]
  71. ];
  72. _skn_check_files = [_serverSettingsConfig, "antihack_checkFilesNew", _checkFiles] call EPOCH_fnc_returnConfigEntry;
  73.  
  74. _skn_whitelist_cfgPatches = [_serverSettingsConfig, "antihack_whitelistedCfgPatches", []] call EPOCH_fnc_returnConfigEntry;
  75. _skn_adminsOwner = [_serverSettingsConfig, "adminMenu_Owner", []] call EPOCH_fnc_returnConfigEntry;
  76. _skn_adminsHigh = [_serverSettingsConfig, "adminMenu_High", []] call EPOCH_fnc_returnConfigEntry;
  77. _skn_adminsLow = [_serverSettingsConfig, "adminMenu_Low", []] call EPOCH_fnc_returnConfigEntry;
  78. _banReasons = [
  79. "Mod mismatch, check that the mods you have enabled match server."
  80. ];
  81. _skn_banReason = [_serverSettingsConfig, "antihack_banReason", "EpochMod.com Autoban"] call EPOCH_fnc_returnConfigEntry;
  82. _antihack_banDuration = [_serverSettingsConfig, "antihack_banDuration", 5] call EPOCH_fnc_returnConfigEntry;
  83. _epoch_banReasons = [_serverSettingsConfig, "antihack_banReasons", _banReasons] call EPOCH_fnc_returnConfigEntry;
  84. _kickReasons = [
  85. "Mod mismatch, check that mods enabled match server."
  86. ];
  87. _epoch_kickReason = [_serverSettingsConfig, "antihack_kickReason", "EpochMod.com Autokick"] call EPOCH_fnc_returnConfigEntry;
  88. _epoch_kickReasons = [_serverSettingsConfig, "antihack_kickReasons", _kickReasons] call EPOCH_fnc_returnConfigEntry;
  89. _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"];
  90. _skn_adminMenuOwnerSetting = [_serverSettingsConfig, "adminMenu_OwnerSetting", _ownerSettings] call EPOCH_fnc_returnConfigEntry;
  91. _adminSettings = ["PLAYER-TELEPORT","MAP-TELEPORT","TARGET-HEAL","TARGET-AMMO","TARGET-KILL","VEHICLEFLIP","BANPANNEL"];
  92. _skn_adminMenuHighSetting = [_serverSettingsConfig, "adminMenu_HighSetting", _adminSettings] call EPOCH_fnc_returnConfigEntry;
  93. _lowSettings = ["PLAYER-TELEPORT","MAP-TELEPORT","TARGET-HEAL"];
  94. _skn_adminMenuLowSetting = [_serverSettingsConfig, "adminMenu_LowSetting", _lowSettings] call EPOCH_fnc_returnConfigEntry;
  95. _skn_adminMenuMenuKey = [_serverSettingsConfig, "adminMenu_menuKey", 0x3B] call EPOCH_fnc_returnConfigEntry;
  96. _skn_adminMenuInfrontTeleport = [_serverSettingsConfig, "adminMenu_infrontTeleport", 0x06] call EPOCH_fnc_returnConfigEntry;
  97. _skn_adminMenuUnlock = [_serverSettingsConfig, "adminMenu_unlock", 0x08] call EPOCH_fnc_returnConfigEntry;
  98. _skn_adminMenuBanReasons = [_serverSettingsConfig, "adminMenu_BanReasons", ["Traderzone","Hacking","Glitch","Combat Log"]] call EPOCH_fnc_returnConfigEntry;
  99. _skn_adminMenuCryproCfg = [_serverSettingsConfig, "adminMenu_cryptoCfg", [25000,10000,5000,1000,500,-1000,-10000]] call EPOCH_fnc_returnConfigEntry;
  100. _skn_cfgPatchesCfg = [_serverSettingsConfig, "antihack_cfgPatchesMode", [2]] call EPOCH_fnc_returnConfigEntry;
  101. _skn_PVSPrefix = [_serverSettingsConfig, "antihack_PVSPrefix", "EPAH_"] call EPOCH_fnc_returnConfigEntry;
  102.  
  103. // build array with X number of random strings
  104. _rndVAR_Count = 99; // 86 = number of (_skn_rndVA deleteAt 0)
  105. _skn_rndVA = parseSimpleArray ('epochserver' callExtension format['810|%1', _rndVAR_Count]);
  106.  
  107. EPOCH_hiveWhitelistVarsArray = [];
  108.  
  109. // For client PVC
  110. _skn_PVC_INDEX = _skn_rndVA deleteAt 0;
  111. // [["function", _transferBankBalance],_transferTarget]
  112. EPOCH_sendRemoteExecClient = compileFinal ("
  113. params ['_first','_target'];
  114. _first params ['_functionName','_data'];
  115. [_functionName, _data] remoteExec ['EPOCH_"+_skn_PVC_INDEX+"',_target];
  116. ");
  117.  
  118. // build dynamic RE-C functions
  119. _remoteExecClientStr = "params [""_function"",""_data""];switch (_function) do {";
  120. {
  121. _functionName = format ["EPOCH_dyn_%1",_x];
  122. missionNamespace setVariable [_functionName, compileFinal ([_cfg_remoteExecClient, _x, ""] call EPOCH_fnc_returnConfigEntry), true];
  123. _remoteExecClientStr = _remoteExecClientStr + format['case "%1": {_data call %2};',_x,_functionName];
  124. } forEach _remoteExecClient_NAMES;
  125. _remoteExecClientStr = _remoteExecClientStr + "};";
  126.  
  127. // broadcast main RE-C function
  128. missionNamespace setVariable [format["EPOCH_%1",_skn_PVC_INDEX], compileFinal _remoteExecClientStr, true];
  129.  
  130. // diag_log format["DEBUG: _remoteExecClientStr %1",_remoteExecClientStr];
  131.  
  132. _skn_AH_rndVarVehicle = _skn_rndVA deleteAt 0;
  133. _skn_AH_rndVarPlayer = _skn_rndVA deleteAt 0;
  134.  
  135. EPOCH_server_getVToken = compileFinal ("_this getVariable ['"+_skn_AH_rndVarVehicle+"',false]");
  136. EPOCH_server_setVToken = compileFinal ("_this setVariable ['"+_skn_AH_rndVarVehicle+"',true];true");
  137. EPOCH_server_getPToken = compileFinal ("private['_ret','_var'];_ret = false;if ((_this select 0) isEqualType objNull)then{if (!isNull(_this select 0))then{_var=(_this select 0) getVariable '"+_skn_AH_rndVarPlayer+"';if (!isNil '_var') then {_ret= _var==(_this select 1)}}};if(!_ret)then{['kick',(_this select 0),'Token Check Failed'] call EPOCH_serverCommand};_ret");
  138. EPOCH_server_setPToken = compileFinal ("private '_var';_var = 'epochserver' callExtension '810';_this setVariable ['"+_skn_AH_rndVarPlayer+"',_var];_var");
  139.  
  140. if (!_skn_enableAntihack) exitWith {
  141. EPOCH_server_pushPlayer = compileFinal ("
  142. params ['_playerNetID','_playerUID','_C_SET','_fsmHandle','_player'];
  143. _C_SET pushBack '';
  144. [_fsmHandle,['_C_SET', _C_SET]] remoteExecCall ['setFSMVariable', _player];
  145. ");
  146. EPOCH_server_isPAdmin = compileFinal ("false");
  147. EPOCH_server_Authed = compileFinal ("true");
  148. EPOCH_server_disconnect = compileFinal("true");
  149. };
  150.  
  151. // Check AH init code
  152. _skn_AH_rndVarAHInitCheck = _skn_rndVA deleteAt 0;
  153. // Init as array
  154. call compile(_skn_AH_rndVarAHInitCheck+"=[];");
  155.  
  156. _skn_AH_Init = _skn_rndVA deleteAt 0;
  157. _skn_AH_Code = _skn_rndVA deleteAt 0;
  158. _skn_AH_Code_CA = _skn_rndVA deleteAt 0;
  159. _skn_AH_Code_CB = _skn_rndVA deleteAt 0;
  160. _skn_AH_Ban = _skn_rndVA deleteAt 0;
  161. _skn_AH_rndVar = _skn_rndVA deleteAt 0;
  162. _skn_doKickBan = _skn_PVSPrefix + (_skn_rndVA deleteAt 0);
  163.  
  164. //ADMIN STUFF:
  165. //PVC from SERVER:
  166. _skn_pv_hackerLog = _skn_rndVA deleteAt 0;
  167. _skn_pv_adminLog = _skn_rndVA deleteAt 0;
  168. //Server Functions:
  169. _skn_server_adminLog = _skn_rndVA deleteAt 0;
  170.  
  171. //PVS from CLIENT:
  172. _skn_doAdminRequest = _skn_PVSPrefix + (_skn_rndVA deleteAt 0);
  173. _skn_doAdminLog = _skn_PVSPrefix + (_skn_rndVA deleteAt 0);
  174. _skn_doTokenAuth = _skn_PVSPrefix + (_skn_rndVA deleteAt 0);
  175. _skn_antiTeleportPVC = _skn_rndVA deleteAt 0;
  176.  
  177. //ADMIN MENU CODE & INIT
  178. _skn_Admin_Code = _skn_rndVA deleteAt 0;
  179. _skn_Admin_Init = _skn_rndVA deleteAt 0;
  180.  
  181. //ADMIN FUNCTIONS
  182. _skn_adminRequest_PVC = _skn_rndVA deleteAt 0;
  183. _skn_adminLog_PVC = _skn_rndVA deleteAt 0;
  184. _skn_adminLog = _skn_rndVA deleteAt 0;
  185. _skn_AdminKeyDown = _skn_rndVA deleteAt 0;
  186. _skn_AdminMenu_Init = _skn_rndVA deleteAt 0;
  187. _skn_getCtrl = _skn_rndVA deleteAt 0;
  188. _skn_fnc_Spec = _skn_rndVA deleteAt 0;
  189. _skn_Update_AdminButtons = _skn_rndVA deleteAt 0;
  190. _skn_mainMenuCfg = _skn_rndVA deleteAt 0;
  191. _skn_FillMainMenu = _skn_rndVA deleteAt 0;
  192. _skn_FillPlayerMenu = _skn_rndVA deleteAt 0;
  193. _skn_switchMainMenu = _skn_rndVA deleteAt 0;
  194. _skn_dbClickMainMenu = _skn_rndVA deleteAt 0;
  195. _skn_spawnMenu = _skn_rndVA deleteAt 0;
  196. _skn_spawnSpawnMenu = _skn_rndVA deleteAt 0;
  197. _skn_removespawnMenu = _skn_rndVA deleteAt 0;
  198. _skn_fillSpawnMenu = _skn_rndVA deleteAt 0;
  199. _skn_hackerLog = _skn_rndVA deleteAt 0;
  200. _skn_switchTable = _skn_rndVA deleteAt 0;
  201. _skn_daynight = _skn_rndVA deleteAt 0;
  202. _skn_customBanreason = _skn_rndVA deleteAt 0;
  203. _skn_flipVehicle = _skn_rndVA deleteAt 0;
  204. _skn_freeCam = _skn_rndVA deleteAt 0;
  205. _skn_delete = _skn_rndVA deleteAt 0;
  206. _skn_deleteMenu = _skn_rndVA deleteAt 0;
  207. _skn_deleteNow = _skn_rndVA deleteAt 0;
  208. _skn_doBan = _skn_rndVA deleteAt 0;
  209. _skn_mapTeleport = _skn_rndVA deleteAt 0;
  210. _skn_old_esp = _skn_rndVA deleteAt 0;
  211. _skn_hideAdmin = _skn_rndVA deleteAt 0;
  212. _skn_old_espMap = _skn_rndVA deleteAt 0;
  213. _skn_infrontTP = _skn_rndVA deleteAt 0;
  214. _skn_unlock = _skn_rndVA deleteAt 0;
  215. _skn_esp = _skn_rndVA deleteAt 0;
  216. _skn_godMode = _skn_rndVA deleteAt 0;
  217. _skn_repairVehicle = _skn_rndVA deleteAt 0;
  218. _skn_spawnLoot = _skn_rndVA deleteAt 0;
  219. _skn_mapLootArray = _skn_rndVA deleteAt 0;
  220. _skn_mapAnimalArray = _skn_rndVA deleteAt 0;
  221. _skn_mapAIArray = _skn_rndVA deleteAt 0;
  222. _skn_mapBasesArray = _skn_rndVA deleteAt 0;
  223.  
  224. //ADMIN TOGGLE VARIABLES
  225. _skn_tg_Spec = _skn_rndVA deleteAt 0;
  226. _skn_tg_sortOrder = _skn_rndVA deleteAt 0;
  227. _skn_tg_toggle = _skn_rndVA deleteAt 0;
  228. _skn_tg_BanPlayer = _skn_rndVA deleteAt 0;
  229. _skn_tg_delete = _skn_rndVA deleteAt 0;
  230. _skn_tg_mapTeleport = _skn_rndVA deleteAt 0;
  231. _skn_tg_spawnTyp = _skn_rndVA deleteAt 0;
  232. _skn_tg_limitSpawn = _skn_rndVA deleteAt 0;
  233. _skn_tg_old_espMap = _skn_rndVA deleteAt 0;
  234. _skn_tg_old_esp = _skn_rndVA deleteAt 0;
  235. _skn_tg_hideAdmin = _skn_rndVA deleteAt 0;
  236. _skn_tg_infrontTP = _skn_rndVA deleteAt 0;
  237. _skn_tg_godMode = _skn_rndVA deleteAt 0;
  238.  
  239. _skn_tg_map_player = _skn_rndVA deleteAt 0;
  240. _skn_tg_map_corpse = _skn_rndVA deleteAt 0;
  241. _skn_tg_map_loot = _skn_rndVA deleteAt 0;
  242. _skn_tg_map_animals = _skn_rndVA deleteAt 0;
  243. _skn_tg_map_vehicle = _skn_rndVA deleteAt 0;
  244. _skn_tg_map_ai = _skn_rndVA deleteAt 0;
  245. _skn_tg_map_trader = _skn_rndVA deleteAt 0;
  246. _skn_tg_map_basebuilding = _skn_rndVA deleteAt 0;
  247.  
  248. _skn_t1 = _skn_rndVA deleteAt 0;
  249. _skn_t2 = _skn_rndVA deleteAt 0;
  250. _skn_t3 = _skn_rndVA deleteAt 0;
  251. _skn_t4 = _skn_rndVA deleteAt 0;
  252. _skn_t5 = _skn_rndVA deleteAt 0;
  253.  
  254. _skn_AH_rndVarAHInitCheckToken = _skn_t1+_skn_t2+_skn_t3+_skn_t4+_skn_t5;
  255. EPOCH_server_Authed = compileFinal("_this in "+_skn_AH_rndVarAHInitCheck);
  256. EPOCH_server_disconnect = compileFinal("
  257. _ret = false;
  258. _index = " +_skn_AH_rndVarAHInitCheck + " find _this;
  259. if (_index != -1) then {
  260. " +_skn_AH_rndVarAHInitCheck + " deleteAt _index;
  261. _ret = true;
  262. };
  263. _ret
  264. ");
  265.  
  266. EPOCH_server_movePlayer = compileFinal("
  267. params [['_playerObj',objNull,[objNull]],['_pos',[],[[]]]];
  268. if !(isNull _playerObj) then {
  269. "+_skn_antiTeleportPVC+" = true;
  270. (owner _playerObj) publicVariableClient '"+_skn_antiTeleportPVC+"';
  271. [format['Teleport %1 (%2) To Position: %3', name _playerObj, getPlayerUID _playerObj,_pos], 0] call "+_skn_server_adminLog+";
  272. [vehicle _playerObj,_pos] spawn {
  273. uiSleep 0.5;
  274. (_this select 0) setPosATL (_this select 1);
  275. };
  276. };
  277. ");
  278.  
  279. EPOCH_server_teleportCheck = compileFinal("
  280. params [['_playerObj',objNull,[objNull]],'_allow'];
  281. if !(isNull _playerObj) then {
  282. "+_skn_antiTeleportPVC+" = _allow;
  283. (owner _playerObj) publicVariableClient '"+_skn_antiTeleportPVC+"';
  284. };
  285. ");
  286.  
  287. _stringInArray = {
  288. private "_ret";
  289. _ret = false;
  290. {if (_x in _case)exitWith {_ret = true}}forEach _this;
  291. _ret
  292. };
  293.  
  294. _displaysArray = [];
  295. {_displaysArray pushBack [_x,[],[]]} forEach ["RscDisplayMainMap","RscDisplayGetReady","RscDisplayInventory","RscDisplayLoadMission","RscDisplayInterrupt","RscDisplayOptionsVideo","RscDisplayOptions","RscDisplayAVTerminal","RscDisplayConfigure","RscDisplayConfigureAction","RscDisplayConfigureControllers","RscDisplayControlSchemes","RscDisplayCustomizeController","RscDisplayDebriefing","RscDisplayDiary","RscDisplayGameOptions","RscDisplayJoystickSchemes","RscDisplayLoading","RscDisplayMicSensitivityOptions","RscDisplayOptionsAudio","RscDisplayOptionsLayout","RscDisplayStart","RscDisplayVehicleMsgBox","RscDisplayInsertMarker"];
  296. _displays = [(_config >> "displayOnload"), "checkDisplays", _displaysArray] call EPOCH_fnc_returnConfigEntry;
  297.  
  298. _cfg_displayArray = [];
  299. {
  300. _onLoad = (getText(configFile >> (_x select 0) >> "onLoad"));
  301. _onUnload = (getText(configFile >> (_x select 0) >> "onUnload"));
  302. _onLoad = [_onLoad];
  303. _onUnload = [_onUnload];
  304. {
  305. _onLoad pushBack _x;
  306. } forEach(_x select 1);
  307. {
  308. _onUnload pushBack _x;
  309. } forEach(_x select 2);
  310. _cfg_displayArray pushBack[(_x select 0), _onLoad, _onUnload];
  311. }forEach _displays;
  312.  
  313. _skn_adminUIDArray = [];
  314. _skn_adminNAMEArray = [];
  315. _skn_tempuid = [];
  316. {
  317. _skn_adminUIDArray pushBack(_x select 0);
  318. _skn_adminNAMEArray pushBack(_x select 1);
  319.  
  320. } forEach _skn_adminsOwner;
  321. _skn_adminsOwner = _skn_adminUIDArray;
  322. {
  323. _skn_tempuid pushBack(_x select 0);
  324. _skn_adminUIDArray pushBack(_x select 0);
  325. _skn_adminNAMEArray pushBack(_x select 1);
  326.  
  327. } forEach _skn_adminsHigh;
  328. _skn_adminsHigh = _skn_tempuid;
  329. _skn_tempuid = [];
  330. {
  331. _skn_adminUIDArray pushBack(_x select 0);
  332. _skn_tempuid pushBack(_x select 0);
  333. _skn_adminNAMEArray pushBack(_x select 1);
  334. } forEach _skn_adminsLow;
  335. _skn_adminsLow = _skn_tempuid;
  336. _skn_tempuid = nil;
  337.  
  338. {_skn_adminMenuOwnerSetting set[_forEachIndex, toUpper _x]}forEach _skn_adminMenuOwnerSetting;
  339. {_skn_adminMenuHighSetting set [_forEachIndex,toUpper _x]}forEach _skn_adminMenuHighSetting;
  340. {_skn_adminMenuLowSetting set [_forEachIndex,toUpper _x]}forEach _skn_adminMenuLowSetting;
  341.  
  342. _skn_adminMenuOwner = "[]";
  343. _skn_adminMenuHigh = "[]";
  344. _skn_adminMenuLow = "[]";
  345.  
  346. _skn_blockedSpawnMenuUID = [];
  347. if !("SPAWN-MENU" in _skn_adminMenuHighSetting) then {_skn_blockedSpawnMenuUID = _skn_adminsHigh};
  348. if !("SPAWN-MENU" in _skn_adminMenuLowSetting) then {{_skn_blockedSpawnMenuUID pushBack _x}forEach _skn_adminsLow};
  349. if !("SPAWN-MENU" in _skn_adminMenuOwnerSetting) then {{_skn_blockedSpawnMenuUID pushBack _x}forEach _skn_adminsOwner};
  350.  
  351. _case = _skn_adminMenuOwnerSetting; //All Cfg for Owner Menu
  352. for "_i" from 1 to 3 do {
  353. _temp = "[['=============== MAIN MENU ===============',[],'','1',[]]";
  354. if (["PLAYER-TELEPORT","MAP-TELEPORT","INFRONT-TELEPORT"] call _stringInArray) then {
  355.  
  356. if ("PLAYER-TELEPORT" in _case) then {
  357. _temp = _temp + "
  358. ,[' Player To Admin',[],{[101,_this select 1] call "+_skn_adminRequest_PVC+"},'4',[]]
  359. ,[' Admin To Player', [], { [102, _this select 1] call "+_skn_adminRequest_PVC+" },'4',[]]
  360. ";
  361. };
  362. if ("INFRONT-TELEPORT" in _case) then {
  363. _temp = _temp + "
  364. ,[' In Front', [], {"+_skn_tg_infrontTP+" = !"+_skn_tg_infrontTP+"},'2',[]]
  365. ";
  366. };
  367. if ("MAP-TELEPORT" in _case) then {
  368. _temp = _temp + "
  369. ,[' Ctrl+Click Map', [], {"+_skn_tg_mapTeleport+"=!"+_skn_tg_mapTeleport+";['Map to Teleport', if ("+_skn_tg_mapTeleport+") then[{2}, { 1 }]] call "+_skn_adminLog_PVC+" },'2',[]]
  370. ";
  371. };
  372. };
  373. if (["FREE-CAM","INVISIBLE"] call _stringInArray) then {
  374. _temp = _temp + ",['Spectate', [],'','1',[]]";
  375. if ("MAP-TELEPORT" in _case) then {
  376. _temp = _temp + "
  377. ,[' Free Look Cam ', [], "+_skn_freeCam+",'0',[]]
  378. ";
  379. };
  380. if ("INVISIBLE" in _case) then {
  381. _temp = _temp + "
  382. ,[' Invisible Mode', [], "+_skn_hideAdmin+", '2', []]
  383. ";
  384. };
  385. };
  386. if (["MAP-PLAYER","MAP-CORPSE","MAP-LOOT","MAP-ANIMALS","MAP-VEHICLE","MAP-AI","MAP-BASEBUILDING"] call _stringInArray) then {
  387. _temp = _temp + ",['Map Tools', [],'','1',[]]";
  388. if ("MAP-PLAYER" in _case) then {
  389. _temp = _temp + "
  390. ,[' Player Marker', [], {"+_skn_tg_map_player+" = !"+_skn_tg_map_player+"; ['Player MARKER',if ("+_skn_tg_map_player+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  391. ";
  392. };
  393. if ("MAP-CORPSE" in _case) then {
  394. _temp = _temp + "
  395. ,[' Corpse Marker', [], {"+_skn_tg_map_corpse+" = !"+_skn_tg_map_corpse+"; ['Corpse MARKER',if ("+_skn_tg_map_corpse+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  396. ";
  397. };
  398. if ("MAP-LOOT" in _case) then {
  399. _temp = _temp + "
  400. ,[' Loot Marker', [], {"+_skn_tg_map_loot+" = !"+_skn_tg_map_loot+"; if ("+_skn_tg_map_loot+") then {waitUntil {"+_skn_mapLootArray+" = nearestObjects[player,['WH_Loot', 'Animated_Loot'], 12500];uiSleep 10;!"+_skn_tg_map_loot+"};"+_skn_mapLootArray+" = []};['Loot MARKER',if ("+_skn_tg_map_loot+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  401. ";
  402. };
  403. if ("MAP-ANIMALS" in _case) then {
  404. _temp = _temp + "
  405. ,[' Animal Marker', [], {"+_skn_tg_map_animals+" = !"+_skn_tg_map_animals+"; if ("+_skn_tg_map_animals+") then {waitUntil {"+_skn_mapAnimalArray+" = nearestObjects[player, ['Sheep_random_EPOCH','Goat_random_EPOCH','Snake_random_EPOCH','Snake2_random_EPOCH','Hen_random_EPOCH','Cock_random_EPOCH','Fin_random_EPOCH','Alsatian_random_EPOCH','Rabbit_EPOCH'], 12500];uiSleep 10;!"+_skn_tg_map_animals+"};"+_skn_mapAnimalArray+" = []};['Animal MARKER',if ("+_skn_tg_map_animals+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  406. ";
  407. };
  408. if ("MAP-VEHICLE" in _case) then {
  409. _temp = _temp + "
  410. ,[' Vehicle Marker', [], {"+_skn_tg_map_vehicle+" = !"+_skn_tg_map_vehicle+"; ['Vehicle MARKER',if ("+_skn_tg_map_vehicle+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  411. ";
  412. };
  413. if ("MAP-AI" in _case) then {
  414. _temp = _temp + "
  415. ,[' AI Marker', [], {"+_skn_tg_map_ai+" = !"+_skn_tg_map_ai+"; if ("+_skn_tg_map_ai+") then {waitUntil {"+_skn_mapAIArray+" = nearestObjects[player, ['I_Soldier_EPOCH','I_Soldier1_EPOCH','I_Soldier2_EPOCH','I_Soldier3_EPOCH','O_recon_F'], 12500];uiSleep 10;!"+_skn_tg_map_ai+"};"+_skn_mapAIArray+" = []}; ['AI MARKER',if ("+_skn_tg_map_ai+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  416. ";
  417. };
  418. if ("MAP-TRADER" in _case) then {
  419. _temp = _temp + "
  420. ,[' Trader Marker', [], {"+_skn_tg_map_trader+" = !"+_skn_tg_map_trader+"; ['Trader MARKER',if ("+_skn_tg_map_trader+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  421. ";
  422. };
  423. if ("MAP-BASEBUILDING" in _case) then {
  424. _temp = _temp + "
  425. ,[' Base Building Marker', [], {"+_skn_tg_map_basebuilding+" = !"+_skn_tg_map_basebuilding+"; if ("+_skn_tg_map_basebuilding+") then {waitUntil {"+_skn_mapBasesArray+" = ([worldSize/2,worldSize/2,0]) nearObjects['PlotPole_EPOCH', 12500];uiSleep 15;!"+_skn_tg_map_basebuilding+"};"+_skn_mapBasesArray+" = []}; ['Base Building MARKER',if ("+_skn_tg_map_basebuilding+") then [{2},{1}]] call "+_skn_adminLog_PVC+"}, '2', []]
  426. ";
  427. };
  428. };
  429. if (["ESP-PLAYER","ESP-LOOT","ESP-VEHICLE"] call _stringInArray) then {
  430. _temp = _temp + ",['3D Tools', [],'','1',[]]";
  431. if ("ESP-PLAYER" in _case) then {
  432. _temp = _temp + "
  433. ,[' Player ESP', true, "+_skn_esp+", '2', []]
  434. ";
  435. };
  436. if ("ESP-VEHICLE" in _case) then {
  437. _temp = _temp + "
  438. ,[' Vehicle ESP', false, "+_skn_esp+", '2', []]
  439. ";
  440. };
  441. if ("ESP-LOOT" in _case) then {
  442. _temp = _temp + "
  443. ,[' Loot ESP (WIP)', [], '', '1', []]
  444. ";
  445. };
  446. };
  447. if (["OLD-ESP","OLD-MAP"] call _stringInArray) then {
  448. _temp = _temp + ",['Old Visualisation Tools', [],'','1',[]]";
  449. if ("OLD-ESP" in _case) then {
  450. _temp = _temp + ",[' 3D ESP', [], "+_skn_old_esp+", '2', []]";
  451. };
  452. if ("OLD-MAP" in _case) then {
  453. _temp = _temp + ",[' MAP ESP', [], "+_skn_old_espMap+", '2', []]";
  454. };
  455. };
  456. if (["GODMODE","HEAL","VEHICLEREPAIR"] call _stringInArray) then {
  457. _temp = _temp + ",['Self Menu', [], '', '1', []]";
  458. if ("GODMODE" in _case) then {
  459. _temp = _temp + ",[' Godmode', [], "+_skn_godMode+", '2', []]";
  460. };
  461. if ("HEAL" in _case) then {
  462. _temp = _temp + ",[' Heal self',[],{[103,netId player] call "+_skn_adminRequest_PVC+"},'-1',[0.016,0.702,0.078,1]]";
  463. };
  464. if ("VEHICLEREPAIR" in _case) then {
  465. _temp = _temp + ",[' Repair Vehicle', [], "+_skn_repairVehicle+", '0', []]";
  466. };
  467. };
  468. if (["TARGET-HEAL","TARGET-AMMO","TARGET-KILL","TARGET-CRYPTO","TARGET-VEHICLEREPAIR"] call _stringInArray) then {
  469. _temp = _temp + ",['Target Actions', [], '', '1', []]";
  470. if ("TARGET-HEAL" in _case) then {
  471. _temp = _temp + ",[' Heal',[],{[103,_this select 1] call "+_skn_adminRequest_PVC+"},'4',[0.016,0.702,0.078,1]]";
  472. };
  473. if ("TARGET-KILL" in _case) then {
  474. _temp = _temp + ",[' Kill',[],{[100,_this select 1] call "+_skn_adminRequest_PVC+"},'4',[0.859,0.094,0.094,1]]";
  475. };
  476. if ("TARGET-AMMO" in _case) then {
  477. _temp = _temp + ",[' Give Ammo',[],{[200,_this select 1] call "+_skn_adminRequest_PVC+"},'4',[]]";
  478. };
  479. if ("TARGET-VEHICLEREPAIR" in _case) then {
  480. _temp = _temp + ",[' Repair Vehicle', [], "+_skn_repairVehicle+", '4', []]";
  481. };
  482. if ("TARGET-CRYPTO" in _case) then {
  483. {
  484. _temp = _temp + ",[' Give Crypto - "+str _x+"',"+str _x+",{[107,[_this select 1,_this select 2]] call "+_skn_adminRequest_PVC+"},'4',[]]"
  485. }count _skn_adminMenuCryproCfg;
  486. };
  487. };
  488. _temp = _temp + ",['Custom Stuff', [], '', '1', []]";
  489. if ("VEHICLEFLIP" in _case) then {
  490. _temp = _temp + ",[' Unflip Vehicle', [], "+_skn_flipVehicle+", '0', []]";
  491. };
  492. if ("SPAWNLOOT" in _case) then {
  493. _temp = _temp + ",[' Loot Buildings (25m)', 25, "+_skn_spawnLoot+", '0', []]";
  494. };
  495. _temp = _temp + ",[' Disconnect yourself', [], { (findDisplay 46) closeDisplay 0 }, '0', []]";
  496. _temp = _temp + ",[' Switch Day / Night', [], "+_skn_daynight+", '0', []]";
  497. if ("BANPANNEL" in _case) then {
  498. _temp = _temp + ",['Ban Menu',[],'','1',[]]
  499. ,[' BattlEye Ban - Custom Ban Reason',[],"+_skn_customBanreason+",'4',[]]
  500. ";
  501. {
  502. _temp = _temp + ",[' BattlEye Ban - "+_x+"','"+_x+"',"+_skn_customBanreason+",'4',[]]"
  503. }count _skn_adminMenuBanReasons;
  504. };
  505.  
  506. _temp = _temp + "
  507. ,['Key Binds',[],'','1',[]]
  508. ,[' 5 Key - Teleport In Front',[],'','1',[]]
  509. ,[' F2 - Cancel Spectating',[],'','1',[]]
  510. ,[' F5 - Delete Target',[],'','1',[]]
  511. ,[' 7 - (Un)Lock Target',[],'','1',[]]
  512. ];
  513. ";
  514. if (_i == 1) then {
  515. _skn_adminMenuOwner = _temp;
  516. _case = _skn_adminMenuHighSetting;
  517. };
  518. if (_i == 2) then {
  519. _skn_adminMenuHigh = _temp;
  520. _case = _skn_adminMenuLowSetting;
  521. };
  522. if (_i == 3) then {
  523. _skn_adminMenuLow = _temp;
  524. };
  525. };
  526.  
  527. _skn_spawnPointCenter = getMarkerPos "respawn_west";
  528. _centerDistance = [_serverSettingsConfig, "antihack_TPcenterDistance", 30] call EPOCH_fnc_returnConfigEntry;
  529. _maxTravelDistance = [_serverSettingsConfig, "antihack_maxTravelDistance", 30] call EPOCH_fnc_returnConfigEntry;
  530.  
  531. // Only set these if prefix is not used since we can filter for it
  532. if (_skn_PVSPrefix == "") then {
  533. "epochserver" callExtension format["800|%1|%2|%3|%4", _skn_doKickBan, _skn_doAdminRequest, _skn_doAdminLog, _skn_doTokenAuth];
  534. };
  535.  
  536. EPOCH_server_pushPlayer = compileFinal ("
  537. params ['_playerNetID','_playerUID','_C_SET','_fsmHandle','_player'];
  538. if (_playerUID in "+ str _skn_adminUIDArray+") then {
  539. _playerNetID publicVariableClient '"+_skn_Admin_Code+"';
  540. _playerNetID publicVariableClient '"+_skn_pv_adminLog+"';
  541. _playerNetID publicVariableClient '"+_skn_pv_hackerLog+"';
  542. _C_SET pushBack '[] spawn "+_skn_Admin_Init+"';
  543. } else {
  544. _C_SET pushBack '[] spawn "+_skn_AH_Init+"';
  545. };
  546. [_fsmHandle,['_C_SET', _C_SET]] remoteExecCall ['setFSMVariable', _player];
  547. true
  548. ");
  549. EPOCH_server_isPAdmin = compileFinal ("if (isNull _this) then {false} else {getPlayerUID _this in "+str _skn_adminUIDArray+"}");
  550.  
  551. _sknBanANDSleep = _skn_AH_Ban+"; uiSleep 60";
  552. _sknBanANDSleepQuick = _skn_AH_Ban+"; uiSleep 1";
  553.  
  554. // CfgPatches Check
  555. _sknPatches = [];
  556. "_sknPatches pushBack (configName _x); true" configClasses (configFile >> "CfgPatches");
  557. {_sknPatches pushBackUnique _x}forEach _skn_whitelist_cfgPatches;
  558. _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 {""};
  559. _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+";"};
  560.  
  561. // Addaction Checks
  562. _sknAddActionCheck = if ([_serverSettingsConfig, "antihack_addActionCheck", true] call EPOCH_fnc_returnConfigEntry) then{ "
  563. if (player == _ActionVehicle) then[{_ActionCount = _ActionCount + 1}, { _ActionVehicle = player; _ActionCount = 0 }];
  564. _addCase = player addAction['', '', [], -5, false, true, '', 'false'];
  565. player removeAction _addCase;
  566. if (_addCase != _ActionCount) then{
  567. [format['addAction %1/%2', _addCase, _ActionCount], 0] call "+_sknBanANDSleep+";
  568. };
  569. "} else {""};
  570.  
  571. // Anti teleport checks
  572. _antiTeleportCheck = if ([_serverSettingsConfig, "antihack_antiTeleportCheck", true] call EPOCH_fnc_returnConfigEntry) then{"
  573. _cntBan = 0;
  574. while {true} do {
  575. _lastTime = diag_tickTime;
  576. _lastPos = getPosATL vehicle player;
  577. _notNearbySpawn = _lastPos distance "+str _skn_spawnPointCenter+" > "+str _centerDistance+";
  578. while {alive player} do {
  579. _curTime = diag_tickTime;
  580. _curPos = getPosATL vehicle player;
  581. _distance = _lastPos distance _curPos;
  582.  
  583. if ((_curTime-_lastTime) > 1 || _distance > "+str _maxTravelDistance+") then {
  584. if (((_distance/(_curTime-_lastTime)) > "+str _maxTravelDistance+") && _notNearbySpawn && (player == vehicle player)) then {
  585. if (isNil '"+_skn_antiTeleportPVC+"') then {
  586. [format['[TEST] TP from %1 to %2, %3 meters, now at %4', _lastPos, _curPos, round _distance, getPosATL player],1] call "+_sknBanANDSleep+";
  587. vehicle player setPosATL _lastPos;
  588. _cntBan = _cntBan + 1;
  589. if (_cntBan > 4) then {
  590.  
  591. };
  592. } else {
  593. uiSleep 10;
  594. _lastPos = getPosATL vehicle player;
  595. _lastTime = diag_tickTime;
  596. _notNearbySpawn = false;
  597. };
  598. } else {
  599. _lastPos = _curPos;
  600. _lastTime = _curTime;
  601. _notNearbySpawn = _lastPos distance "+str _skn_spawnPointCenter+" > "+str _centerDistance+";
  602. };
  603. };
  604. };
  605. uiSleep 0.1;
  606. };
  607. uiSleep 0.25;
  608. "} else {""};
  609.  
  610. // Init Server Side Event Handlers
  611. //[_data,_player,_token];
  612. call compile("'"+_skn_doTokenAuth+"' addPublicVariableEventHandler {
  613. _array = _this select 1;
  614. _tokenSet = false;
  615. if !([_array select 1, _array select 2] call EPOCH_server_getPToken) exitWith{};
  616. if (_array select 0 isEqualTo '"+_skn_AH_rndVarAHInitCheckToken+"') then {
  617. _tokenSet = true;
  618. _puid = (_array select 1) getVariable['PUID', ''];
  619. if (_puid != '') then {
  620. if !(_puid in "+_skn_AH_rndVarAHInitCheck+") then {
  621. "+_skn_AH_rndVarAHInitCheck+" pushBack _puid;
  622. diag_log format['DEBUG: player auth token set %1', _array];
  623. };
  624. };
  625. };
  626. if !(_tokenSet) then {
  627. _playerUID = getPlayerUID (_array select 1);
  628. if (_playerUID != '') then{
  629. 'epochserver' callExtension format['911|%1|%2', _playerUID, 'Auth failure, Please reconnect'];
  630. };
  631. };
  632. };");
  633.  
  634. call compile ("'"+_skn_doKickBan+"' addPublicVariableEventHandler {
  635. _array = _this select 1;
  636. _array params ['_text','_mode','_player','_token'];
  637. if !([_player,_token] call EPOCH_server_getPToken) exitWith {
  638. ['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;
  639. };
  640. _text = toString(_text);
  641. _reasonIndex = -1;
  642. if (_mode isEqualType []) then{
  643. _mode = _mode select 0;
  644. _reasonIndex = _mode select 1;
  645. };
  646. _reason = '';
  647. _logName = 'ahl';
  648. _logMode = 1;
  649. _logColor = [1,1,1,1];
  650. switch _mode do {
  651. case 0: {
  652. _logName = 'ahb';
  653. _logColor = [1,0,0,1];
  654. _logMode = 0;
  655. if (_reasonIndex != -1) then {
  656. _reason = "+str(_epoch_banReasons)+" select _reasonIndex;
  657. };
  658. ['ban', _player , format['"+_skn_banReason+" %1',_reason], "+str(_antihack_banDuration)+"] call EPOCH_serverCommand;
  659. };
  660. case 2: {
  661. _logName = 'ahk';
  662. _logColor = [0,0,1,1];
  663. if (_reasonIndex != -1) then {
  664. _reason = "+str(_epoch_kickReasons)+" select _reasonIndex;
  665. };
  666. ['kick', _player , format['"+_epoch_kickReason+" %1',_reason]] call EPOCH_serverCommand;
  667. };
  668. };
  669. "+_skn_pv_hackerLog+" pushBack[[_logMode, call EPOCH_server_getRealTime, name _player, getPlayerUID _player, _text], _logColor];
  670. [_logName, format['%1 (%2): %3', name _player, getPlayerUID _player, _text]] call EPOCH_fnc_server_hiveLog;
  671. diag_log str([_logName, format['%1 (%2): %3', name _player, getPlayerUID _player, _text]]);
  672. {
  673. if (_x call EPOCH_server_isPAdmin) then {
  674. (owner _x) publicVariableClient '"+_skn_pv_hackerLog+"';
  675. };
  676. }forEach allPlayers;
  677. };");
  678. //0 = BAN
  679. //1 = LOG
  680. //2 = KICK
  681.  
  682. _skn_code_ban = compileFinal ("
  683. _this set [0,toArray (_this select 0)];
  684. _this pushBack player;
  685. _this pushBack Epoch_personalToken;
  686. "+_skn_doKickBan+" = _this;
  687. publicVariableServer '"+_skn_doKickBan+"';
  688. true
  689. ");
  690. _skn_code_init = compileFinal ("
  691. comment 'Epoch Mod Antihack - Niklas Wagner - www.skaronator.com - Aaron Clark - www.epochmod.com - License: (CC) Attribution-NonCommercial-NoDerivatives 4.0 International';
  692. waitUntil {(getPlayerUID player) != ''};
  693. _start = diag_tickTime;
  694. waitUntil {!isNil '"+_skn_AH_Code+"' || (diag_tickTime-_start > 20)};
  695. if (isNil '"+_skn_AH_Code+"') exitWith {
  696. "+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],2,player,Epoch_personalToken];
  697. publicVariableServer '"+_skn_doKickBan+"';
  698. (findDisplay 46) closeDisplay 0
  699. };
  700. [] spawn "+_skn_AH_Code+";
  701. uiSleep 3;
  702. if ((isNil '"+_skn_AH_Code_CA+"') || (isNil '"+_skn_AH_Code_CB+"')) then {
  703. uiSleep 5;
  704. if ((isNil '"+_skn_AH_Code_CA+"') || (isNil '"+_skn_AH_Code_CB+"')) then {
  705. [] spawn "+_skn_AH_Code+";
  706. uiSleep 3;
  707. };
  708. };
  709. uiSleep 5;
  710. if ((isNil '"+_skn_AH_Code_CA+"') || (isNil '"+_skn_AH_Code_CB+"')) then {
  711. "+_skn_doKickBan+" = [format['Cannot Load AH [%1,%2]',!isNil '"+_skn_AH_Code_CA+"',!isNil '"+_skn_AH_Code_CB+"'],2,player,Epoch_personalToken];
  712. publicVariableServer '"+_skn_doKickBan+"';
  713. (findDisplay 46) closeDisplay 0
  714. };
  715. ");
  716. _skn_code_antihack = compileFinal ("
  717. comment 'Epoch Mod Antihack - Niklas Wagner - www.skaronator.com - Aaron Clark - www.epochmod.com - License: (CC) Attribution-NonCommercial-NoDerivatives 4.0 International';
  718. if ((!isNil '"+_skn_AH_Code_CA+"') && (!isNil '"+_skn_AH_Code_CB+"')) exitWith {};
  719. "+_skn_AH_Code_CA+" = true;
  720. "+_skn_addonCheckCode+"
  721. _t = '"+_skn_t1+"';
  722. [] spawn {
  723. uiSleep 5;
  724. FW"+_skn_AH_rndVar+" = '';
  725. FA"+_skn_AH_rndVar+" = 0;
  726. FWC"+_skn_AH_rndVar+" = 0;
  727. _sknOnFire = {
  728. _wep = _this select 1;
  729. _ammo = player ammo _wep;
  730. if !(_wep in ['Throw','Put']) then {
  731. if (FW"+_skn_AH_rndVar+" == _wep && FA"+_skn_AH_rndVar+" == _ammo) then {
  732. if (FWC"+_skn_AH_rndVar+" > 1) then {
  733. [format['[TEST] Unlimited Ammo: [%1,%2]', _wep, _ammo], 1] call "+_skn_AH_Ban+";
  734. [] spawn {uiSleep 60;FWC"+_skn_AH_rndVar+" = 0};
  735. };
  736. FWC"+_skn_AH_rndVar+" = FWC"+_skn_AH_rndVar+" +1;
  737. [] spawn {uiSleep 20;FWC"+_skn_AH_rndVar+" = 0};
  738. };
  739. };
  740. FA"+_skn_AH_rndVar+" = _ammo;
  741. FW"+_skn_AH_rndVar+" = _wep;
  742. true
  743. };
  744.  
  745. uiNamespace setVariable['RscDisplayRemoteMissions',displayNull];
  746. uiNamespace setVariable['RscDisplayArsenal',displayNull];
  747. missionnamespace setVariable['BIS_fnc_showNotification_queue',nil];
  748. while {true} do {
  749. {
  750. if (!isNull (_x select 0)) then {
  751. [format['Menu: %1',_x select 1],0] call "+_sknBanANDSleep+";
  752. };
  753. }forEach[
  754. [(findDisplay 64) displayCtrl 1002,'findDisplay 64'],
  755. [(findDisplay 49) displayCtrl 0,'findDisplay 49'],
  756. [uiNamespace getVariable 'RscDisplayRemoteMissions','RscDisplayRemoteMissions'],
  757. [uiNamespace getVariable 'RscDisplayArsenal','RscDisplayArsenal'],
  758. [missionnamespace getvariable 'BIS_fnc_showNotification_queue','showNotification']
  759. ];
  760. {
  761. if (!isNull (findDisplay _x)) then {
  762. [format['Menu: findDisplay %1',_x],0] call "+_sknBanANDSleep+";
  763. };
  764. }forEach "+str _skn_badDisplaysArray+";
  765. if (!isNull (uiNamespace getVariable 'RscDisplayConfigureAction')) then {
  766. _ctrlTxt = toLower ctrlText 1000;
  767. if (_ctrlTxt != '') then {
  768. if (_ctrlTxt != toLower localize 'STR_A3_RscDisplayConfigureAction_Title') then {
  769. [format['Menu: RscDisplayConfigureAction-A %1',_ctrlTxt],0] call "+_sknBanANDSleep+";
  770. };
  771. };
  772. {
  773. if (buttonAction _x != '') then {
  774. [format['Menu: RscDisplayConfigureAction-B (%1)',_x],0] call "+_sknBanANDSleep+";
  775. };
  776. }forEach [1,104,105,106,107,108,109];
  777. };
  778. if (!isNull (uiNamespace getVariable 'RscDisplayInsertMarker')) then {
  779. _ctrlTxt = toLower ctrlText 1001;
  780. if (_ctrlTxt != '') then {
  781. if (_ctrlTxt != toLower localize 'STR_A3_RscDisplayInsertMarker_Title') then {
  782. [format['Menu: RscDisplayInsertMarker-A %1',_ctrlTxt],0] call "+_sknBanANDSleep+";
  783. };
  784. };
  785. if ((buttonAction 1 != '') || (buttonAction 2 != '')) then {
  786. [format['Menu: RscDisplayInsertMarker-B [%1,%2]',buttonAction 1,buttonAction 2],0] call "+_sknBanANDSleep+";
  787. };
  788. };
  789. if (!isNull (findDisplay 129)) then {closeDialog 0};
  790.  
  791. if !(commandingMenu in "+str _skn_commandMenuArray+") then {
  792. [format['Menu: commandMenu: %1',commandingMenu],0] call "+_sknBanANDSleep+";
  793. };
  794.  
  795. onMapSingleClick '';
  796. player allowDamage true;
  797. vehicle player allowDamage true;
  798.  
  799. {
  800. _ehKey = _x select 0;
  801. if (_x select 2) then {
  802. player removeEventHandler [_ehKey, 0];
  803. };
  804. _ehCode = _x select 1;
  805. if (_ehKey == 'Fired') then {_ehCode = (_ehCode + '_this call '+str(_sknOnFire)) };
  806. _addCase = player addEventHandler [_ehKey, _ehCode];
  807. if !(_x select 2) then {
  808. player removeEventHandler [_ehKey, 0];
  809. };
  810. if (_addCase > 0) then {
  811. [format['EH: %1 %2',_ehKey,_addCase],0] call "+_sknBanANDSleep+";
  812. };
  813. } forEach "+str _skn_addEHArray+";
  814.  
  815. uiSleep 0.01;
  816. };
  817. };
  818. _t = _t + '"+_skn_t2+"';
  819. [] spawn {
  820. disableSerialization;
  821. _ActionCount = -1;
  822. _ActionVehicle = player;
  823. _displayCount = 0;
  824. _personalToken = Epoch_personalToken;
  825. _antiWallCount = 0;
  826. waitUntil{!isNull (findDisplay 46)};
  827. setViewDistance "+str _skn_viewDistance+";
  828. setObjectViewDistance["+str _skn_viewDistanceObects+", 100];
  829. setTerrainGrid "+str _skn_terrainGrid+";
  830. uiSleep 5;
  831. while {true} do {
  832. if (isNil 'Epoch_personalToken') then {
  833. "+_skn_doKickBan+" = [format['personalToken NIL: %1/%2',Epoch_personalToken,_personalToken],0,player,_personalToken];
  834. publicVariableServer '"+_skn_doKickBan+"';
  835. uiSleep 60;
  836. };
  837. {
  838. if (isNil _x) then {
  839. [format['%1: nil',_x],0] call "+_sknBanANDSleep+";
  840. };
  841. }forEach "+str _skn_nilVarCheckArray+";
  842. if !(groupIconsVisible isEqualTo [false,false]) then {
  843. [format['GroupIcons %1',groupIconsVisible],0] call "+_sknBanANDSleep+";
  844. };
  845. if (unitRecoilCoefficient player != 1) then {
  846. [format['Recoil %1',unitRecoilCoefficient player],0] call "+_sknBanANDSleep+";
  847. };
  848. if (animationState player in "+str _skn_badAnimations+") then {
  849. [format['BadMove: %1',animationState player],0] call "+_sknBanANDSleep+";
  850. };
  851. if (EPOCH_playerEnergy > 2500 || EPOCH_playerEnergy < 0) then {
  852. [format['Energy: %1',EPOCH_playerEnergy],0] call "+_sknBanANDSleep+";
  853. };
  854. if (EPOCH_playerHunger > 5000 || EPOCH_playerHunger < 0) then {
  855. [format['Hunger: %1',EPOCH_playerHunger],0] call "+_sknBanANDSleep+";
  856. };
  857. if (EPOCH_playerThirst > 2500 || EPOCH_playerThirst < 0) then {
  858. [format['Thirsk: %1',EPOCH_playerThirst],0] call "+_sknBanANDSleep+";
  859. };
  860. if (EPOCH_playerStamina > 2500 || EPOCH_playerStamina < 0) then {
  861. [format['Stamina: %1',EPOCH_playerStamina],0] call "+_sknBanANDSleep+";
  862. };
  863. if (EPOCH_playerCrypto > "+str _skn_playerCryptoLimit+" || EPOCH_playerCrypto < 0) then {
  864. [format['Crypto: %1',EPOCH_playerCrypto],0] call "+_sknBanANDSleep+";
  865. };
  866. if (_antiWallCount != EPOCH_antiWallCount) then {
  867. if (_antiWallCount > EPOCH_antiWallCount) then {
  868. [format['antiWall: %1/%2',EPOCH_antiWallCount,_antiWallCount],0] call "+_sknBanANDSleep+";
  869. };
  870. _antiWallCount = EPOCH_antiWallCount;
  871. };
  872. if (EPOCH_target isEqualTo player) then {
  873. [format['setVelocityTarget: %1', EPOCH_target], 0] call "+_sknBanANDSleep+";
  874. };
  875. if !(EPOCH_ESP_TARGETS isEqualTo []) then {
  876. [format['ESP-O: %1', EPOCH_ESP_TARGETS], 0] call "+_sknBanANDSleep+";
  877. };
  878. if !(EPOCH_ESPMAP_TARGETS isEqualTo []) then {
  879. [format['MAP-ESP: %1', EPOCH_ESPMAP_TARGETS], 0] call "+_sknBanANDSleep+";
  880. };
  881. if !(EPOCH_ESP_VEHICLEPLAYER isEqualTo []) then {
  882. [format['ESP-N: %1', EPOCH_ESP_VEHICLEPLAYER], 0] call "+_sknBanANDSleep+";
  883. };
  884. if (EPOCH_ESP_PLAYER || EPOCH_ESP_VEHICLES) then {
  885. [format['ESP-N: %1', EPOCH_ESP_VEHICLES], 0] call "+_sknBanANDSleep+";
  886. };
  887. if (EPOCH_taxRate != "+str EPOCH_taxRate+") then {
  888. [format['taxTate: %1',EPOCH_taxRate],0] call "+_sknBanANDSleep+";
  889. };
  890. if !(EPOCH_group_upgrade_lvl isEqualTo "+str EPOCH_group_upgrade_lvl+") then {
  891. [format['groupUpgradeLvL: %1',EPOCH_group_upgrade_lvl],0] call "+_sknBanANDSleep+";
  892. };
  893. if (viewDistance != "+str _skn_viewDistance+") then{
  894. [format['viewDistance %1',viewDistance],0] call "+_sknBanANDSleep+";
  895. };
  896. "+_sknAddActionCheck+"
  897. _display = findDisplay 46;
  898. if !(isNull _display) then {
  899. {
  900. _display displayRemoveAllEventHandlers _x;
  901. _addCase = _display displayAddEventHandler [_x,([""CfgEpochClient"", _x, """"] call EPOCH_fnc_returnConfigEntryV2)];
  902. if (_addCase != _displayCount) then {
  903. [format['DEH: %3 %1/%2',_addCase,_displayCount,_x],0] call "+_sknBanANDSleep+";
  904. };
  905. } forEach (['CfgEpochClient', 'displayAddEventHandler', []] call EPOCH_fnc_returnConfigEntryV2);
  906. };
  907. uiSleep ((random 1)+1);
  908. };
  909. };
  910. _t = _t + '"+_skn_t3+"';
  911. [] spawn {"+_antiTeleportCheck+"};
  912. _t = _t + '"+_skn_t4+"';
  913. [] spawn {
  914. uiNamespace setVariable['ESP_mainMap', nil];
  915. uiNamespace setVariable['ESP_adminMap', nil];
  916. while {true} do {
  917. {
  918. _badVar = _x;
  919. {
  920. _var = _x getVariable _badVar;
  921. if (!isNil '_var') then {
  922. [format['BadVar %1=%2 (%3)',_badVar,_var,_forEachIndex],0] call "+_sknBanANDSleep+";
  923. _x setVariable [_badVar,nil];
  924. };
  925. }forEach [missionNamespace, parsingNamespace, uiNamespace];
  926. }forEach "+str _skn_badVarCheckArray+";
  927. "+_skn_fileCheckCode+"
  928. {
  929. _display = _x select 0;
  930. _displayCheckOkay = false;
  931. {
  932. if ((getText(configFile>>_display>>'onLoad'))==_x) exitWith { _displayCheckOkay = true };
  933. }forEach (_x select 1);
  934. if (!_displayCheckOkay) then {
  935. [format['Changed %1 >> onLoad >> %2', _display, getText(configFile>>_display>>'onLoad')],0] call "+_sknBanANDSleep+";
  936. _displayCheckOkay = false;
  937. };
  938. {
  939. if ((getText(configFile>>_display>>'onUnload'))==_x) exitWith { _displayCheckOkay = true };
  940. }forEach (_x select 2);
  941. if (!_displayCheckOkay) then {
  942. [format['Changed %1 >> onUnload >> %2', _display, getText(configFile>>_display>>'onUnload')],0] call "+_sknBanANDSleep+";
  943. }
  944. }forEach "+str _cfg_displayArray+";
  945. uiSleep ((random 10)+10);
  946. };
  947. };
  948. _t = _t + '"+_skn_t5+"';
  949. "+_skn_doTokenAuth+" = [_t,player,Epoch_personalToken];
  950. publicVariableServer '"+_skn_doTokenAuth+"';
  951. "+_skn_doTokenAuth+" = nil;
  952. "+_skn_AH_Code_CB+" = true;
  953. true
  954. ");
  955.  
  956. missionNamespace setVariable [_skn_AH_Ban, _skn_code_ban, true];
  957. missionNamespace setVariable [_skn_AH_Code, _skn_code_antihack, true];
  958. missionNamespace setVariable [_skn_AH_Init, _skn_code_init, true];
  959.  
  960. /*********************************************** ADMIN MENU *****************************************************/
  961. /*********************************************** ADMIN MENU *****************************************************/
  962. /*********************************************** ADMIN MENU *****************************************************/
  963. /*********************************************** ADMIN MENU *****************************************************/
  964. /*********************************************** ADMIN MENU *****************************************************/
  965. call compile ("
  966. "+_skn_pv_adminLog+" = [];
  967. "+_skn_pv_hackerLog+" = [];
  968. "+_skn_server_adminLog+" = {
  969. _toggle = ' -----';
  970. if ((_this select 1) != 0) then {
  971. _toggle = if ((_this select 1) == 2) then {' -ON-'} else {'-OFF-'};
  972. };
  973. _adminUID = getPlayerUID _admin;
  974. _adminNAME = "+str _skn_adminNAMEArray+" select ("+str _skn_adminUIDArray+" find _adminUID);
  975. ['aml', format['%1 (%2): [%4] %3',_adminNAME,_adminUID,_this select 0,_toggle]] call EPOCH_fnc_server_hiveLog;
  976.  
  977. "+_skn_pv_adminLog+" pushBack [call EPOCH_server_getRealTime,_adminNAME,_toggle,_this select 0];
  978. diag_log format ['SKN2 AdminRequest %1',"+_skn_pv_adminLog+"];
  979. {
  980. if (_x call EPOCH_server_isPAdmin) then {
  981. (owner _x) publicVariableClient '"+_skn_pv_adminLog+"';
  982. };
  983. }forEach allPlayers;
  984. true
  985. };
  986. ");
  987. //[text,toggle,admin,token]
  988. //toggle: 0:NOTHING 1:OFF 2:ON
  989. call compile ("'"+_skn_doAdminLog+"' addPublicVariableEventHandler {
  990. _array = _this select 1;
  991. diag_log format ['SKN AdminLog %1',_array];
  992. _admin = _array select 2;
  993.  
  994. if !([_admin,_array select 3] call EPOCH_server_getPToken) exitWith {};
  995. if !(_admin call EPOCH_server_isPAdmin) exitWith {};
  996. [_array select 0,_array select 1] call "+_skn_server_adminLog+"};
  997. ");
  998. //[case,[contentarray],player,token]
  999. call compile ("'"+_skn_doAdminRequest+"' addPublicVariableEventHandler {
  1000. _array = _this select 1;
  1001. diag_log format ['SKN AdminRequest %1',_array];
  1002. _admin = _array select 2;
  1003.  
  1004. if !([_admin,_array select 3] call EPOCH_server_getPToken) exitWith {};
  1005. if !(_admin call EPOCH_server_isPAdmin) exitWith {};
  1006.  
  1007. _case = _array select 0;
  1008. _content = _array select 1;
  1009.  
  1010. if (_case == 100) then {
  1011. _playerObj = objectFromNetId _content;
  1012. [format['Kill Target: %1 (%2)',name _playerObj,getPlayerUID _playerObj],0] call "+_skn_server_adminLog+";
  1013. _playerObj setDamage 1;
  1014. };
  1015. if (_case == 101) then {
  1016. _playerObj = objectFromNetId _content;
  1017. "+_skn_antiTeleportPVC+" = true;
  1018. (owner _playerObj) publicVariableClient '"+_skn_antiTeleportPVC+"';
  1019. [format['Teleport To Admin: %1 (%2)', name _playerObj, getPlayerUID _playerObj], 0] call "+_skn_server_adminLog+";
  1020. [vehicle _playerObj,_admin] spawn {
  1021. uiSleep 0.5;
  1022. (_this select 0) setPos ((_this select 1) modelToWorld [0,1,0]);
  1023. (_this select 0) setDir (getDir (_this select 1));
  1024. };
  1025. };
  1026. if (_case == 102) then {
  1027. _playerObj = objectFromNetId _content;
  1028. _behindM = if (vehicle _playerObj == _playerObj) then [{-1},{-5}];
  1029.  
  1030. vehicle _admin setPos (_playerObj modelToWorld [0,_behindM,0]);
  1031. vehicle _admin setDir (getDir _playerObj);
  1032. [format['Teleport Admin To: %1 (%2)', name _playerObj, getPlayerUID _playerObj], 0] call "+_skn_server_adminLog+";
  1033. };
  1034. if (_case == 103) then {
  1035. _playerObj = objectFromNetId _content;
  1036. _playerObj setDamage 0;
  1037. [['healPlayer',true], _playerObj] call EPOCH_sendRemoteExecClient;
  1038. if (_playerObj == _admin) then {
  1039. ['Healed Self',0] call "+_skn_server_adminLog+";
  1040. } else {
  1041. [format['Heal Target: %1 (%2)',name _playerObj,getPlayerUID _playerObj],0] call "+_skn_server_adminLog+";
  1042. }
  1043. };
  1044. if (_case == 104) then {
  1045. if ((_content isKindOf 'LandVehicle') || (_content isKindOf 'Air') || (_content isKindOf 'Ship') || (_content isKindOf 'Tank')) then {
  1046. [_content, _admin] call EPOCH_server_save_killedVehicle;
  1047. } else {
  1048. if (_content isKindOf 'Constructions_lockedstatic_F' || (_content isKindOf 'Buildable_Storage')) then{
  1049. [_content, _admin] call EPOCH_server_save_killedStorage;
  1050. } else {
  1051. [_content, _admin] call EPOCH_server_save_killedBuilding;
  1052. };
  1053. };
  1054. [format['Delete: %1 at [%2]',typeOf _content, getPos _content],0] call "+_skn_server_adminLog+";
  1055. _content spawn {
  1056. if !(isNull _this) then {
  1057. _this hideObjectGlobal true;
  1058. sleep 1;
  1059. if !(isNull _this) then {deleteVehicle _this};
  1060. };
  1061. };
  1062. };
  1063. if (_case == 106) then {
  1064. _admin hideObjectGlobal _content;
  1065. };
  1066. if (_case == 107) then {
  1067. _player = objectFromNetId (_content select 0);
  1068. if (!isNull _player) then {
  1069. _cIndex = EPOCH_customVars find 'Crypto';
  1070. _vars = _player getVariable['VARS', call EPOCH_defaultVars_SEPXVar];
  1071. _current_crypto = (((_vars select _cIndex) + (_content select 1)) min "+str _skn_playerCryptoLimit+") max 0;
  1072. _current_crypto remoteExec ['EPOCH_effectCrypto',_player];
  1073. _vars set[_cIndex, _current_crypto];
  1074. _player setVariable['VARS', _vars];
  1075. if (_player == _admin) then {
  1076. [format['Give Crypto Myself: %1',_content select 1],0] call "+_skn_server_adminLog+";
  1077. } else {
  1078. [format['Give Crypto to %1 (%2): %3',name _player,getPlayerUID _player,_content select 1],0] call "+_skn_server_adminLog+";
  1079. }
  1080. };
  1081. };
  1082. if (_case == 108) then {
  1083. if (!isNull _content) then {
  1084. [format['Repaire Vehicle: %1',typeOf _content],0] call "+_skn_server_adminLog+";
  1085. _content setDamage 0;
  1086. diag_log format ['Debug-Vehicle: Repair: 108,%1',_content];
  1087. if (local _content) then {
  1088. _content setFuel 1;
  1089. } else {
  1090. [_content, 1] remoteExec ['EPOCH_client_fillVehicle',_admin];
  1091. };
  1092. _content call EPOCH_server_save_vehicle;
  1093. };
  1094. };
  1095. if (_case == 109) then {
  1096. if (surfaceIsWater _content) then [{vehicle _admin setPosASL _content},{vehicle _admin setPosATL _content}];
  1097. };
  1098. if (_case == 110) then {
  1099. if (_content iskindof 'Landvehicle' || _content iskindof 'SHIP' || _content iskindof 'AIR' || _content iskindof 'TANK') then {
  1100. _lock = locked _content;
  1101. _newvalue = if (_lock in [2,3]) then {false} else {true};
  1102. if (local _content) then {
  1103. _content lock _newvalue;
  1104. }
  1105. else {
  1106. [_content, _newvalue] remoteExec ['EPOCH_client_lockVehicle',_content];
  1107. };
  1108. [[format ['%1 %2', typeof _content,if (_newvalue) then {'locked'} else {'unlocked'}],'PLAIN DOWN']] remoteexec ['cutText',_admin];
  1109. }
  1110. else {
  1111. if (_content iskindof 'Constructions_lockedstatic_F') then {
  1112. _locked = _content getVariable ['EPOCH_Locked', true];
  1113. _content setvariable ['EPOCH_Locked',!_locked,true];
  1114. [[format ['%1 %2', typeof _content,if (_locked) then {'unlocked'} else {'locked'}],'PLAIN DOWN']] remoteexec ['cutText',_admin];
  1115. };
  1116. };
  1117. };
  1118. if (_case == 111) then {
  1119. skiptime _content;
  1120. };
  1121. if (_case == 200) then {
  1122. _playerObj = objectFromNetId _content;
  1123. _weaponClass = currentWeapon _playerObj;
  1124. _mags = getArray(configFile >> 'CfgWeapons' >> _weaponClass >> 'magazines');
  1125. if !(_mags isEqualTo[]) then {
  1126. _firstMag = _mags select 0;
  1127. _magazineSizeMax = getNumber(configFile >> 'CfgMagazines' >> _firstMag >> 'count');
  1128. _playerObj addMagazine[_firstMag, _magazineSizeMax];
  1129. if (_playerObj == _admin) then {
  1130. [format['Gave Ammo (%1) to Self', _firstMag], 0] call "+_skn_server_adminLog+";
  1131. } else {
  1132. [format['Gave Ammo (%3) to Target: %1 (%2)', name _playerObj, getPlayerUID _playerObj, _firstMag], 0] call "+_skn_server_adminLog+";
  1133. };
  1134. };
  1135. };
  1136. if (_case == 555) then {
  1137. _target = objectFromNetId (_content select 1);
  1138.  
  1139. _itemSpawner = {
  1140. _nearbyWH = objNull;
  1141. if (vehicle _target != _target) then {
  1142. _nearbyWH = vehicle _target;
  1143. } else {
  1144. _nearbyWHArr = nearestObjects[_target, ['groundWeaponHolder'], 2];
  1145. if !(_nearbyWHArr isEqualTo[]) then {
  1146. _nearbyWH = _nearbyWHArr select 0;
  1147. } else {
  1148. _posWH = getposATL _target;
  1149. _nearbyWH = createVehicle['groundWeaponHolder', _posWH, [], 0, 'CAN_COLLIDE'];
  1150. _nearbyWH setPosATL _posWH;
  1151. };
  1152. };
  1153. if !(isNull _nearbyWH) then {
  1154. switch (_this select 1) do {
  1155. case 1: { _nearbyWH addMagazineCargoGlobal[(_this select 0), 1] };
  1156. case 2: { _nearbyWH addWeaponCargoGlobal[(_this select 0), 1] };
  1157. case 3: { _nearbyWH addItemCargoGlobal[(_this select 0), 1] };
  1158. case 4: { _nearbyWH addBackpackCargoGlobal[(_this select 0), 1] };
  1159. };
  1160. };
  1161. };
  1162.  
  1163. _permVehicleSpawner = {
  1164. _item = _this;
  1165. _return = false;
  1166. if (_item isKindOf 'Air' || _item isKindOf 'Ship' || _item isKindOf 'LandVehicle') then {
  1167. if !(EPOCH_VehicleSlots isEqualTo[]) then {
  1168. _serverSettingsConfig = configFile >> 'CfgEpochServer';
  1169. _removeweapons = [_serverSettingsConfig, 'removevehweapons', []] call EPOCH_fnc_returnConfigEntry;
  1170. _removemagazinesturret = [_serverSettingsConfig, 'removevehmagazinesturret', []] call EPOCH_fnc_returnConfigEntry;
  1171. _disableVehicleTIE = [_serverSettingsConfig, 'disableVehicleTIE', true] call EPOCH_fnc_returnConfigEntry;
  1172. _position = getPosATL _target;
  1173.  
  1174. _slot = EPOCH_VehicleSlots select 0;
  1175. EPOCH_VehicleSlots = EPOCH_VehicleSlots - [_slot];
  1176. missionNamespace setVariable ['EPOCH_VehicleSlotCount', count EPOCH_VehicleSlots, true];
  1177.  
  1178. _vehObj = createVehicle[_item, _position, [], 20, 'NONE'];
  1179. _return = true;
  1180. _vehObj call EPOCH_server_setVToken;
  1181. addToRemainsCollector[_vehObj];
  1182.  
  1183. if (_disableVehicleTIE) then {
  1184. _vehObj disableTIEquipment true;
  1185. };
  1186.  
  1187. clearWeaponCargoGlobal _vehObj;
  1188. clearMagazineCargoGlobal _vehObj;
  1189. clearBackpackCargoGlobal _vehObj;
  1190. clearItemCargoGlobal _vehObj;
  1191.  
  1192. if !(_removeweapons isequalto []) then {
  1193. {
  1194. _vehObj removeWeaponGlobal _x;
  1195. } foreach _removeweapons;
  1196. };
  1197. if !(_removemagazinesturret isequalto []) then {
  1198. {
  1199. _vehObj removeMagazinesTurret _x;
  1200. } foreach _removemagazinesturret;
  1201. };
  1202.  
  1203. _vehObj lock true;
  1204.  
  1205. _playerUID = getPlayerUID _target;
  1206. _playerGroup = _target getVariable['GROUP', ''];
  1207.  
  1208. _lockOwner = _playerUID;
  1209. if (_playerGroup != '') then {
  1210. _lockOwner = _playerGroup;
  1211. };
  1212.  
  1213. _vehLockHiveKey = format['%1:%2', (call EPOCH_fn_InstanceID), _slot];
  1214. ['VehicleLock', _vehLockHiveKey, EPOCH_vehicleLockTime, [_lockOwner]] call EPOCH_fnc_server_hiveSETEX;
  1215.  
  1216. _cfgEpochVehicles = 'CfgEpochVehicles' call EPOCH_returnConfig;
  1217. _availableColorsConfig = (_cfgEpochVehicles >> _item >> 'availableColors');
  1218.  
  1219. if (isArray(_availableColorsConfig)) then {
  1220. _textureSelectionIndex = (_cfgEpochVehicles >> _item >> 'textureSelectionIndex');
  1221. _selections = if (isArray(_textureSelectionIndex)) then {getArray(_textureSelectionIndex)} else {[0]};
  1222. _colors = getArray(_availableColorsConfig);
  1223. _textures = _colors select 0;
  1224. _color = floor(random(count _textures));
  1225. _count = (count _colors) - 1;
  1226. {
  1227. if (_count >= _forEachIndex) then {
  1228. _textures = _colors select _forEachIndex;
  1229. };
  1230. _vehObj setObjectTextureGlobal[_x, (_textures select _color)];
  1231. } forEach _selections;
  1232. _vehObj setVariable['VEHICLE_TEXTURE', _color];
  1233. };
  1234.  
  1235. _vehObj setVariable['VEHICLE_SLOT', _slot, true];
  1236. _vehObj call EPOCH_server_save_vehicle;
  1237. _vehObj call EPOCH_server_vehicleInit;
  1238. } else {
  1239. diag_log 'ADMIN: Unable to spawn vehicle, no slots available';
  1240. };
  1241. };
  1242. _return
  1243. };
  1244.  
  1245. _allClasses = [];
  1246. {
  1247. _classname = _x select 0;
  1248. _allClasses pushBack _classname;
  1249. _type = _x select 1;
  1250. if (_type in [0,1,2]) then {_classname call _permVehicleSpawner};
  1251. if (_type in [3,4,5]) then {[_classname,2] call _itemSpawner};
  1252. if (_type in [6,7]) then {[_classname,1] call _itemSpawner};
  1253. if (_type == 8) then {[_classname,4] call _itemSpawner};
  1254. if (_type == 9) then {[_classname,3] call _itemSpawner};
  1255. }forEach (_content select 0);
  1256.  
  1257. if (_target == _admin) then {
  1258. [format['Spawn: %1',_allClasses], 0] call "+_skn_server_adminLog+";
  1259. } else {
  1260. [format['Spawn Target: %1 (%2) %3', name _target, getPlayerUID _target, _allClasses], 0] call "+_skn_server_adminLog+";
  1261. };
  1262. };
  1263. if (_case == 666) then {
  1264. _playerObj = objectFromNetId (_content select 1);
  1265. _banID = 0;
  1266. 'epochserver' callExtension format['820|%1|"+_skn_banReason+" #%2',getPlayerUID _playerObj,_banID];
  1267. ['amb', format['%1 (%2): %3', name _playerObj, getPlayerUID _playerObj, _content select 0]] call EPOCH_fnc_server_hiveLog;
  1268. };
  1269. };");
  1270.  
  1271. _skn_admincode = compileFinal ("
  1272.  
  1273. waitUntil {(getPlayerUID player) != ''};
  1274. "+_skn_tg_sortOrder+" = 'Range';
  1275. "+_skn_tg_toggle+" = [];
  1276. "+_skn_tg_BanPlayer+" = objNull;
  1277. "+_skn_tg_delete+" = objNull;
  1278. "+_skn_tg_mapTeleport+" = false;
  1279. "+_skn_tg_old_esp+" = false;
  1280. "+_skn_tg_godMode+" = false;
  1281. "+_skn_tg_old_espMap+" = false;
  1282. "+_skn_tg_spawnTyp+" = 64;
  1283. "+_skn_tg_hideAdmin+" = false;
  1284. "+_skn_tg_infrontTP+" = false;
  1285.  
  1286. "+_skn_tg_map_player+" = false;
  1287. "+_skn_tg_map_corpse+" = false;
  1288. "+_skn_tg_map_loot+" = false;
  1289. "+_skn_mapLootArray+" = [];
  1290. "+_skn_tg_map_animals+" = false;
  1291. "+_skn_mapAnimalArray+" = [];
  1292. "+_skn_tg_map_vehicle+" = false;
  1293. "+_skn_tg_map_ai+" = false;
  1294. "+_skn_mapAIArray+" = [];
  1295. "+_skn_tg_map_trader+" = false;
  1296. "+_skn_tg_map_basebuilding+" = false;
  1297. "+_skn_mapBasesArray+" = [];
  1298.  
  1299. uiNamespace setVariable['ESP_mainMap', findDisplay 12 displayCtrl 51];
  1300. uiNamespace setVariable['ESP_adminMap', findDisplay -1337 displayCtrl 7];
  1301. (findDisplay 46) displayAddEventHandler ['KeyDown','_this call "+_skn_AdminKeyDown+"'];
  1302. ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ['MouseButtonDown', 'if (_this select 5) then {_this call "+_skn_mapTeleport+"}'];
  1303.  
  1304. {
  1305. (uiNamespace getVariable _x) ctrlRemoveAllEventHandlers 'Draw';
  1306. (uiNamespace getVariable _x) ctrlAddEventHandler['Draw',{
  1307. _getDmgColor = {
  1308. _dmg = damage _this;
  1309. [0,1,_dmg,1] call EPOCH_colorRange
  1310. };
  1311. _display = _this select 0;
  1312. if ("+_skn_tg_map_player+") then {
  1313. _size = (0.5/ctrlMapScale _display) max 20;
  1314. {
  1315. _display drawIcon [
  1316. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x, name _x
  1317. ];
  1318. }forEach (allPlayers select {alive _x});
  1319. };
  1320. if ("+_skn_tg_map_corpse+") then {
  1321. _size = (1/ctrlMapScale _display) max 20;
  1322. {
  1323. if (!isNull _x) then {
  1324. _color = [1,1,1,1];
  1325. _display drawIcon [
  1326. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _color, visiblePosition _x, _size, _size, getDir _x, typeOf _x
  1327. ];
  1328. };
  1329. }forEach allDeadMen;
  1330. };
  1331. if ("+_skn_tg_map_loot+") then {
  1332. {
  1333. if (!isNull _x) then {
  1334. _color = [1,1,1,1];
  1335. _display drawRectangle [
  1336. visiblePosition _x,
  1337. 5,
  1338. 5,
  1339. getDir _x,
  1340. [1,1,1,1],
  1341. '#(rgb,8,8,3)color(1,0,0,1)'
  1342. ];
  1343. };
  1344. }forEach "+_skn_mapLootArray+";
  1345. };
  1346. if ("+_skn_tg_map_animals+") then {
  1347. _size = (0.5/ctrlMapScale _display) max 20;
  1348. {
  1349. if (alive _x) then {
  1350. _display drawIcon [
  1351. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x,
  1352. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName')
  1353. ];
  1354. };
  1355. }forEach "+_skn_mapAnimalArray+";
  1356. };
  1357. if ("+_skn_tg_map_vehicle+") then {
  1358. _size = (1/ctrlMapScale _display) max 20;
  1359. {
  1360. if((_x isKindOf 'LandVehicle') || (_x isKindOf 'Ship') || (_x isKindOf 'Air') || (_x isKindOf 'Tank'))then{
  1361. if (alive _x) then {
  1362. _display drawIcon [
  1363. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x,
  1364. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName')
  1365. ];
  1366. };
  1367. };
  1368. }forEach vehicles;
  1369. };
  1370. if ("+_skn_tg_map_ai+") then {
  1371. _size = (0.5/ctrlMapScale _display) max 20;
  1372. {
  1373. if (alive _x) then {
  1374. _display drawIcon [
  1375. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x,
  1376. getText (configFile >> 'CfgVehicles' >> typeOf _x >> 'displayName')
  1377. ];
  1378. };
  1379. }forEach "+_skn_mapAIArray+";
  1380. };
  1381. if ("+_skn_tg_map_trader+") then {
  1382. _size = (0.5/ctrlMapScale _display) max 20;
  1383. {
  1384. _agent = agent _x;
  1385. _typeOf = typeOf _agent;
  1386. if!(_typeOf in ['Sheep_random_EPOCH','Goat_random_EPOCH','Snake_random_EPOCH','Snake2_random_EPOCH','Hen_random_EPOCH','Cock_random_EPOCH','Fin_random_EPOCH','Alsatian_random_EPOCH','Rabbit_EPOCH'])then{
  1387. _display drawIcon [
  1388. getText (configFile >> 'CfgVehicles' >> _typeOf >> 'Icon'), _agent call _getDmgColor, visiblePosition _agent, _size, _size, getDir _agent,
  1389. getText (configFile >> 'CfgVehicles' >> _typeOf >> 'displayName')
  1390. ];
  1391. };
  1392. }forEach agents;
  1393. };
  1394. if ("+_skn_tg_map_basebuilding+") then {
  1395. _size = (1/ctrlMapScale _display) max 20;
  1396. {
  1397. _display drawIcon [
  1398. getText (configFile >> 'CfgVehicles' >> 'PlotPole_Epoch' >> 'Icon'), _x call _getDmgColor, visiblePosition _x, _size, _size, getDir _x,
  1399. str(_x getVariable ['BUILD_OWNER', _owner])+' '+(getText (configFile >> 'CfgVehicles' >> 'PlotPole_Epoch' >> 'displayName'))
  1400. ];
  1401. }forEach "+_skn_mapBasesArray+";
  1402. };
  1403. if ("+_skn_tg_old_espMap+") then {
  1404. {
  1405. if !(isNull _x) then {
  1406. _pos = visiblePosition _x;
  1407. if (isPlayer _x) then {
  1408. _lastPos = _x getVariable['ESP_old_MAP', []];
  1409. _playerGrp = group _x;
  1410. _grpColorIndex = EPOCH_ESPGROUPS find _playerGrp;
  1411. if (_grpColorIndex == -1) then {
  1412. EPOCH_ESPGROUPCOLORS pushBack[random 1, random 1, random 1, 1];
  1413. _grpColorIndex = EPOCH_ESPGROUPS pushBack _playerGrp;
  1414. };
  1415. _color = EPOCH_ESPGROUPCOLORS select _grpColorIndex;
  1416. (_this select 0) drawIcon[getText(configFile >> 'CfgVehicles' >> typeOf(vehicle _x) >> 'Icon'), _color, _pos, 0.5 / ctrlMapScale(_this select 0), 0.5 / ctrlMapScale(_this select 0), getDir _x, name _x, 1, 0.05, 'PuristaMedium'];
  1417. if ((count _lastPos) >= 100) then {
  1418. for '_i' from 10 to 100 step 10 do {
  1419. _pos1 = _lastPos select(_i - 10);
  1420. _pos2 = _lastPos select _i;
  1421. if (!isNil '_pos1' && !isNil '_pos2') then {
  1422. (_this select 0) drawLine[_pos1, _pos2, [1, 0, 0, 1]];
  1423. };
  1424. };
  1425. };
  1426. };
  1427. };
  1428. }forEach EPOCH_ESPMAP_TARGETS;
  1429. };
  1430. }];
  1431. }forEach ['ESP_mainMap','ESP_adminMap'];
  1432. "+_skn_adminRequest_PVC+" = {
  1433. _this pushBack player;
  1434. _this pushBack Epoch_personalToken;
  1435. "+_skn_doAdminRequest+" = _this;
  1436. publicVariableServer '"+_skn_doAdminRequest+"';
  1437. };
  1438. "+_skn_adminLog_PVC+" = {
  1439. _this pushBack player;
  1440. _this pushBack Epoch_personalToken;
  1441. "+_skn_doAdminLog+" = _this;
  1442. publicVariableServer '"+_skn_doAdminLog+"';
  1443. };
  1444. "+_skn_AdminKeyDown+" = {
  1445. _keyDown = _this select 1;
  1446. if (_keyDown == "+str _skn_adminMenuMenuKey+") then {call "+_skn_AdminMenu_Init+"};
  1447. if (_keyDown == 0x3C) then {if (cameraOn != vehicle player) then { vehicle player switchCamera 'External' } };
  1448. if (_keyDown == "+str _skn_adminMenuInfrontTeleport+") then {call "+_skn_infrontTP+"};
  1449. if (_keyDown == 0x3F) then {call "+_skn_delete+"};
  1450. if (_keyDown == "+str _skn_adminMenuUnlock+") then {call "+_skn_unlock+"};
  1451. };
  1452. "+_skn_AdminMenu_Init+" = {
  1453. disableSerialization;
  1454. _hours = floor(servertime/60/60);
  1455. _minutes = round((serverTime/60)-(_hours*60));
  1456.  
  1457. if (!dialog) then {createDialog 'Skaronator_AdminMenu';
  1458. {(_x call "+_skn_getCtrl+") ctrlShow false}forEach[40,41,4101,42,43,50,51,52,60,6000,61,62,63,64,65,66,67,68,69,70,71] };
  1459. if (getPlayerUID player in "+str _skn_blockedSpawnMenuUID+") then {ctrlEnable [21,false]};
  1460. ctrlEnable [22,false];
  1461. (1 call "+_skn_getCtrl+") ctrlSetText format['Players %1 of %2',count allPlayers,playersNumber civilian];
  1462. (2 call "+_skn_getCtrl+") ctrlSetText format['Epoch Mod Admin Menu by Skaronator.com - Server Uptime: %1h %2min', _hours, _minutes];
  1463. (5 call "+_skn_getCtrl+") ctrlSetEventHandler ['LBDblClick', '_this call "+_skn_fnc_Spec+"'];
  1464. (6 call "+_skn_getCtrl+") ctrlSetEventHandler ['LBDblClick', '_this call "+_skn_dbClickMainMenu+"'];
  1465. (7 call "+_skn_getCtrl+") ctrlSetEventHandler ['MouseButtonDown', 'if (_this select 5) then {_this call "+_skn_mapTeleport+"}'];
  1466. if (call "+_skn_removespawnMenu+") then {uiSleep 0.4};
  1467.  
  1468. call "+_skn_Update_AdminButtons+";
  1469. _menu = call "+_skn_mainMenuCfg+";
  1470. _menu call "+_skn_FillMainMenu+";
  1471. call "+_skn_FillPlayerMenu+";
  1472. 0 call "+_skn_switchMainMenu+";
  1473. };
  1474. "+_skn_hideAdmin+" = {
  1475. "+_skn_tg_hideAdmin+" = !"+_skn_tg_hideAdmin+";
  1476. [106, "+_skn_tg_hideAdmin+"] call "+_skn_adminRequest_PVC+";
  1477. };
  1478. "+_skn_esp+" = {
  1479. _enable = false;
  1480. if (_this) then {
  1481. EPOCH_ESP_PLAYER = !EPOCH_ESP_PLAYER;
  1482. if (EPOCH_ESP_PLAYER) then {
  1483. ['Player ESP',2] call "+_skn_adminLog_PVC+";
  1484. _enable = true
  1485. } else {
  1486. ['Player ESP',1] call "+_skn_adminLog_PVC+";
  1487. }
  1488. } else {
  1489. EPOCH_ESP_VEHICLES = !EPOCH_ESP_VEHICLES;
  1490. if (EPOCH_ESP_VEHICLES) then {
  1491. ['Vehicle ESP',2] call "+_skn_adminLog_PVC+";
  1492. _enable = true
  1493. } else {
  1494. ['Vehicle ESP',1] call "+_skn_adminLog_PVC+";
  1495. }
  1496. };
  1497.  
  1498. if (EPOCH_ESP_VEHICLEPLAYER isEqualTo [] && _enable) then {
  1499. waitUntil {
  1500. EPOCH_ESP_VEHICLEPLAYER = (cameraOn nearEntities [['Epoch_Male_F', 'Epoch_Female_F', 'LandVehicle', 'Ship', 'Air', 'Tank'], viewDistance max 1000 min 2500]) - [vehicle player];
  1501. uiSleep 1;
  1502. !EPOCH_ESP_PLAYER && !EPOCH_ESP_VEHICLES
  1503. };
  1504. EPOCH_ESP_VEHICLEPLAYER = [];
  1505. };
  1506. };
  1507. "+_skn_godMode+" = {
  1508. "+_skn_tg_godMode+" = !"+_skn_tg_godMode+";
  1509. if ("+_skn_tg_godMode+") then {
  1510. ['God Mode',2] call "+_skn_adminLog_PVC+";
  1511. EPOCH_GMODE = true;
  1512. waitUntil {
  1513. player setBleedingRemaining 0;
  1514. player setOxygenRemaining 1;
  1515. player allowDamage false;
  1516. uiSleep 0.25;
  1517. !"+_skn_tg_godMode+"
  1518. };
  1519. player allowDamage true;
  1520. EPOCH_GMODE = nil;
  1521. } else {
  1522. ['God Mode',1] call "+_skn_adminLog_PVC+";
  1523. }
  1524. };
  1525. "+_skn_repairVehicle+" = {
  1526. "+_skn_systemDebug5+"
  1527. _veh = objNull;
  1528. if (_this isEqualTo []) then {
  1529. if (vehicle player == player) then {
  1530. _veh = cursorTarget
  1531. } else {
  1532. _veh = vehicle player
  1533. }
  1534. } else {
  1535. _player = objectfromnetId (_this select 1);
  1536. if (vehicle _player != _player) then {
  1537. _veh = vehicle _player
  1538. }
  1539. };
  1540. "+_skn_systemDebug4+"
  1541. if (!isNull _veh) then {
  1542. if ((_veh isKindOf 'LandVehicle') || (_veh isKindOf 'Air') || (_veh isKindOf 'Ship') || (_veh isKindOf 'Tank')) then {
  1543. [108,_veh] call "+_skn_adminRequest_PVC+";
  1544. "+_skn_systemDebug3+"
  1545. }
  1546. }
  1547. };
  1548. "+_skn_spawnLoot+" = {
  1549. _masterConfig = 'CfgBuildingLootPos' call EPOCH_returnConfig;
  1550. _lootClasses = [];
  1551. _lootClassesIgnore = ['Default'];
  1552. '_cN = configName _x;if !(_cN in _lootClassesIgnore)then{_lootClasses pushBack _cN}; true' configClasses _masterConfig;
  1553. _cntBuildings = 0;
  1554. {
  1555. if (_x call EPOCH_spawnLoot) then {
  1556. _cntBuildings = _cntBuildings + 1;
  1557. };
  1558. }forEach (nearestObjects[player, _lootClasses, _this]);
  1559. [format['Looting %2 Buildings within (%1)m',_this,_cntBuildings],0] call "+_skn_adminLog_PVC+";
  1560. hint format['Spawned Loot for %1 Buildings',_cntBuildings];
  1561. };
  1562. "+_skn_old_esp+" = {
  1563. "+_skn_tg_old_esp+" = !"+_skn_tg_old_esp+";
  1564. if ("+_skn_tg_old_esp+") then {
  1565. ['ESP Old',2] call "+_skn_adminLog_PVC+";
  1566. waitUntil{
  1567. EPOCH_ESP_TARGETS = (cameraOn nearEntities[['Epoch_Male_F', 'Epoch_Female_F', 'LandVehicle', 'Ship', 'Air', 'Tank'], 1000]) - [vehicle player];
  1568. uiSleep 1;
  1569. !"+_skn_tg_old_esp+"
  1570. };
  1571. } else {
  1572. ['ESP Old',1] call "+_skn_adminLog_PVC+";
  1573. EPOCH_ESP_TARGETS = [];
  1574. };
  1575. };
  1576. "+_skn_old_espMap+" = {
  1577. "+_skn_tg_old_espMap+" = !"+_skn_tg_old_espMap+";
  1578. if ("+_skn_tg_old_espMap+") then {
  1579. ['ESP-map Old', 2] call "+_skn_adminLog_PVC+";
  1580. waitUntil{
  1581. uiSleep 1;
  1582. EPOCH_ESPMAP_TARGETS = (cameraOn nearEntities[['CAManBase', 'LandVehicle', 'Ship', 'Air', 'Tank'], 10000]) - [player, vehicle player];
  1583. {
  1584. if (isPlayer _x) then {
  1585. _pos = visiblePosition _x;
  1586. _lastPos = _x getVariable['ESP_old_MAP', []];
  1587. _lastPos pushBack _pos;
  1588. if (count _lastPos > 101) then {
  1589. _lastPos deleteAt 0;
  1590. };
  1591. _x setVariable['ESP_old_MAP', _lastPos];
  1592. };
  1593. }forEach EPOCH_ESPMAP_TARGETS;
  1594. !"+_skn_tg_old_espMap+"
  1595. };
  1596. } else {
  1597. ['ESP-map Old', 1] call "+_skn_adminLog_PVC+";
  1598. EPOCH_ESPMAP_TARGETS = [];
  1599. };
  1600. };
  1601. "+_skn_getCtrl+" = compileFinal '(findDisplay -1337) displayCtrl _this';
  1602. "+_skn_Update_AdminButtons+" = {
  1603. disableSerialization;
  1604.  
  1605. {((_x select 0) call "+_skn_getCtrl+") ctrlSetText (_x select 1)}forEach
  1606. [
  1607. [23,format['Hacker Log (%1)',count "+_skn_pv_hackerLog+"]],
  1608. [24,format['Admin Log (%1)',count "+_skn_pv_adminLog+"]]
  1609. ];
  1610. };
  1611. "+_skn_mapTeleport+" = {
  1612. if ("+_skn_tg_mapTeleport+") then {
  1613. _pos = (_this select 0) posScreenToWorld [_this select 2, _this select 3];
  1614. if (vehicle player == player) then {
  1615. if (surfaceIsWater _pos) then [{vehicle player setPosASL _pos},{vehicle player setPosATL _pos}];
  1616. } else {
  1617. [109,_pos] call "+_skn_adminRequest_PVC+";
  1618. };
  1619. if (!dialog) then {openMap [false, false]};
  1620. };
  1621. };
  1622. "+_skn_deleteNow+" = {
  1623. if (!isNull "+_skn_tg_delete+") then {
  1624. if (!isPlayer "+_skn_tg_delete+") then {
  1625. [104,"+_skn_tg_delete+"] call "+_skn_adminRequest_PVC+";
  1626. };
  1627. };
  1628. "+_skn_tg_delete+" = objNull;
  1629. };
  1630. "+_skn_delete+" = {
  1631. if (!isNull cursorTarget) then {
  1632. if ("+_skn_tg_delete+" isEqualto cursorTarget) then {
  1633. call "+_skn_deleteNow+";
  1634. }
  1635. else {
  1636. "+_skn_tg_delete+" = cursorTarget;
  1637. hintSilent parsetext format ['Delete %1?<br/>Press again to confirm!',typeof "+_skn_tg_delete+"];
  1638. systemchat format ['Delete %1? Press again to confirm!',typeof "+_skn_tg_delete+"];
  1639. };
  1640. };
  1641. };
  1642. "+_skn_fnc_Spec+" = {
  1643. _player = objectFromNetId (_this select 0 lbData (_this select 1));
  1644. if (isNull _player) exitWith {};
  1645. if (!isPlayer _player) exitWith {};
  1646. cutText ['F2 To Cancel!','PLAIN DOWN',1];
  1647. vehicle _player switchCamera 'External';
  1648. };
  1649. "+_skn_mainMenuCfg+" = {"+_skn_adminMenuLow+"};
  1650. if (getPlayerUID player in "+str _skn_adminsOwner+") then {
  1651. "+_skn_mainMenuCfg+" = {"+_skn_adminMenuOwner+"};
  1652. };
  1653. if (getPlayerUID player in "+str _skn_adminsHigh+") then {
  1654. "+_skn_mainMenuCfg+" = {"+_skn_adminMenuHigh+"};
  1655. };
  1656. "+_skn_freeCam+" = {
  1657. _getPos = player modelToWorld[0, -1.5, 1.75];
  1658. _cam = 'camera' camCreate _getPos;
  1659. _cam setDir (_getPos getDir player);
  1660. _cam camCommand 'MANUAL ON';
  1661. _cam camCommand 'INERTIA OFF';
  1662. _cam cameraEffect['INTERNAL', 'BACK'];
  1663. showCinemaBorder false;
  1664. cutText['Right Click To Cancel!', 'PLAIN DOWN', 1];
  1665. };
  1666. "+_skn_FillMainMenu+" = {
  1667. lbClear (8 call "+_skn_getCtrl+");
  1668. _ctrl = 6 call "+_skn_getCtrl+";
  1669. lbClear _ctrl;
  1670. for '_i' from 0 to count _menu -1 do {
  1671. _item = _menu select _i;
  1672.  
  1673. _titleoption = _item select 3;
  1674. _color = _item select 4;
  1675.  
  1676. _index = _ctrl lbAdd format['%1',_item select 0];
  1677. if (count _color == 0) then {
  1678. _color = [1, 1, 1, 1];
  1679. if (_titleoption == '1') then {_color = [0.42,0.64,0.88,1]};
  1680. if (_titleoption == '3') then {_color = [0.27,0.39,0.53,1]};
  1681. };
  1682.  
  1683. if (_titleoption == '2') then {
  1684. _color = if (_index in "+_skn_tg_toggle+") then [{[0.17,1,0,1]},{[0.51,0.51,0.51,1]}];
  1685. };
  1686.  
  1687. _ctrl lbSetColor [_i,_color];
  1688. _ctrl lbSetData [_i,str [_item select 1,_item select 2,_titleoption]];
  1689. };
  1690. };
  1691. "+_skn_switchMainMenu+" = {
  1692. disableSerialization;
  1693.  
  1694. _main = 6 call "+_skn_getCtrl+";
  1695. _map = 7 call "+_skn_getCtrl+";
  1696. _table = 8 call "+_skn_getCtrl+";
  1697. if (_this == 0) then {
  1698. _main ctrlSetPosition [0.293698 * safezoneW + safezoneX,0.2888 * safezoneH + safezoneY,0.206297 * safezoneW,0.4862 * safezoneH];
  1699. _map ctrlSetPosition [0.501031 * safezoneW + safezoneX,0.28836 * safezoneH + safezoneY,0.205265 * safezoneW,0.486548 * safezoneH];
  1700. _table ctrlShow false;
  1701. _table ctrlSetPosition [0.293698 * safezoneW + safezoneX,0.2888 * safezoneH + safezoneY,0.206297 * safezoneW,0.4862 * safezoneH];
  1702. _table ctrlCommit 0;
  1703. _main ctrlSetFade 0;
  1704. _map ctrlShow true;
  1705. };
  1706. if (_this in [1,2]) then {
  1707. {(_x call "+_skn_getCtrl+") ctrlShow false}forEach[30,31,32,33,34];
  1708.  
  1709. _main ctrlSetPosition [0.293698 * safezoneW + safezoneX,0.2888 * safezoneH + safezoneY,0.412598 * safezoneW,0.4862 * safezoneH];
  1710. _map ctrlSetPosition [0.709388 * safezoneW + safezoneX,0.28836 * safezoneH + safezoneY,-0.00312413 * safezoneW,0.486548 * safezoneH];
  1711. _main ctrlSetFade 0;
  1712. if (_this == 2) then {
  1713. _main ctrlcommit 0;
  1714. _main ctrlSetFade 1;
  1715. };
  1716. };
  1717. _main ctrlCommit 0.8;
  1718. _map ctrlCommit 0.8;
  1719. };
  1720. "+_skn_dbClickMainMenu+" = {
  1721. _currentSelect = _this select 1;
  1722. _data = call compile (_this select 0 lbData _currentSelect);
  1723. _tO = _data select 2;
  1724.  
  1725. if (_tO == '1') exitWith {};
  1726. if (_tO == '2') exitWith {
  1727. (_data select 0) spawn (_data select 1);
  1728. if (_currentSelect in "+_skn_tg_toggle+") then {
  1729. lbSetColor [6,_currentSelect,[0.51,0.51,0.51,1]];
  1730. "+_skn_tg_toggle+" = "+_skn_tg_toggle+" - [_currentSelect];
  1731. } else {
  1732. lbSetColor [6,_currentSelect,[0.165,1,0,1]];
  1733. "+_skn_tg_toggle+" pushBack _currentSelect;
  1734. };
  1735. };
  1736. if (_tO == '4') exitWith {
  1737. if ((lbCurSel 5) >= 0) then {
  1738. [_text,lbData [5, lbCurSel 5],(_data select 0)] spawn (_data select 1);
  1739. };
  1740. };
  1741. if ((_data select 1) isEqualType {}) then {(_data select 0) spawn (_data select 1)};
  1742. };
  1743. Skaronator_fnc_handleButton = compileFinal ('
  1744. disableSerialization;
  1745. _idc = ctrlIDC (_this select 0);
  1746. if (_idc == 10) then { "+_skn_tg_sortOrder+" = ''Range''; call "+_skn_FillPlayerMenu+"};
  1747. if (_idc == 11) then { "+_skn_tg_sortOrder+" = ''Alphabetically''; call "+_skn_FillPlayerMenu+"};
  1748.  
  1749. if (_idc == 20) then {call "+_skn_AdminMenu_Init+"};
  1750. if (_idc == 21) then {call "+_skn_spawnMenu+"};
  1751.  
  1752. if (_idc == 23) then {call "+_skn_hackerLog+"};
  1753. if (_idc == 24) then {call "+_skn_adminLog+"};
  1754.  
  1755. if (_idc == 32) then {true call "+_skn_doBan+"};
  1756. if (_idc == 33) then {false call "+_skn_doBan+"};
  1757.  
  1758. if (_idc == 50) then {lbClear 43;"+_skn_tg_limitSpawn+" = [true,true,true,true,true,true,true,true,true,true,true]};
  1759. if (_idc == 51) then {true call "+_skn_spawnSpawnMenu+"};
  1760. if (_idc == 52) then {false call "+_skn_spawnSpawnMenu+"};
  1761. if (_idc in [6000,61,62,63,64,65,66,67,68,69,70,71]) then {
  1762. "+_skn_tg_spawnTyp+" = _idc;
  1763. _idc call "+_skn_fillSpawnMenu+";
  1764. };
  1765. if (_idc == 4101) then {_idc call "+_skn_fillSpawnMenu+"};
  1766. ');
  1767. "+_skn_spawnSpawnMenu+" = {
  1768. _target = objNull;
  1769. if (_this) then {
  1770. if ((lbCurSel 5) >= 0) then {
  1771. _target = objectFromNetId (lbData [5, lbCurSel 5]);
  1772. };
  1773. } else {
  1774. _target = player;
  1775. };
  1776. if (isNull _target) exitWith {};
  1777. _ctrl = 43 call "+_skn_getCtrl+";
  1778. _spawn = [];
  1779. for '_i' from 0 to (lbSize _ctrl)-1 do {
  1780. _data = call compile (_ctrl lbData _i);
  1781. _spawn pushBack [_data select 0, _data select 2];
  1782. };
  1783. lbClear _ctrl;
  1784. "+_skn_tg_limitSpawn+" = [true,true,true,true,true,true,true,true,true,true,true];
  1785. "+_skn_systemDebug2+"
  1786. [555,[_spawn,netId _target]] call "+_skn_adminRequest_PVC+";
  1787. };
  1788. "+_skn_spawnMenu+" = {
  1789. false call "+_skn_doBan+";
  1790. if (!isNull "+_skn_tg_BanPlayer+") then {uiSleep 0.8;false spawn "+_skn_switchTable+"};
  1791. 2 call "+_skn_switchMainMenu+";
  1792. lbclear (6 call "+_skn_getCtrl+");
  1793. _table = 8 call "+_skn_getCtrl+";
  1794. lbclear _table;
  1795. _table ctrlShow false;
  1796. "+_skn_tg_limitSpawn+" = [true,true,true,true,true,true,true,true,true,true,true];
  1797. comment '[primaryWeapon,secondaryWeapon,launcher,backpack,map,rangefinderSlot,vehicleSlot]';
  1798. (41 call "+_skn_getCtrl+") ctrlSetEventHandler ['LBDblClick', ""
  1799. _ctrl = _this select 0;
  1800. _currentSelect = _this select 1;
  1801. _type = call compile (_ctrl lbData _currentSelect) select 1;
  1802. _allowed = true;
  1803. if (_type != -1) then {
  1804. _allowed = "+_skn_tg_limitSpawn+" select _type;
  1805. "+_skn_tg_limitSpawn+" set [_type,false];
  1806. };
  1807. "+_skn_systemDebug1+"
  1808. if (_allowed) then {
  1809. _otherList = 43 call "+_skn_getCtrl+";
  1810. _index = _otherList lbAdd format ['%1',_ctrl lbText _currentSelect];
  1811. _otherList lbSetData [_index, _ctrl lbData _currentSelect];
  1812. _otherList lbSetPicture [_index,_ctrl lbPicture _currentSelect];
  1813. } else {
  1814. hint 'You can just select one Weapon/Item of this Type!';
  1815. };
  1816. ""];
  1817.  
  1818. (43 call "+_skn_getCtrl+") ctrlSetEventHandler ['LBDblClick', '
  1819. _ctrl = _this select 0;
  1820. _currentSelect = _this select 1;
  1821. _type = call compile (_ctrl lbData _currentSelect) select 1;
  1822. if (_type != -1) then {
  1823. "+_skn_tg_limitSpawn+" set [_type,true];
  1824. };
  1825. _ctrl lbDelete _currentSelect;
  1826. '];
  1827.  
  1828. {_i = _x call "+_skn_getCtrl+";_i ctrlShow true;_i ctrlSetFade 1;_i ctrlcommit 0;_i ctrlSetFade 0;_i ctrlcommit 0.8}forEach[40,41,4101,42,43,50,51,52,60,6000,61,62,63,64,65,66,67,68,69,70,71];
  1829. "+_skn_tg_spawnTyp+" call "+_skn_fillSpawnMenu+";
  1830. };
  1831. "+_skn_removespawnMenu+" = {
  1832. if (ctrlShown (40 call "+_skn_getCtrl+")) then {
  1833. {_i = _x call "+_skn_getCtrl+";_i ctrlShow true;_i ctrlSetFade 1;_i ctrlcommit 0.8}forEach[40,41,4101,42,43,50,51,52,60,6000,61,62,63,64,65,66,67,68,69,70,71];
  1834. [] spawn {uiSleep 0.8;{_x call "+_skn_getCtrl+" ctrlShow false}forEach[40,41,4101,42,43,50,51,52,60,6000,61,62,63,64,65,66,67,68,69,70,71]};
  1835. true
  1836. } else {false};
  1837. };
  1838. _cfgPricing = 'CfgPricing' call EPOCH_returnConfig;
  1839. skn_airVehicles = [];
  1840. skn_landVehicles = [];
  1841. skn_shipVehicles = [];
  1842. skn_weapons = [];
  1843. skn_magazines = [];
  1844. skn_items = [];
  1845. skn_backpacks = [];
  1846. skn_uniforms = [];
  1847. skn_attachments = [];
  1848. skn_headgear = [];
  1849. skn_vests = [];
  1850. {
  1851. if (getText(_x >> 'displayName') != '' && {getText(_x >> 'picture') != ''} && {isClass(_cfgPricing >> configName _x)}) then {
  1852. if ((configName _x) iskindof 'AIR') exitwith {
  1853. if (getNumber(_x >> 'type') != 0) then {
  1854. skn_airVehicles pushback (configName _x);
  1855. };
  1856. };
  1857. if ((configName _x) iskindof 'LandVehicle') exitwith {
  1858. if (configName _x != 'PaperCar') then {
  1859. skn_landVehicles pushback (configName _x);
  1860. };
  1861. };
  1862. if ((configName _x) iskindof 'SHIP') exitwith {
  1863. if (getNumber(_x >> 'type') in [1,2,3,4]) then {
  1864. skn_shipVehicles pushback (configName _x);
  1865. };
  1866. };
  1867. if (getNumber(_x >> 'isbackpack') == 1) exitwith {
  1868. skn_backpacks pushback (configName _x);
  1869. };
  1870. };
  1871. } foreach ('true' configClasses (configFile >> 'CfgVehicles'));
  1872. {
  1873. if (getText(_x >> 'displayName') != '' && {getText(_x >> 'picture') != ''} && {getNumber(_x >> 'scope') in [1,2]} && {isClass(_cfgPricing >> configName _x)}) then {
  1874. if (getNumber(_x >> 'type') in [1,2,4]) exitwith {
  1875. skn_weapons pushback (configName _x);
  1876. };
  1877. if (getNumber(_x >> 'ItemInfo' >> 'type') in [801]) exitwith {
  1878. skn_uniforms pushback (configName _x);
  1879. };
  1880. if (((configName _x) call BIS_fnc_itemType) select 0 in ['Item']) exitwith {
  1881. skn_attachments pushback (configName _x);
  1882. };
  1883. if (((configName _x) call BIS_fnc_itemType) select 1 in ['Headgear']) exitwith {
  1884. skn_headgear pushback (configName _x);
  1885. };
  1886. if (((configName _x) call BIS_fnc_itemType) select 1 in ['Vest']) exitwith {
  1887. skn_vests pushback (configName _x);
  1888. };
  1889. };
  1890. } foreach ('true' configClasses (configFile >> 'CfgWeapons'));
  1891. {
  1892. if (getText(_x >> 'displayName') != '' && {getText(_x >> 'picture') != ''} && {getNumber(_x >> 'scope') in [1,2]} && {isClass(_cfgPricing >> configName _x)}) then {
  1893. if (getText(_x >> 'ammo') != '') then {
  1894. skn_magazines pushback (configName _x);
  1895. }
  1896. else {
  1897. skn_items pushback (configName _x);
  1898. };
  1899. };
  1900. } foreach ('true' configClasses (configFile >> 'CfgMagazines'));
  1901.  
  1902. "+_skn_fillSpawnMenu+" = {
  1903. _ctrl = 41 call "+_skn_getCtrl+";
  1904. lbclear _ctrl;
  1905. if !(_this isequalto 4101) then {
  1906. _button = _this call "+_skn_getCtrl+";
  1907. _button ctrlSetTextColor [1, 0, 0, 1];
  1908. {_x call "+_skn_getCtrl+" ctrlSetTextColor [1, 1, 1, 1]}forEach([6000,61,62,63,64,65,66,67,68,69,70,71]-[_this]);
  1909. };
  1910. _searchtxt = tolower (ctrlText((findDisplay -1337) displayCtrl 4101));
  1911. if ("+_skn_tg_spawnTyp+" == 61 || "+_skn_tg_spawnTyp+" == 6000) then {
  1912. {
  1913. _configfilex = (configFile >> 'CfgVehicles' >> _x);
  1914. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1915. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1916. _ctrl lbSetData[_index, str[_x, 6, 0]];
  1917. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1918. };
  1919. } foreach skn_airVehicles;
  1920. };
  1921. if ("+_skn_tg_spawnTyp+" == 62 || "+_skn_tg_spawnTyp+" == 6000) then {
  1922. {
  1923. _configfilex = (configFile >> 'CfgVehicles' >> _x);
  1924. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1925. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1926. _ctrl lbSetData[_index, str[_x, 6, 1]];
  1927. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1928. };
  1929. } foreach skn_landVehicles;
  1930. };
  1931. if ("+_skn_tg_spawnTyp+" == 63 || "+_skn_tg_spawnTyp+" == 6000) then {
  1932. {
  1933. _configfilex = (configFile >> 'CfgVehicles' >> _x);
  1934. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1935. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1936. _ctrl lbSetData[_index, str[_x, 6, 2]];
  1937. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1938. };
  1939. } foreach skn_shipVehicles;
  1940. };
  1941. if ("+_skn_tg_spawnTyp+" == 64 || "+_skn_tg_spawnTyp+" == 6000) then {
  1942. {
  1943. _configfilex = (configFile >> 'CfgWeapons' >> _x);
  1944. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1945. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1946. _type = getNumber(_configfilex >> 'type') - 1;
  1947. if (getNumber(_configfilex >> 'type') == 4) then { _type = 2 };
  1948. _ctrl lbSetData[_index, str[_x, _type, _type + 3]];
  1949. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1950. };
  1951. } foreach skn_weapons;
  1952. };
  1953. if ("+_skn_tg_spawnTyp+" == 65 || "+_skn_tg_spawnTyp+" == 6000) then {
  1954. {
  1955. _configfilex = (configFile >> 'CfgMagazines' >> _x);
  1956. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1957. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1958. _ctrl lbSetData[_index, str[_x, -1, 6]];
  1959. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1960. };
  1961. } foreach skn_magazines;
  1962. };
  1963. if ("+_skn_tg_spawnTyp+" == 66 || "+_skn_tg_spawnTyp+" == 6000) then {
  1964. {
  1965. _configfilex = (configFile >> 'CfgMagazines' >> _x);
  1966. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1967. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1968. _ctrl lbSetData[_index, str[_x, -1, 7]];
  1969. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1970. };
  1971. } foreach skn_items;
  1972. };
  1973. if ("+_skn_tg_spawnTyp+" == 67 || "+_skn_tg_spawnTyp+" == 6000) then {
  1974. {
  1975. _configfilex = (configFile >> 'CfgVehicles' >> _x);
  1976. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1977. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1978. _ctrl lbSetData[_index, str[_x, 3, 8]];
  1979. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1980. };
  1981. } foreach skn_backpacks;
  1982. };
  1983. if ("+_skn_tg_spawnTyp+" == 68 || "+_skn_tg_spawnTyp+" == 6000) then {
  1984. {
  1985. _configfilex = (configFile >> 'CfgWeapons' >> _x);
  1986. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1987. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1988. _ctrl lbSetData[_index, str[_x, -1, 9]];
  1989. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  1990. };
  1991. } foreach skn_uniforms;
  1992. };
  1993. if ("+_skn_tg_spawnTyp+" == 69 || "+_skn_tg_spawnTyp+" == 6000) then {
  1994. {
  1995. _configfilex = (configFile >> 'CfgWeapons' >> _x);
  1996. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  1997. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  1998. _ctrl lbSetData[_index, str[_x, -1, 9]];
  1999. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  2000. };
  2001. } foreach skn_attachments;
  2002. };
  2003. if ("+_skn_tg_spawnTyp+" == 70 || "+_skn_tg_spawnTyp+" == 6000) then {
  2004. {
  2005. _configfilex = (configFile >> 'CfgWeapons' >> _x);
  2006. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  2007. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  2008. _ctrl lbSetData[_index, str[_x, -1, 9]];
  2009. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  2010. };
  2011. } foreach skn_headgear;
  2012. };
  2013. if ("+_skn_tg_spawnTyp+" == 71 || "+_skn_tg_spawnTyp+" == 6000) then {
  2014. {
  2015. _configfilex = (configFile >> 'CfgWeapons' >> _x);
  2016. if (((tolower _x) find _searchtxt > -1 || tolower (getText(_configfilex >> 'displayName')) find _searchtxt > -1)) then {
  2017. _index = _ctrl lbAdd format['%1', getText(_configfilex >> 'displayName')];
  2018. _ctrl lbSetData[_index, str[_x, -1, 9]];
  2019. _ctrl lbSetPicture[_index, getText(_configfilex >> 'picture')];
  2020. };
  2021. } foreach skn_vests;
  2022. };
  2023. };
  2024. "+_skn_FillPlayerMenu+" = {
  2025. _ctrl = 5 call "+_skn_getCtrl+";
  2026. lbclear _ctrl;
  2027.  
  2028. _sorted = [];
  2029. _unsorted = allPlayers;
  2030.  
  2031. _buttonRange = 10 call "+_skn_getCtrl+";
  2032. _buttonRange ctrlSetText 'Range';
  2033. _buttonAlphabetically = 11 call "+_skn_getCtrl+";
  2034. _buttonAlphabetically ctrlSetText 'Alphabet';
  2035.  
  2036. if ("+_skn_tg_sortOrder+" == 'Range') then {
  2037. _pos = getPosATL vehicle player;
  2038. {
  2039. _temp = _x;
  2040. {
  2041. if ((getPosATL _x distance _pos) < (getPosATL _temp distance _pos)) exitWith {
  2042. _unsorted = _unsorted - [_x];
  2043. _sorted pushBack _x;
  2044. _temp = _x;
  2045. };
  2046. }forEach _unsorted;
  2047. }forEach _unsorted;
  2048. _buttonRange ctrlSetTextColor [1, 0, 0, 1];
  2049. _buttonAlphabetically ctrlSetTextColor [1, 1, 1, 1];
  2050. };
  2051. if ("+_skn_tg_sortOrder+" == 'Alphabetically') then {
  2052. _unsortedName = [];
  2053. {
  2054. _unsortedName pushBack (name _x);
  2055. }forEach _unsorted;
  2056. _alphabetically = _unsortedName;
  2057. _alphabetically sort true;
  2058. {
  2059. {
  2060. if (name _x == (_alphabetically select 0)) exitWith {
  2061. _alphabetically = _alphabetically - [_alphabetically select 0];
  2062. _unsorted = _unsorted - [_x];
  2063. _sorted pushBack _x;
  2064. };
  2065. }forEach _unsorted;
  2066. }forEach _unsorted;
  2067.  
  2068. _buttonAlphabetically ctrlSetTextColor [1, 0, 0, 1];
  2069. _buttonRange ctrlSetTextColor [1, 1, 1, 1];
  2070. };
  2071. if (_sorted isEqualTo []) then {_sorted = [player]};
  2072. _skn_fnc_addPlayerToList = {
  2073. _player = _this select 0;
  2074. _index = _ctrl lbAdd format ['%1', name _player];
  2075. _ctrl lbSetData [_index, netId _player];
  2076. _ctrl lbSetColor [_index, _this select 1];
  2077. if (vehicle _player == _player) then {
  2078. _pic = '';
  2079. if (currentWeapon _player != '') then {
  2080. _pic = getText(configFile >> 'CfgWeapons' >> currentweapon _player >> 'picture')
  2081. } else {
  2082. if (primaryWeapon _player == '') then {
  2083. _pic = getText(configFile >> 'CfgVehicles' >> typeof vehicle _player >> 'picture')
  2084. } else {
  2085. _pic = getText(configFile >> 'CfgWeapons' >> primaryweapon _player >> 'picture')
  2086. };
  2087. };
  2088. _ctrl lbSetPicture [_index,_pic];
  2089. } else {
  2090. _ctrl lbSetPicture [_index,getText(configFile >> 'CfgVehicles' >> typeof vehicle _player >> 'picture')];
  2091. };
  2092. };
  2093.  
  2094. _ctrl lbAdd ' Admins';
  2095. _ctrl lbSetColor [(lbsize _ctrl)-1, [0,0.6,1,1]];
  2096. {
  2097. if (getPlayerUID _x in "+str _skn_adminUIDArray+") then {_sorted = _sorted - [_x];[_x,[0,1,0,1]] call _skn_fnc_addPlayerToList};
  2098. }forEach _sorted;
  2099. _ctrl lbAdd '';
  2100. _ctrl lbAdd ' Normal Player';
  2101. _ctrl lbSetColor [(lbsize _ctrl)-1, [1,1,1,1]];
  2102.  
  2103. {
  2104. if (vehicle _x == _x) then {_sorted = _sorted - [_x];[_x,[0,1,0,1]] call _skn_fnc_addPlayerToList};
  2105. }forEach _sorted;
  2106. _ctrl lbAdd '';
  2107. _ctrl lbAdd ' Vehicle Player';
  2108. _ctrl lbSetColor [(lbsize _ctrl)-1, [1,1,1,1]];
  2109.  
  2110. {[_x,[0,1,0,1]] call _skn_fnc_addPlayerToList}forEach _sorted;
  2111. _ctrl lbAdd '';_ctrl lbAdd '';
  2112. };
  2113. "+_skn_switchTable+" = {
  2114. disableSerialization;
  2115. _map = 7 call "+_skn_getCtrl+";
  2116. _table = 8 call "+_skn_getCtrl+";
  2117.  
  2118. if ((ctrlPosition _table) isEqualTo [0.293698 * safezoneW + safezoneX,0.2888 * safezoneH + safezoneY,0.206297 * safezoneW,0.4862 * safezoneH]) then {
  2119. _table ctrlSetPosition [0.293698 * safezoneW + safezoneX,0.2888 * safezoneH + safezoneY,0.206297 * safezoneW,0.4862 * safezoneH];
  2120. _table ctrlCommit 0;
  2121.  
  2122.  
  2123. _table ctrlSetEventHandler ['LBSelChanged', 'if ((_this select 1) != -1) then {lnbSetCurSelRow [8,-1]};'];
  2124.  
  2125. _table ctrlShow _this;
  2126. _table ctrlSetPosition [0.293698 * safezoneW + safezoneX,0.2888 * safezoneH + safezoneY,0.412598 * safezoneW,0.4862 * safezoneH];
  2127. _table ctrlCommit 0.8;
  2128. };
  2129.  
  2130. _time = diag_tickTime;
  2131. waitUntil {
  2132. if (diag_tickTime-_time>1) exitWith {true};
  2133. if ((ctrlPosition _map) isEqualTo [0.709388 * safezoneW + safezoneX,0.28836 * safezoneH + safezoneY,-0.00312413 * safezoneW,0.486548 * safezoneH]) exitWith {_map ctrlShow false;true};
  2134. };
  2135. };
  2136. "+_skn_hackerLog+" = {
  2137. 1 call "+_skn_switchMainMenu+";
  2138.  
  2139. lbClear (6 call "+_skn_getCtrl+");
  2140. _table = 8 call "+_skn_getCtrl+";
  2141. lbClear _table;
  2142. true spawn "+_skn_switchTable+";
  2143. if (call "+_skn_removespawnMenu+") then {
  2144. uiSleep 0.4;
  2145. _table ctrlSetFade 1;
  2146. _table ctrlcommit 0;
  2147. _table ctrlSetFade 0;
  2148. _table ctrlcommit 0.8;
  2149. };
  2150.  
  2151. _table ctrlShow true;
  2152. _table lnbAddRow ['==================================== HACKER LOG ======================================'];
  2153.  
  2154. {
  2155. _player = _x select 0;
  2156. _color = _x select 1;
  2157.  
  2158. _index = _table lnbAddRow [_player select 1,_player select 2,nil,if (_player select 0 == 0) then [{format['BANNED: %1',_player select 4]},{_player select 4}]];
  2159. if (count _color > 0) then {
  2160. lnbSetColor [8,[_index,0],_color];
  2161. lnbSetColor [8,[_index,1],_color];
  2162. lnbSetColor [8,[_index,3],_color];
  2163. };
  2164. }forEach "+_skn_pv_hackerLog+";
  2165. };
  2166. "+_skn_adminLog+" = {
  2167. 1 call "+_skn_switchMainMenu+";
  2168. lbClear (6 call "+_skn_getCtrl+");
  2169.  
  2170. _table = 8 call "+_skn_getCtrl+";
  2171. lbClear _table;
  2172. true spawn "+_skn_switchTable+";
  2173. if (call "+_skn_removespawnMenu+") then {uiSleep 0.4;
  2174. _table ctrlSetFade 1;
  2175. _table ctrlcommit 0;
  2176. _table ctrlSetFade 0;
  2177. _table ctrlcommit 0.8;
  2178. };
  2179.  
  2180. _table ctrlShow true;
  2181. _table lnbAddRow ['===================================== ADMIN LOG ======================================'];
  2182.  
  2183. {_table lnbAddRow _x}forEach "+_skn_pv_adminLog+";
  2184. };
  2185. "+_skn_flipVehicle+" = {
  2186. _target = cursorTarget;
  2187. if (isNull _target) then {
  2188. _vehicles = player nearEntities[['LandVehicle', 'Ship', 'Air'], 15];
  2189. if !(_vehicles isEqualTo []) then {
  2190. _target = _vehicles select 0;
  2191. };
  2192. };
  2193.  
  2194. if (!isNull _target) then {
  2195. if (!isPlayer _target) then {
  2196. _target setVectorUp [0, 0, 1];
  2197. cutText [format ['Unflipping Vehicle..'],'PLAIN DOWN'];
  2198. };
  2199. };
  2200. };
  2201. "+_skn_infrontTP+" = {
  2202. if ("+_skn_tg_infrontTP+") then {
  2203. if (vehicle player == player) then {
  2204. _distance = 10;
  2205. _object = vehicle player;
  2206. _dir = getdir _object;
  2207. _pos = getPosATL _object;
  2208. if (_object isKindOf 'Air') then {
  2209. _distance = 50;
  2210. _pos = [(_pos select 0)+_distance*sin(_dir),(_pos select 1)+_distance*cos(_dir),((getpos _object) select 2)+100];
  2211. } else {
  2212. _pos = [(_pos select 0)+_distance*sin(_dir),(_pos select 1)+_distance*cos(_dir),0];
  2213. if (surfaceIsWater _pos) then {_pos set [2,2]};
  2214. };
  2215. if (surfaceIsWater _pos) then [{vehicle player setPosASL _pos},{vehicle player setPosATL _pos}];
  2216. } else {
  2217. cutText ['You can just Teleport Infront when you are not inside of a Vehicle!','PLAIN DOWN'];
  2218. };
  2219. };
  2220. };
  2221. "+_skn_unlock+" = {
  2222. _target = cursortarget;
  2223. if (_target iskindof 'Landvehicle' || _target iskindof 'SHIP' || _target iskindof 'AIR' || _target iskindof 'TANK' || _target iskindof 'Constructions_lockedstatic_F') then {
  2224. [110,_target] call "+_skn_adminRequest_PVC+";
  2225. }
  2226. else {
  2227. cutText ['No (Un)Lockable Target found!','PLAIN DOWN'];
  2228. };
  2229. };
  2230. "+_skn_daynight+" = {
  2231. [111,12] call "+_skn_adminRequest_PVC+";
  2232. };
  2233. "+_skn_customBanreason+" = {
  2234. disableSerialization;
  2235. _player = objectFromNetId (_this select 1);
  2236. _name = name _player;
  2237. {(_x call "+_skn_getCtrl+") ctrlShow true}forEach[30,31,32,33,34];
  2238.  
  2239. _edit = 31 call "+_skn_getCtrl+";
  2240. _edit ctrlSetText '';
  2241. if ((_this select 2) isEqualType 'STRING') then {
  2242. _edit ctrlSetText format['%1',(_this select 2)];
  2243. };
  2244.  
  2245. _text = 34 call "+_skn_getCtrl+";
  2246. _text ctrlSetText format ['Custom Banreason for %1:',_name];
  2247. "+_skn_tg_BanPlayer+" = _player;
  2248. findDisplay -1337 displayAddEventHandler ['Unload', {"+_skn_tg_BanPlayer+" = objNull}];
  2249.  
  2250. _map = 7 call "+_skn_getCtrl+";
  2251. _map ctrlSetPosition [0.501031 * safezoneW + safezoneX,0.44456 * safezoneH + safezoneY,0.205265 * safezoneW,0.328148 * safezoneH];
  2252. _map ctrlCommit 0.8;
  2253. };
  2254. "+_skn_doBan+" = {
  2255. disableSerialization;
  2256. if (_this && !isNull "+_skn_tg_BanPlayer+") then {
  2257. _reason = ctrlText 31;
  2258. if (_reason == '') then {
  2259. ctrlSetText [31, 'Please enter a banreason!'];
  2260. } else {
  2261. [666,[_reason,netId "+_skn_tg_BanPlayer+"]] call "+_skn_adminRequest_PVC+";
  2262. };
  2263. };
  2264.  
  2265. {_i = _x call "+_skn_getCtrl+";_i ctrlShow false;_i ctrlShow true}forEach[32,33];
  2266.  
  2267. "+_skn_tg_BanPlayer+" = objNull;
  2268.  
  2269. _map = 7 call "+_skn_getCtrl+";
  2270. _map ctrlSetPosition [0.501031 * safezoneW + safezoneX,0.28836 * safezoneH + safezoneY,0.205265 * safezoneW,0.486548 * safezoneH];
  2271. _map ctrlCommit 0.8;
  2272. };
  2273. ");
  2274.  
  2275. _skn_admininit = compileFinal ("waitUntil {(!isNil '"+_skn_Admin_Code+"') && (!isNil '"+_skn_pv_adminLog+"') && (!isNil '"+_skn_pv_hackerLog+"')};[] spawn "+_skn_Admin_Code+"");
  2276. call compile (_skn_Admin_Code+" = _skn_admincode");
  2277.  
  2278. missionNamespace setVariable [_skn_Admin_Init, _skn_admininit, true];
Add Comment
Please, Sign In to add comment