Friday, September 20, 2024 4:29:12 AM
> settings

Customize


Authenticate

> processAbilityRequest.sqf
_playerNetID = _this select 0;
_package = _this select 1;
_option = _package select 0;
_infoArray = _package select 1;
_targetObjectObject = objNull;

try
{
	// Get the player object based on how the server is set up
	if (ArcasDevTools_Server_Exiled) then
	{
		_playerObject = _playerNetID call ExileServer_system_session_getPlayerObject;
	}
	else
	{
		_playerObject = objectFromNetID _playerNetID;
	};
	
	// Make sure we have something to work with
	if (isNull _playerObject) then
	{
		throw "Player is Null";
	};
	
	// Get some information
	_playerUID = getPlayerUID _playerObject;
	_playerName = name _playerObject;
	
	// Make sure nobody is trying to call this without us knowing
	if !(_playerUID in ADT_DEVELOPER_UIDS) then
	{
		throw format["Player %1 does not have access!", _playerUID];
	};
	
	// Here some options
	switch (_option) do
	{
		/*
			Network Message: 
				WATCH_SERVER
				
			Description:
				Called whenever ADT's watch fields are switched into "server" mode. 
				
			Input:
				_code <STRING> - A string of code to run
				_idc <SCALAR> - The IDC of the watch output to return the output to.
				
			Output:
				Via remoteExec, code to return the output of the code ran on the server to the watch field
		*/
		case ADT_OPTION_WATCH_SERVER:
		{
			_code = _infoArray select 0;
			_idc = _infoArray select 1;
			_return = call compile _code;
			
			// Send back nil if we don't have anything
			if (isNil "_return") then 
			{
				_return = "nil";
			};
			
			[
				compile format
				["
					disableSerialization; 
					_display = uiNamespace getVariable [ArcasDevTools_CurrentDisplay, displayNull];
					ArcasDevTools_CurrentDisplay call AftermathClient_util_debugLog;
					if (isNull _display) exitWith {}; 
					(_display displayCtrl %2) ctrlSetText '%1';
				", 
				_return, _idc],
				owner _playerObject
			] 
			call ArcasServer_system_remoteCall;
		};
		
		/*
			Network Message: 
				EXEC_GLOBAL
				
			Description:
				Execute code globally to every connected client except the server
				
			Input:
				_code <CODE> - Code that should be exectuted on every client
				
			Output:
				None
		*/
		case ADT_OPTION_DEBUG_EXEC_GLOBAL:
		{
			_code = _infoArray select 0;
			[_code] call ArcasServer_system_remoteCall;
		};
		
		/*
			Network Message: 
				EXEC_SERVER
				
			Description:
				Executes code on the server
				
			Input:
				_code <CODE> - Code to execute
				
			Output:
				None
		*/
		case ADT_OPTION_DEBUG_EXEC_SERVER:
		{
			_code = _infoArray select 0;
			call _code;
		};
		
		/*
			Network Message: 
				EXEC_ON_TARGET
				
			Description:
				Executes code on a particular client
				
			Input:
				_targetObject <STRING> - A netID of the target
				_code <CODE> - The code to execute
				
			Output:
				None
		*/
		case ADT_OPTION_DEBUG_EXEC_ON_TARGET:
		{
			_targetObject = objectFromNetId (_infoArray select 0);
			_code = _infoArray select 1;
			
			// Make sure we have them and they are alive
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Do ett!
			[_code, owner _targetObject] call ArcasServer_system_remoteCall;
		};
		
		/*
			Network Message: 
				DELETE_VEHICLE
				
			Description:
				Deletes a vehicle
				
			Input:
				_targetObject <STRING> - A netID of the vehicle to delete
				
			Output:
				None
		*/
		case ADT_OPTION_DELETE_VEHICLE:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
			
			if (isNull _targetObject) exitWith
			{
				[_playerNetID, "Target is null!"] call ArcasServer_system_network_notify
			};
			
			// If the target is a player, just kill em
			if (_targetObject isKindOf "Man") then 
			{
				_targetObject setDamage 1;
			}
			else
			{
				if (ArcasDevTools_Server_Exiled) then 
				{
					_targetObject call ExileServer_object_vehicle_remove;
				};
				
				// Delete it
				deleteVehicle _targetObject;
			};
			
			[_playerNetID, format["Deleted vehicle %1", typeOf(_targetObject)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				INVISIBILITY
				
			Description:
				Toggles the ADT users invisibility
				
			Input:
				_state <BOOL> - On or off. ;) 
				
			Output:
				None
		*/
		case ADT_OPTION_TOGGLE_INVISIBILITY:
		{
			_playerObject hideObjectGlobal (_infoArray select 0);
		};
		
		/*
			Network Message: 
				FORCE_DISCONNECT
				
			Description:
				Forces the target client to disconnect from the server
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_FORCE_DISCONNECT:
		{
			// Get the target
			_targetObject = objectFromNetID (_infoArray select 0);
			
			// Make sure, yada yada
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Disconnect them
			[{(findDisplay 46) closeDisplay 0}, owner _targetObject] call ArcasServer_system_remoteCall;
			
			// Notify us
			[_playerNetID, format["Force disconnected %1 (%2)", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				FORCE_SUICIDE
				
			Description:
				Force kill a player. 
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_FORCE_SUICIDE:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
		
			// Check	
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Kill them
			_targetObject setDamage 666;
			
			// Notify us
			[_playerNetID, format["You force suicided %1 (%2)", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				FREEZE
				
			Description:
				Freeze or unfreeze the target
				
			Input:
				_targetObject <STRING> - The netID of the target
				_option <BOOL> - The state in which the player should be
				
			Output:
				None
		*/
		case ADT_OPTION_FREEZE:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
			_option = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Freze or unfreeze
			_targetObject enableSimulationGlobal !(_option);
			[compile format["disableUserInput %1", _option], owner _targetObject] call ArcasServer_system_remoteCall;
			
			// Notify
			[_playerNetID, format["%1 %2 (%3)", ["Unfroze", "Froze"] select (_option), (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				HEAL
				
			Description:
				Heal the selected target
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_HEAL:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Set what we can on ther server
			_targetObject setBleedingRemaining 0;
			_targetObject setOxygenRemaining 1;
			_targetObject setDamage 0;
			
			// Send some code to their client
			[
				{
					ExileClientPlayerAttributes = [100,100,100,100,0,37,0];
					ExileClientPlayerAttributesASecondAgo = ExileClientPlayerAttributes;
					ExileClientPlayerLastHpRegenerationAt = diag_tickTime;
					ExileClientPlayerIsOverburdened = false;
					ExileClientPlayerOxygen = 100;
					ExileClientPlayerIsAbleToBreathe = true;
					ExileClientPlayerIsDrowning = false;
					ExileClientPlayerIsInjured = false;
					ExileClientPlayerIsBurning = false;
					ExileClientPlayerIsBleeding = false;
					ExileClientPlayerIsExhausted = false;
					ExileClientPlayerIsHungry = false;
					ExileClientPlayerIsThirsty = false;
					ExilePlayerRadiation = 0;
					ExilePlayerRadiationLastCheck = 0;
				},
				owner _targetObject
			] call ArcasServer_system_remoteCall;
			
			// Notify
			[_playerNetID,format["Healed %1 (%2)", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				REMOVE_GEAR
				
			Description:
				Remove all the players gear and shit
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_REMOVE_GEAR:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// remove it!
			removeAllWeapons _targetObject;
			removeAllAssignedItems _targetObject;
			removeAllContainers _targetObject;
			removeAllItems _targetObject;
			removeBackpackGlobal _targetObject;
			removeVest _targetObject;
			removeUniform _targetObject;
			
			// Notify
			[_playerNetID,format["Removed %1's (%2) gear'", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				REARM
				
			Description:
				Rearm the selected player vehicle
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				XXXXXX
		*/
		case ADT_OPTION_REARM:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// We don't want to rearm a player
			if (_targetObject isKindOf "MAN") exitWith {};
			
			// Lets try to rearm
			try
			{
				// Don't rearm a parachute
				if (_targetObject isKindOf "ParachuteBase") then
				{
					throw 0;
				};
				
				// Set the vehicle ammo
				_targetObject setVehicleAmmo 1;
				
				_magazines = getArray(configFile >> "CfgVehicles" >> (typeof _targetObject) >> "magazines");
				
				if (count _magazines > 0) then
				{
					_removed = [];
					
					{
						if (!(_x in _removed)) then
						{
							_targetObject removeMagazines _x;
							_removed = _removed + [_x];
						};
					} 
					forEach _magazines;
					
					{
						_targetObject addMagazine _x;
					} 
					forEach _magazines;
				};
				
				_count = count (configFile >> "CfgVehicles" >> (typeof _targetObject) >> "Turrets");
				
				if (_count > 0) then
				{
					for "_i" from 0 to (_count - 1) do
					{
						_config = (configFile >> "CfgVehicles" >> (typeof _targetObject) >> "Turrets") select _i;
						_magazines = getArray(_config >> "magazines");
						
						_removed = [];
						{
							if !(_x in _removed) then
							{
								_targetObject removeMagazines _x;
								_removed = _removed + [_x];
							};
						} 
						forEach _magazines;
						
						{
							_targetObject addMagazine _x;
						} 
						forEach _magazines;
						
						_otherTurrets = count (_config >> "Turrets");
						
						if (_otherTurrets > 0) then
						{
							for "_i" from 0 to (_otherTurrets - 1) do
							{
								_config = (_config >> "Turrets") select _i;
								_magazines = getArray(_config >> "magazines");
								_removed = [];
								
								{
									if !(_x in _removed) then
									{
										_targetObject removeMagazines _x;
										_removed = _removed + [_x];
									};
								} 
								forEach _magazines;
								
								{
									_targetObject addMagazine _x;
								} 
								forEach _magazines;
							};
						};
					};
				};
				
				// Set the ammo again
				_targetObject setVehicleAmmo 1;
				
				// Notify the player
				[_playerNetID, format["Successfully rearmed %1 (%2)", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
			}
			catch
			{
				[_playerNetID, format["Failed to rearm %1 (%2)", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
			};
		};
		
		/*
			Network Message: 
				REPAIR_REFUEL
				
			Description:
				Repair and refuel the target
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_REPAIR_REFUEL:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			_targetObject setDamage 0;
			_targetObject setFuel 1;
			
			// Notify
			[_playerNetID,format["Refueled and repaired %1's (%2) vehicle", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				SPAWN_VEHICLE
				
			Description:
				Spawn a persistent or non-persistent vehicle
				
			Input:
				_targetObject <STRING> - The netID of the target
				_vehicleClassname <STRING> - The classname of the vehicle to spawn
				_spawnType <BOOL> - Persistent (0) or non-persistent(1)
				
			Output:
				None
		*/
		case ADT_OPTION_SPAWN_VEHICLE:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			_vehicleClassname = _infoArray select 1;
			_spawnType = _infoArray select 2;
			
			// Check
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];

			_vehicleObject = objNull;
			
			// Get the direction on where to spawn
			_position = AGLToASL (_targetObject modelToWorld [0,10,0]);
			
			// Fix the direction
			_dir = getDir (vehicle _targetObject);
			
			switch (_spawnType) do
			{
				// Persistent
				case 0:
				{
					_pincode = _infoArray select 3;
					
					// Make sure we have a pin code
					if (_pincode isEqualTo -1) then
					{
						throw [format["Player %1 (%2) tried to spawn a persistent vehicle without a pin! Naughty Naughty", _playerName, _playerUID]];
					};
					
					// Create the vehicle
					_vehicleObject = [_vehicleClassname, _position, _dir, false, _pincode] call ExileServer_object_vehicle_createPersistentVehicle;
					
					// Make sure we have something
					if (isNull _vehicleObject) then
					{
						throw [format["Player %1 (%2) tried to spawn a vehicle, it returned null!", _playerName,_playerUID]];
					};
					
					// Set the owner
					_vehicleObject setVariable ["ExileOwnerUID", (_targetInfo select 1)];
					
					// Save the vehicle and remember the ID
					_dbID = _vehicleObject call ExileServer_object_vehicle_database_insert;
					_vehicleObject setVariable ["ExileDatabaseID", _dbID];
					
					// Update the vehicle in the DB
					_vehicleObject call ExileServer_object_vehicle_database_update;
					
					// Save this
					_vehicleObject setVariable ["ExileIsLocked", 0];
					_vehicleObject lock 0;
					_vehicleObject enableRopeAttach false;
					
					// Notify
					[_playerNetID, format["Spawned a persistent vehicle (%1) on %2 (%3)",_vehicleClassname, (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
				};
				
				// Non-persistent
				case 1:
				{
					// Create the vehicle
					_vehicleObject = [_vehicleClassname, _position, _dir, false] call ExileServer_object_vehicle_createNonPersistentVehicle;
					
					// Make sure it exists
					if (isNull _vehicleObject) then
					{
						throw [format["Player %1 (%2) tried to spawn a vehicle, it returned null!",_playerName,_playerUID]];
					};
					
					// Save the owner
					_vehicleObject setVariable["ExileOwnerUID", (_targetInfo select 1)];
					
					// Notify
					[_playerNetID,format["Spawned a non-persistent vehicle (%1) on %2 (%3)",_vehicleClassname, (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
				};
			};
		};
		
		/*
			Network Message: 
				SPAWN_EVERYTHING_ELSE
				
			Description:
				Spawn in everything else
				
			Input:
				_targetObject <STRING> - The netID of the target
				_itemClassname <STRING> - Classname of item to spawn
				
			Output:
				None
		*/
		case ADT_OPTION_SPAWN_EVERYTHING_ELSE:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			_itemClassName = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Get the position
			_targetObjectPOS = _targetObject modelToWorld [0,1.5,0];
			
			// Set the correct height
			_targetObjectPOS set [2, (getPosATL _targetObject) select 2];
			
			_lootHolder = objNull;
			_nearestHolder = nearestObjects [_targetObject, ["GroundWeaponHolder","WeaponHolderSimulated","LootWeaponHolder"], 3];
			
			// Get a preexisting loot pile
			if !(_nearestHolder isEqualTo []) then
			{
				_lootHolder = _nearestHolder select 0;
			};
			
			// Make sure we have a loot holder, if not, create one
			if (isNull _lootHolder) then
			{
				_lootHolder = createVehicle ["GroundWeaponHolder", _targetObjectPOS, [], 3, "CAN_COLLIDE"];
				_lootHolder setPosATL _targetObjectPOS;
				_lootHolder setVariable["BIS_enableRandomization", false];
			};
			
			// Add to the 
			_lootHolder addItemCargoGlobal [_itemClassName,1];
			if (isClass (configFile >> "CfgWeapons" >> _itemClassName)) then
			{
				_magazines = getArray (configFile >> "CfgWeapons" >> _itemClassName >> "magazines");
				
				if !(_magazines isEqualTo []) then
				{
					{
						_lootHolder addItemCargoGlobal [_x,3];
					}
					forEach _magazines;
				};
			};
			
			// Notify
			[_playerNetID,format["Spawning %1 on %2 (%3)",_itemClassName, (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				BAN_ANNOUNCE
				
			Description:
				Ban someone and annouce to the server that we did
				
			Input:
				_targetObject <STRING> - The netID of the target
				_reason <STRING> - The reason for the ban
				
			Output:
				None
		*/
		case ADT_OPTION_BAN_ANNOUNCE:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			_reason = _infoArray select 1;

			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Attempt to ban them
			_confirmed = format ["#exec ban %1", str((_targetInfo select 1))] call ExileServer_system_rcon_event_sendCommand;
			
			// Did we ban them? Notify
			if (_confirmed) then
			{
				[_playerNetID, format["Banned %1 (%2)!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
				
				["toastRequest",["InfoTitleAndText",["ADMINISTRATIVE COMMAND", format["%1 has been banned from the server by %2! Reason: %3", (_targetInfo select 0), _playerName, _reason]]]] call ExileServer_system_network_send_broadcast;
			};
		};
		
		/*
			Network Message: 
				BAN_QUIET
				
			Description:
				Ban someone
				
			Input:
				_targetObject <STRING> - The netID of the target
				_reason <STRING> - The reason for the ban
				
			Output:
				None
		*/
		case ADT_OPTION_BAN_QUIET:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			_reason = _infoArray select 1;
			_confirmed = format ["#exec ban %1", str((_targetInfo select 1))] call ExileServer_system_rcon_event_sendCommand;
			if (_confirmed) then
			{
				[_playerNetID, format["Banned %1 (%2)!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
			};
		};
		
		/*
			Network Message: 
				KICK_ANNOUNCE
				
			Description:
				Kick somone from the server and announce it to the world!
				
			Input:
				_targetObject <STRING> - The netID of the target
				_reason <STRING> - The reason for the kick
				
			Output:
				None
		*/
		case ADT_OPTION_KICK_ANNOUNCE:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			_reason = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Attempt to kick them
			_return = format ["#kick %1", str((_targetInfo select 1))] call ExileServer_system_rcon_event_sendCommand;
			
			// If not, just force close their session
			if !(_return) then
			{
				[{(findDisplay 46) closeDisplay 0}, owner _targetObject] call ArcasServer_system_remoteCall;
			};
			
			// Notify us
			[_playerNetID,format["Kicked %1 (%2)!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
			
			// Notify the server
			["toastRequest",["InfoTitleAndText",["ADMINISTRATIVE COMMAND",format["%1 has been kicked from the server by %2! Reason: %3",(_targetInfo select 0), _playerName, _reason]]]] call ExileServer_system_network_send_broadcast;
		};
		
		/*
			Network Message: 
				KICK_QUIET
				
			Description:
				Kick someone
				
			Input:
				_targetObject <STRING> - The netID of the target
				_reason <STRING> - The reason for the kick 
				
			Output:
				None
		*/
		case ADT_OPTION_KICK_QUIET:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			_reason = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Kick them
			_return = format ["#kick %1", str((_targetInfo select 1))] call ExileServer_system_rcon_event_sendCommand;
			
			// If not, just close their session
			if !(_return) then
			{
				[{(findDisplay 46) closeDisplay 0}, owner _targetObject] call ArcasServer_system_remoteCall;
			};
			
			// Notify us
			[_playerNetID,format["Kicked %1 (%2)!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				WARN_ANNOUNCE
				
			Description:
				Warn a player and notify the server
				
			Input:
				_targetObject <STRING> - The netID of the target
				_reason <STRING> - The reason for the warning
				
			Output:
				None
		*/
		case ADT_OPTION_WARN_ANNOUNCE:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			_reason = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			_code =
			compile format
			["
				[] spawn
				{
					for ""_i"" from 0 to 5 do
					{
						[""ErrorTitleAndText"", [""ADMIN WARNING"", %1]] call ExileClient_gui_toaster_addTemplateToast;
						[""<t color='#ff0000' size = '2'>ADMIN WARNING!<br />%2</t>"",-1,-1,0.3,0.1,0,789] call BIS_fnc_dynamicText;
					};
					[""<t color='#ff0000' size = '2'>ADMIN WARNING!<br />%2</t>"",-1,-1,7,0.2,0,789] call BIS_fnc_dynamicText;
				};
			",
			str(_reason),
			_reason
			];
			
			// Execute the warning on the client
			[_code,owner _targetObject] call ArcasServer_system_remoteCall;
			
			// Notify us
			[_playerNetID,format["Warned %1 (%2)!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
			
			// Notify the server
			["toastRequest",["InfoTitleAndText",["ADMINISTRATIVE COMMAND",format["%1 has been warned by %2! Reason: %3",(_targetInfo select 0), _playerName, _reason]]]] call ExileServer_system_network_send_broadcast;
		};
		
		/*
			Network Message: 
				WARN_QUIET
				
			Description:
				Warn someone
				
			Input:
				_targetObject <STRING> - The netID of the target
				_reason <STRING> - The reason for the warning
				
			Output:
				None
		*/
		case ADT_OPTION_WARN_QUIET:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			_reason = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Warning code
			_code =
			compile format
			["
				[] spawn
				{
					for ""_i"" from 0 to 5 do
					{
						[""ErrorTitleAndText"", [""ADMIN WARNING"", %1]] call ExileClient_gui_toaster_addTemplateToast;
						[""<t color='#ff0000' size = '2'>ADMIN WARNING!<br />%2</t>"",-1,-1,0.3,0.1,0,789] call BIS_fnc_dynamicText;
					};
					[""<t color='#ff0000' size = '2'>ADMIN WARNING!<br />%2</t>"",-1,-1,7,0.2,0,789] call BIS_fnc_dynamicText;
				};
			",
			str(_reason),
			_reason
			];
			
			// Execute the warning on the client
			[_code,owner _targetObject] call ArcasServer_system_remoteCall;
			
			// Notify us
			[_playerNetID, format["Warned %1 (%2)!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				GET_INFO
				
			Description:
				Get information on the target. Used for Administration panel in ADT
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				Array of information to be applied to the GUI
		*/
		case ADT_OPTION_TARGET_GET_INFO:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Array of information
			_info =
			[
				(_targetInfo select 0),
				[
					[
						["--------------------- Player Stats ---------------------", [0.608,0.443,0.482,1]],
						[]
					],
					[
						["Money:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileMoney", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Locker:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileLocker", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Respect:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileScore", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Kills:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileKills", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Deaths:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileDeaths", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Clan ID:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileClanID", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Clan Data:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileClanData", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Hunger:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileHunger", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Thirst:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileThirst", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Alcohol:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileAlcohol", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["Temperature:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileTemperature", "N/A"],
							[0.443,0.482,0.608,1]
						]
					],
					[
						["isBambi:",[1,1,1,1]],
						[
							_targetObject getVariable ["ExileIsBambi", "N/A"],
							[0.443,0.482,0.608,1]
						]
					]
				]   
			];
			
			// Update the GUI
			[_info,"ArcasDevTools_tools_admin_updateTargetInfo",owner _playerObject] call ArcasServer_system_remoteFunctionCall;
		};
		
		/*
			Network Message: 
				MODIFY_MONEY
				
			Description:
				Modify the targets money
				
			Input:
				_targetObject <STRING> - The netID of the target
				_option <STRING> - Remove or add
				_amount <STRING> - The amount of money
				_locker <BOOL> - Add or remove from the locker, else the wallet
				
			Output:
				None
		*/
		case ADT_OPTION_TARGET_MODIFY_MONEY:
		{
			_targetObject = objectFromNetId(_infoArray select 0);
			_option = _infoArray select 1;
			_amount = abs(parseNumber(_infoArray select 2));
			_locker = _infoArray select 3;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];

			// Get the current money
			_targetObjectMoney = _targetObject getVariable [["ExileMoney", "ExileLocker"] select _locker, 0];
			
			// Add or remove the money
			_targetObjectMoney = if (tolower(_option) isEqualTo "add") then { _targetObjectMoney + _amount } else { _targetObjectMoney - _amount };
			
			// Make sure we aren't negative
			if (_targetObjectMoney < 0) then
			{
				_targetObjectMoney = 0;
			};
			
			// Save it back to the target
			_targetObject setVariable [["ExileMoney", "ExileLocker"] select _locker, _targetObjectMoney, true];
			
			// Save it in the DB
			if (_locker) then
			{
				format["updateLocker:%1:%2", (_targetInfo select 1), _targetObjectMoney] call ExileServer_system_database_query_fireAndForget;
			}
			else
			{
				format["setPlayerMoney:%1:%2", _targetObjectMoney, _targetObject getVariable ["ExileDatabaseID", 0]] call ExileServer_system_database_query_fireAndForget;
			};
			
			// Update us
			[_playerNetID, format["%1 %2 money to %3 (%4)", _option, _amount, (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
			
			// Update the GUI
			[_playerNetID, [ADT_OPTION_TARGET_GET_INFO, [netID _targetObject]]] call ArcasServer_system_network_processAbilityRequest;
		};
		
		/*
			Network Message: 
				MODIFY_RESPECT
				
			Description:
				Modify the targets respect
				
			Input:
				_targetObject <STRING> - The netID of the target
				_option <STRING> - Remove or add
				_amount <STRING> - The amount of respect
				
			Output:
				None
		*/
		case ADT_OPTION_TARGET_MODIFY_RESPECT:
		{
			_targetObject = objectFromNetId(_infoArray select 0);
			_option = _infoArray select 1;
			_amount = floor(abs(parseNumber(_infoArray select 2)));
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Get the respect
			_targetObjectRespect = _targetObject getVariable ["ExileScore",0];
			
			// Add or remove the respect
			_targetObjectRespect = if (tolower(_option) isEqualTo "add") then { _targetObjectRespect + _amount } else { _targetObjectRespect - _amount };
			
			// Save the respect
			_targetObject setVariable ["ExileScore", _targetObjectRespect];
			
			// Save to the DB
			format["setAccountScore:%1:%2", _targetObjectRespect, _targetObject getVariable ["ExileLifePlayerDataID", -1]] call ExileServer_system_database_query_fireAndForget;
			
			// We gotta update the vars on the client
			_code = compile format["ExileClientPlayerScore = %1;",_targetObjectRespect];
			
			[_code, owner _targetObject] call ArcasServer_system_remoteCall;
			
			// Update the GUI
			[_playerNetID, [ADT_OPTION_TARGET_GET_INFO, [netID _targetObject]]] call ArcasServer_system_network_processAbilityRequest;
			
			// Notify us
			[_playerNetID, format["%1 %2 respect to %3 (%4)", _option, _amount, (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				TELEPORT_TO_ME
				
			Description:
				Teleport the target to me
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_TELEPORT_TO_ME:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Get the pos to teleport to
			_pos = _playerObject modelToWorld [0,5,0];
			_pos set [2, (getPosATL _playerObject) select 2];
			
			// Duhhh, move them
			_targetObject setPosATL _pos;
			
			// Notify us
			[_playerNetID, format["Teleported %1 (%2) to you!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				TELEPORT_TO_TARGET
				
			Description:
				Teleport to the target
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_TELEPORT_TO_TARGET:
		{
			_targetObject = objectFromNetID(_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Get the ending position
			_pos = _targetObject modelToWorld [0,-5,0];
			_pos set [2, (getPosATL _targetObject) select 2];
			
			// Set the position
			_playerObject setPosATL _pos;
			
			// Notify us
			[_playerNetID, format["Teleported to %1 (%2)!", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				LOCK_UNLOCK
				
			Description:
				Toggle the lock state of a vehicle
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_OBJECT_LOCK_UNLOCK:
		{
			_netID = _infoArray select 0;
			
			if ([_playerObject, objectFromNetID(_netID)] call ArcasServer_util_isNullOrDead) exitWith {};

			// Are we aftermath?
			if (ArcasDevTools_AftermathServer) then 
			{
				_keyID = _object getVariable ["AftermathAccessKey",""];
				
				if !(_keyID isEqualTo "") then
				{
					if ((_object getVariable ["ExileIsLocked",0]) isEqualTo -1) then
					{
						[_playerNetID, [_netID, false, _keyID]] call AftermathServer_object_lock_network_toggleLockRequest;
					}
					else
					{
						[_playerNetID, [_netID, true, _keyID]] call AftermathServer_object_lock_network_toggleLockRequest;
					};
				};
			}
			else
			{
				_pincode = _object getVariable ["ExileAccessCode","000000"];
				
				if !(_pincode isEqualTo "000000") then
				{
					if ((_object getVariable ["ExileIsLocked",0]) isEqualTo -1) then
					{
						[_playerNetID,[_netID,_pincode,false]] call ExileServer_object_lock_network_lockToggle;
					}
					else
					{
						[_playerNetID,[_netID,_pincode,true]] call ExileServer_object_lock_network_lockToggle;
					};
				};
			};
		};
		
		/*
			Network Message: 
				GET_OBJECT_INFO
				
			Description:
				Get some information about the object
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				A on screen message with info about the object
		*/
		case ADT_OPTION_OBJECT_GET_INFORMATION:
		{
			_targetObject = objectFromNetID (_infoArray select 0);
						
			try 
			{
				// Is it a player?
				if (isPlayer _targetObject) then
				{
					throw format
					[
						"
						Name:               %1<br/>
						UID:                %2<br/>
						Position (ATL):     %3<br/>
						Health:             %4<br/>
						Hunger:             %5<br/>
						Thirst:             %6<br/>
						",
						name _targetObject,
						getPlayerUID _targetObject,
						getPosATL _targetObject,
						damage _targetObject,
						_targetObject getVariable ["ExileHunger", 100],
						_targetObject getVariable ["ExileThirst", 100]
					];
				};
				
				// Is it a AI?
				if (_targetObject isKindOf "Man") then
				{
					throw format
					[
						"
						Name:               %1<br/>
						Position (ATL):     %2<br/>
						",
						typeOf _targetObject,
						getPosATL _targetObject
					];
				};
				
				// Is it a vehicle?
				if (_targetObject isKindOf "LandVehicle" || _targetObject isKindOf "Ship" || _targetObject isKindOf "Air") then
				{
					throw format
					[
						"
						Name: %1<br/>
						Position (ATL): %2<br/>
						Damage: %3<br/>
						Fuel: %4<br/>
						Persistent: %5<br/>
						OwnerUID: %6<br/>
						%7: %8<br/>
						Locked: %9<br/>
						",
						typeOf _targetObject,
						getPosATL _targetObject,
						damage _targetObject,
						fuel _targetObject,
						_targetObject getVariable ["ExileIsPersistent", false],
						_targetObject getVariable ["ExileOwnerUID","N/A"],
						if (ArcasDevTools_AftermathServer) then { "Key ID:" } else { "Pin Code:" },
						if (ArcasDevTools_AftermathServer) then { _targetObject getVariable ["AftermathAccessKey", "N/A"] } else { _targetObject getVariable ["ExileAccessCode", "N/A"] },
						_targetObject getVariable ["ExileIsLocked",0]
					];
				};
				
				// EVERYTHING ELSE
				throw format
				[
					"
					Name: %1<br/>
					Position (ATL): %2<br/>
					",
					typeOf _targetObject,
					getPosATL _targetObject
				];
			}
			catch 
			{
				_code = compile format["[""<t align='left' size='0.5' color='#9af311'>%1</t>"", 0.005 * safezoneW + safezoneX, 0.192 * safezoneH + safezoneY, 10, 0] spawn BIS_fnc_dynamicText;", _exception];
				
				[_code, owner _playerObject] call ArcasServer_system_remoteCall;
			};
		};
		
		/*
			Network Message: 
				SPAWN_MAGS
				
			Description:
				Spawns magazines of the currently selected players weapon
				
			Input:
				_targetObject <STRING> - The netID of the target
				_amount <SCALAR> - Number of mags to spawn
				
			Output:
				None
		*/
		case ADT_OPTION_SPAWN_MAGS:
		{
			_targetObject = objectFromNetid(_infoArray select 0);
			_amount = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			_lootHolder = objNull;
			_nearestHolder = nearestObjects [_targetObject, ["GroundWeaponHolder","WeaponHolderSimulated","LootWeaponHolder"], 3];
			
			// Do we have a weapon holder near
			if !(_nearestHolder isEqualTo []) then
			{
				_lootHolder = _nearestHolder select 0;
			};
			
			// It's null, just create one
			if (isNull _lootHolder) then
			{
				// Current position
				_targetObjectPOS = _targetObject modelToWorld [0,1.5,0];
				_targetObjectPOS set [2, (getPosATL _targetObject) select 2];
				
				_lootHolder = createVehicle ["GroundWeaponHolder",_targetObjectPOS,[],3,"CAN_COLLIDE"];
				_lootHolder setPosATL _targetObjectPOS;
				_lootHolder setVariable["BIS_enableRandomization",false];
			};
			
			// Current weapon
			_className = currentWeapon _targetObject;
			
			// Make sure we have it
			if (isClass (configFile >> "CfgWeapons" >> _className)) then
			{
				// Get it's magazines
				_magazines = getArray (configFile >> "CfgWeapons" >> _className >> "magazines");
				
				if !(_magazines isEqualTo []) then
				{
					{
						_lootHolder addItemCargoGlobal [_x,_amount];
					}
					forEach _magazines;
				};
			};
			
			// Notify us
			[_playerNetID, format["Spawned some magazines for %1", getText(configFile >> "CfgWeapons" >> _className >> "displayName")]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				EJECT_FROM_VEHICLE
				
			Description:
				Eject the target from their vehicle
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_EJECT_FROM_VEHICLE:
		{
			_targetObject = objectFromNetid(_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Move them out of the vehicle
			moveOut _targetObject;
			unassignVehicle _targetObject;
			_targetObject action ["Eject", (vehicle _targetObject)];
			
			// Notify us
			[_playerNetID, format["Ejected %1 (%2)", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				EJECT_CREW_FROM_VEHICLE
				
			Description:
				Ejects a crew from the vehicle
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_EJECT_CREW_FROM_VEHICLE:
		{
			_targetObject = objectFromNetid(_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			{
				moveOut _x;
				unassignVehicle _x;
				_x action ["Eject", (vehicle _targetObject)];
			}
			forEach (crew _targetObject);
			
			// Notify us
			[_playerNetID, format["Ejected %1 (%2) crew", (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				WEATHERTIME
				
			Description:
				Sets the weather/time for the server
				
			Input:
				_sendOption <SCALAR> - Which thing to change
				_sendValue <SCALAR> - What value to change it to
				
			Output:
				None
		*/
		case ADT_OPTION_SET_WEATHERTIME:
		{
			_sendOption = _infoArray select 0;
			_sendValue = _infoArray select 1;
			_changeRequired = true;
			  
			switch (_sendOption) do 
			{
				case ADT_WEATHERTIME_OPTION_MONTH: 
				{
					_date = date;
					_date set [1, _sendValue];
					setDate _date;
					
					// We don't require an update
					_changeRequired = false;
				};
				
				case ADT_WEATHERTIME_OPTION_DAY: 
				{
					_date = date;
					_date set [2, _sendValue];
					setDate _date;
					
					// We don't require an update
					_changeRequired = false;
				};
				
				case ADT_WEATHERTIME_OPTION_HOUR: 
				{
					_date = date;
					_date set [3, _sendValue];
					setDate _date;
					
					// We don't require an update
					_changeRequired = false;
				};
				
				case ADT_WEATHERTIME_OPTION_MINUTE: 
				{
					_date = date;
					_date set [4, _sendValue];
					setDate _date;
					
					// We don't require an update
					_changeRequired = false;
				};
				
				case ADT_WEATHERTIME_OPTION_FOG_VALUE: 
				{
					_fog = fogParams;
					_fog set [0, _sendValue];
					0 setFog _fog;
				};
				
				case ADT_WEATHERTIME_OPTION_FOG_DECAY: 
				{
					_fog = fogParams;
					_fog set [1, _sendValue];
					0 setFog _fog;
				};
				
				case ADT_WEATHERTIME_OPTION_FOG_BASE: 
				{
					_fog = fogParams;
					_fog set [2, _sendValue];
					0 setFog _fog;
				};
				
				case ADT_WEATHERTIME_OPTION_OVERCAST: 
				{
					0 setOvercast _sendValue;
				};
				
				case ADT_WEATHERTIME_OPTION_RAIN: 
				{
					0 setRain _sendValue;
				};
				
				case ADT_WEATHERTIME_OPTION_WAVES: 
				{
					0 setWaves _sendValue;
				};
				
				case ADT_WEATHERTIME_OPTION_WIND_X: 
				{
					_wind = wind;
					_wind set [0, _sendValue];
					
					// Remove Z
					_wind deleteAt 1;
					
					// Add the false
					_wind pushBack false;
					setWind _wind;
				};
				
				case ADT_WEATHERTIME_OPTION_WIND_Y: 
				{
					_wind = wind;
					_wind set [1, _sendValue];
					_wind set [2, false];
					setWind _wind;
				};
				
				case ADT_WEATHERTIME_OPTION_WIND_DIR: 
				{
					0 setWindDir _sendValue;
				};
				
				case ADT_WEATHERTIME_OPTION_GUSTS: 
				{
					0 setGusts _sendValue;
				};
				
				case ADT_WEATHERTIME_OPTION_LIGHTNINGS: 
				{
					0 setLightnings _sendValue;
				};
				
				case ADT_WEATHERTIME_OPTION_RAINBOWS: 
				{
					0 setRainbow _sendValue;
				};
				
			};
			
			// Force sync
			if (_changeRequired) then
			{
				simulWeatherSync;
				forceWeatherChange;
			};
			
			// Notify us
			[_playerNetID, "Updated weather/time!"] call ArcasServer_system_network_notify;
		};     
		
		/*
			Network Message: 
				GIVE_VEHICLE_KEY
				
			Description:
				Give the vehicle key for a particular vehicle. ONLY WORKS FOR AFTERMATH!!!
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_GIVE_VEHICLE_KEY:
		{
			_targetObject = objectFromNetid(_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Get the keyID
			_keyID = _object getVariable ["AftermathAccessKey", ""];
			
			// we don't have a key, just exit
			if (_keyID isEqualTo "") exitWith {};
			
			// Give the player the key. 
			[_playerObject, format["Aftermath_Item_CarKey_%1", _keyID]] call ExileClient_util_playerCargo_add;
			
			// Let them know
			[_playerNetID, format["Added key (%1) to inventory", _keyID]] call ArcasServer_system_network_notify;
		};
		
		/*
			Network Message: 
				REMOTE_GODMODE
				
			Description:
				Gives a client god mode. This will create a thread on their client
				
			Input:
				_targetObject <STRING> - The netID of the target
				_stats <BOOL> - Adjusts their stats 
				
			Output:
				XXXXXX
		*/
		case ADT_OPTION_REMOTE_GODMODE:
		{
			_targetObject = objectFromNetid(_infoArray select 0);
			_stats = _infoArray select 1;
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// get our option
			_option = _targetObject getVariable ["ADT_GodModeEnabled", false];
			
			// Give or remove godmode
			if !(_option) then 
			{
				// The code to run on their client
				_code = 
				{
					if (alive player) then
					{
						player allowDamage false;
						player removeAllEventhandlers "HandleDamage";
						player addEventhandler ["HandleDamage", {false}];
						player setBleedingRemaining 0;
						player setOxygenRemaining 1;
						player setFatigue 0;
						if (damage player > 0) then { player setDamage 0; };
					};
				};
				
				// We want to change their stats, run this instead
				if (_stats) then 
				{
					_code =
					{
						if (alive player) then
						{
							player allowDamage false;
							player removeAllEventhandlers "HandleDamage";
							player addEventhandler ["HandleDamage", {false}];
							ExileClientPlayerAttributes = [100,100,100,100,0,37,0];
							ExileClientPlayerAttributesASecondAgo = ExileClientPlayerAttributes;
							ExileClientPlayerLastHpRegenerationAt = diag_tickTime;
							ExileClientPlayerIsOverburdened = false;
							ExileClientPlayerOxygen = 100;
							ExileClientPlayerIsAbleToBreathe = true;
							ExileClientPlayerIsDrowning = false;
							ExileClientPlayerIsInjured = false;
							ExileClientPlayerIsBurning = false;
							ExileClientPlayerIsBleeding = false;
							ExileClientPlayerIsExhausted = false;
							ExileClientPlayerIsHungry = false;
							ExileClientPlayerIsThirsty = false;
							player setBleedingRemaining 0;
							player setOxygenRemaining 1;
							player setFatigue 0;
							if (damage player > 0) then { player setDamage 0; };
							if (ArcasDevTools_AftermathClient) then 
							{
								AftermathClientPlayerStats = [1, 0, 300];	
								AftermathHearingLossTimeout = 0;
								AftermathPlayerHearingLossActive = false;
								AftermathClientIsPlayerForcedWalking = false;
								AftermathClientRadiationProtected = true;
							};
						};
					};	
				};
				
				// The code package
				_package = format["_id = [0.5, %1, [], true] call ExileClient_system_thread_addTask; player setVariable ['ADT_GodModeThread', _id]; ['InfoTitleAndText', ['Arcas Dev Tools', 'You now have godmode']] call ExileClient_gui_toaster_addTemplateToast;", _code];	
			}
			else 
			{
				// The code package
				_package = "
				['InfoTitleAndText', ['Arcas Dev Tools', 'Your god mode has been removed']] call ExileClient_gui_toaster_addTemplateToast;
				[player getVariable ['ADT_GodModeThread', -1]] call ExileClient_system_thread_removeTask;
			    player allowDamage true;
			    player removeAllEventhandlers 'HandleDamage';
			    if (!isNil 'ExileClient_object_player_event_onHandleDamage') then 
			    {
			    	player addEventHandler ['HandleDamage',{_this call ExileClient_object_player_event_onHandleDamage}];
			    };";
			};
			
			// remember that we gave them godmode
			_targetObject setVariable ["ADT_GodModeEnabled", !_option, true];
			
			// Inject the code
			[compile(_package), owner _targetObject] call ArcasServer_system_remoteCall;
			
			// Notify us
			[_playerNetID, format["%1 godmode to %2 (%3)", ["Added", "Removed"] select _option, (_targetInfo select 0), (_targetInfo select 1)]] call ArcasServer_system_network_notify;
		};
		
		
		/*
			Network Message: 
				GRANT_ADT_LITE
				
			Description:
				Gives a client access to ADTLite, a lite version of ADT. Useful for helpers and shit
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_GRANT_ADT_LITE:
		{
			_targetObject = objectFromNetid(_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			// Save some information
			_targetInfo = [name _targetObject, getPlayerUID _targetObject];
			
			// Make sure we aren't already got access
			if ((_targetInfo select 1) in ArcasServerADTLiteUsers) exitWith 
			{
				[_playerNetID, format["%1 already has access to ADT Lite", _targetInfo select 0]] call ArcasServer_system_network_notify;
			};
			
			// Give them access...
			[_playerNetID, _infoArray select 0] call ArcasServer_system_network_grantTempAccess;
			
			// Notify us
			[_playerNetID, format["Player %1 (%2) has been given access to ADT Lite", _targetInfo select 0, _targetInfo select 1]] call ArcasServer_system_network_notify;
		};
		
		
		/*
			Network Message: 
				REVOKE_ADT_LITE
				
			Description:
				Revokes a clients access to ADTLite. Injects code to remove any functions that were compiled
				
			Input:
				_targetObject <STRING> - The netID of the target
				
			Output:
				None
		*/
		case ADT_OPTION_REVOKE_ADT_LITE:
		{
			_targetObject = objectFromNetid(_infoArray select 0);
			
			if ([_playerObject, _targetObject] call ArcasServer_util_isNullOrDead) exitWith {};
			
			_code = 
			{
				{
					missionNamespace setVariable [_x, nil];
				}
				forEach
				[
					"ADTLITE_KeyOpen",
					"ADTLITE_Vehicles",
					"ADTLITE_IsOpen",
					"ADTLITE_ExileClient",
					"ADTLITE_AftermathClient",
					"ADTLITE_Spawn",
					"ADTLITE_Thread_Godmode",
					"ADTLITE_Functions",
					"ADTLITE_BackgroundBlur",
					"ADTLITE_KeyUp",
					"ADTLITE_KeyDown",
					"ADTLITE_MapTP_KeyDown",
					"ADTLITE_MapTP_WaitingForClick",
					"ADTLITE_MapTP_KeyUp",
					"adt_fn_compileConfigs",
					"adt_fn_notify",
					"adt_fn_toggleBlur",
					"adt_fn_buildCtrl",
					"adt_fn_buildGUI",
					"adt_fn_godmode",
					"adt_fn_mapTP",
					"adt_fn_forwardTP",
					"adt_fn_jump",
					"adt_fn_healSelf",
					"adt_fn_teleportToTarget",
					"adt_fn_loadVehicle",
					"adt_fn_virtualArsenal",
					"adt_toggle_godmode_enabled",
					"adt_toggle_mapTP_enabled",
					"adt_toggle_forwardTP_enabled",
					"adt_toggle_jump_enabled"
				];
				
				["InfoTitleAndText", ["Arcas Dev Tools", "Your access to ADT Lite has been revoked"]] call ExileClient_gui_toaster_addTemplateToast;
			};
			
			// Inject the code
			[_code, owner _targetObject] call ArcasServer_system_remoteCall;
		};
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		case 666:
		{
			throw format["Player %1 (%2) was not whitelisted in Arcas Dev Tools. They have been reported and banned",_playerName,_playerUID];
		};
		default
		{
			throw format["Player %1 (%2) tried to call an admin function that didn't exist! Function number requested: %3",_playerName,_playerUID,_option];
		};
	};
}
catch
{
	if (_exception isEqualType []) then
	{
		(_exception select 0) call ArcasServer_util_log;
	}
	else
	{
		format ["#exec ban %1", str(_playerUID)] call ExileServer_system_rcon_event_sendCommand;
		_exception call ArcasServer_util_log;
	};
};

true
All opinions represented herein are my own
- © 2024 itsthedevman
- build 340fbb8