_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