Files
AltisLifeFramework/Altis_Life.Altis/SpyGlass/fn_variableCheck.sqf
Benjamin Kyd c8014ec81e initial commit
2019-06-05 00:45:50 +01:00

105 lines
4.6 KiB
Plaintext

#include "..\script_macros.hpp"
#define SPY_SETTINGS(TYPE,SETTING) TYPE(missionConfigFile >> "SpyGlass" >> SETTING)
/*
File: fn_variableCheck.sqf
Author:
Description:
Checks against harmful variables, disable this if client-performance is
to bad in the fn_initSpy.sqf, the menuCheck should be good enough!
*/
private ["_BIS_Functions","_LIFE_Functions","_SERVER_Functions","_SOCK_Functions","_DB_Functions","_allowedVariables","_checkFunction","_BIS_UI_Functions","_allowedVariables_UI","_profileCount"];
_BIS_Functions = SPY_SETTINGS(getArray,"BIS_Functions");
_BIS_UI_Functions = SPY_SETTINGS(getArray,"BIS_UI_Functions");
_LIFE_Functions = SPY_SETTINGS(getArray,"LIFE_Functions");
_SERVER_Functions = SPY_SETTINGS(getArray,"SERVER_Functions");
_SOCK_Functions = SPY_SETTINGS(getArray,"SOCK_Functions");
_DB_Functions = SPY_SETTINGS(getArray,"DB_Functions");
_SPY_Functions = SPY_SETTINGS(getArray,"SPY_Functions");
_allowedVariables = SPY_SETTINGS(getArray,"allowedVariables");
_allowedVariables_UI = SPY_SETTINGS(getArray,"allowedVariables_UI");
_profileCount = count allVariables profileNameSpace;
/* Build Player Slots because we name them and they are counted as variables */
for "_i" from 1 to 125 do {
if (_i <= SPY_SETTINGS(getNumber,"civSlotNumber")) then {_allowedVariables pushBack [format ["civ_%1",_i],"OBJECT"]};
if (_i <= SPY_SETTINGS(getNumber,"copSlotNumber")) then {_allowedVariables pushBack [format ["cop_%1",_i],"OBJECT"]};
if (_i <= SPY_SETTINGS(getNumber,"medSlotNumber")) then {_allowedVariables pushBack [format ["medic_%1",_i],"OBJECT"]};
};
/* First lets clear out the memory of potentially bad variables */
{
if (!isNil _x) then {
if (!(_x in _BIS_Functions)) then {
if (!(_x in _LIFE_Functions)) then {
if (!(_x in _SERVER_Functions)) then {
if (!(_x in _SOCK_Functions)) then {
if (!(_x in _DB_Functions)) then {
if (!(_x in _BIS_UI_Functions)) then {
if (!(_x in _SPY_Functions)) then {
_varType = typeName (uiNamespace getVariable _x);
_find = _allowedVariables find [_x,_varType];
if (_find isEqualTo -1) then {
uiNamespace setVariable [_x,nil];
};
};
};
};
};
};
};
};
};
} forEach (allVariables uiNamespace);
/* Some people may be like WTF ALL DEM Checks... It was either this or lazy eval which could have a performance impact on the client. */
_checkFunction = {
{
if (!isNil _x) then {
if (!(_x in _BIS_Functions)) then {
if (!(_x in _LIFE_Functions)) then {
if (!(_x in _SERVER_Functions)) then {
if (!(_x in _SOCK_Functions)) then {
if (!(_x in _DB_Functions)) then {
if (!(_x in _SPY_Functions)) then {
_varType = typeName (missionNamespace getVariable _x);
_find = _allowedVariables find [_x,_varType];
if (_find isEqualTo -1) then {
diag_log format ["Variable: %1 is not allowed TYPE: %2 NS: MN",_x,_varType];
failMission "SpyGlass";
};
};
};
};
};
};
};
};
} forEach allVariables missionNamespace;
};
_uiCheckFunction = {
{
if (!isNil _x) then {
if (!(_x in _BIS_UI_Functions)) then {
_varType = typeName (uiNamespace getVariable _x);
_find = _allowedVariables_UI find [_x,_varType];
if (_find isEqualTo -1) then {
diag_log format ["Variable: %1 is not allowed TYPE: %2 NS: UI",_x,_varType];
failMission "SpyGlass";
};
};
};
} forEach allVariables uiNamespace;
};
for "_i" from 0 to 1 step 0 do {
objNull call _checkFunction;
uiSleep 10;
objNull call _uiCheckFunction;
if (!((count allVariables profileNameSpace) isEqualTo _profileCount) || ((count allVariables parsingNamespace) > 0)) then {
failMission "SpyGlass";
};
uiSleep (5 * 60); //Wait 5 minutes
};