diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 04dedda..fa96331 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,6 +13,12 @@ "isBuildCommand": true, "args": [ "-Build"] }, + { + "suppressTaskName": true, + "taskName": "Build All, Install and Run", + "isBuildCommand": true, + "args": [ "-Build", "-Install", "-Run"] + }, { "suppressTaskName": true, "taskName": "Install and Run Client (Arma 3)", diff --git a/@AdminToolkit/addons/admintoolkit.pbo b/@AdminToolkit/addons/admintoolkit.pbo index c682c2f..b2887a3 100644 Binary files a/@AdminToolkit/addons/admintoolkit.pbo and b/@AdminToolkit/addons/admintoolkit.pbo differ diff --git a/@AdminToolkit/addons/admintoolkit.pbo.admintoolkit.bisign b/@AdminToolkit/addons/admintoolkit.pbo.admintoolkit.bisign index 4ab1caf..5b75db6 100644 Binary files a/@AdminToolkit/addons/admintoolkit.pbo.admintoolkit.bisign and b/@AdminToolkit/addons/admintoolkit.pbo.admintoolkit.bisign differ diff --git a/@AdminToolkitServer/addons/admintoolkit_server.pbo b/@AdminToolkitServer/addons/admintoolkit_server.pbo index 26ec3cc..f7614f5 100644 Binary files a/@AdminToolkitServer/addons/admintoolkit_server.pbo and b/@AdminToolkitServer/addons/admintoolkit_server.pbo differ diff --git a/@AdminToolkitServer/addons/admintoolkit_servercfg.pbo b/@AdminToolkitServer/addons/admintoolkit_servercfg.pbo index b041595..8fc5458 100644 Binary files a/@AdminToolkitServer/addons/admintoolkit_servercfg.pbo and b/@AdminToolkitServer/addons/admintoolkit_servercfg.pbo differ diff --git a/@MissionFile/Exile.Tanoa.pbo b/@MissionFile/Exile.Tanoa.pbo index 106cde7..c2c3fa9 100644 Binary files a/@MissionFile/Exile.Tanoa.pbo and b/@MissionFile/Exile.Tanoa.pbo differ diff --git a/README.MissionFile.md b/README.MissionFile.md index fd62eab..7dfca09 100644 --- a/README.MissionFile.md +++ b/README.MissionFile.md @@ -81,45 +81,6 @@ Extensions[] = { - Once the menu is selected, it searches for the sqf file "MyExtension.sqf" in `atk\extension\MyExtension.sqf`. So, lets create this now: -``` -// atk\extension\MyExtension.sqf (located in MissionFile) -private['_result']; -disableSerialization; - -// add action command 'myext_hellotomyself' with the title 'Hello To Myself' -// the third parameter "false" skips the permission check - so admin AND moderator is allowed to execute -// NOTE: every action will be passed to the server with the command as unique identifier -['Hello To Myself', 'myext_hellotomyself', false] call AdminToolkit_addAction; - -// add action to send something to server (REQUIRES SERVER SQF - Read more below!!! ) -['Hello Server', 'myext_helloserver', false] call AdminToolkit_addAction; - - -// the callback, when "Run action" has been pressed -MyExtensionCallback = { - // AdminToolkit_Action is the current selected action - // AdminToolkit_Selection is the current selection from the list (either "Item 1" or "Item 2" - defined below) - // AdminToolkit_Params is the textbox where admin/moderator can enter addtional "parameters" - - if(AdminToolkit_Action == "myext_hellotomyself") then { - // when myext_hellotomyself is the action, show a message to myself - [format["Hello %1", name player]] call AdminToolkit_showMessage; - }; - - if(AdminToolkit_Action == "myext_helloserver") then { - // REQUIRES SERVER SQF - Read more below!!! - ['myext_helloserver', 'some secret text to the server'] call AdminToolkit_doAction; - }; -}; - -// when admin/moderator pressed the "Run action" button call the "MyExtensionCallback" code -["MyExtensionCallback"] call AdminToolkit_onExecute; - -// show two list items when menu is selected -_result = ["Item 1", "Item 2"]; -_result; -``` - As you can see, we have added to actions- The first (myext_hellotomyself) is a local call to showMessage only. The second (and more interesting) action is passed to the server. diff --git a/README.md b/README.md index 5374407..71083fd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ## AdminToolkit for Arma 3 -[![Version](https://img.shields.io/badge/Version-2.1.3-green.svg)](https://github.com/ole1986/a3-admintoolkit/releases) +[![Version](https://img.shields.io/badge/Version-2.2.0-green.svg)](https://github.com/ole1986/a3-admintoolkit/releases) [![Author](https://img.shields.io/badge/Author-ole1986-green.svg)](https://github.com/ole1986) [![Exile 1.0.3 Lemon](https://img.shields.io/badge/Exile-1.0.3%20Lemon-C72651.svg)](http://www.exilemod.com/devblog/103-update-lemon-r34/) [![Arma 1.76](https://img.shields.io/badge/Arma-1.76-blue.svg)](https://dev.arma3.com/post/sitrep-00203) diff --git a/setup.ps1 b/setup.ps1 index eba8ac6..624cda3 100644 --- a/setup.ps1 +++ b/setup.ps1 @@ -136,7 +136,8 @@ if($Install) { Write-Host -ForegroundColor Green "DONE" if($Run) { Write-Host -NoNewline "Running Arma 3..." - & "$GameFolder/arma3battleye.exe" 2 1 0 -exe arma3_x64.exe -nosplash -world=empty -skipIntro + Start-Process "$GameFolder/arma3battleye.exe" -ArgumentList '2','1','0','-exe arma3_x64.exe', '-mod="@Exile;@AdminToolkit"', '-nosplash', '-world empty', '-skipIntro' + #& "$GameFolder/arma3battleye.exe" 2 1 0 -exe arma3_x64.exe -mod="@Exile;@AdminToolkit" -nosplash -world=empty -skipIntro Write-Host -ForegroundColor Green "DONE" } } diff --git a/source/admintoolkit/bootstrap/fn_postInit.sqf b/source/admintoolkit/bootstrap/fn_postInit.sqf index 767d68c..99303d5 100644 --- a/source/admintoolkit/bootstrap/fn_postInit.sqf +++ b/source/admintoolkit/bootstrap/fn_postInit.sqf @@ -7,17 +7,15 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_name']; - -missionNamespace setVariable ['AdminToolkit_MainMenu', ['Players', 'Vehicles', 'Weapons', 'Buildings', 'Other', 'Items']]; +missionNamespace setVariable ['AdminToolkit_MainMenu', ['Players', 'Weapons', 'Vehicles', 'Buildings', 'Items']]; // The current Menu selection missionNamespace setVariable ['AdminToolkit_MenuIndex', nil]; -// take the selection from list -missionNamespace setVariable ['AdminToolkit_Selection', nil]; // The current selected action missionNamespace setVariable ['AdminToolkit_Action', nil]; +// The current detail view +missionNamespace setVariable ['AdminToolkit_Detail', nil]; // the current parameters being executed (dependent on the action) -missionNamespace setVariable ['AdminToolkit_Params', nil]; +missionNamespace setVariable ['AdminToolkit_Params', []]; // The current selected player (also used in spectator mode) missionNamespace setVariable ['AdminToolkit_Player', nil]; // all player netIds received from server @@ -34,7 +32,7 @@ missionNamespace setVariable ['AdminToolkit_permissionSet', []]; { // make all IDC number easily accessible // example "RscAdminToolkitTitle_IDC" returns the IDC of the Title of the dialog (which is 1900) - _name = format["%1_IDC", configName _x]; + private _name = format["%1_IDC", configName _x]; missionNamespace setVariable [_name , getNumber(_x >> "IDC")]; } forEach ("true" configClasses (configFile >> "AdminToolkitMenu")); @@ -51,7 +49,7 @@ missionNamespace setVariable ['AdminToolkit_permissionSet', []]; (findDisplay 46) displayAddEventHandler ["KeyDown","call AdminToolkit_bindKeyEvents;"]; systemChat "Logging into AdminToolkit..."; - ['login'] call AdminToolkit_doAction; + ['login', "someRandomStuff1231"] call AdminToolkit_doAction; }; diag_log "AdminToolkit postInit"; diff --git a/source/admintoolkit/bootstrap/fn_preInit.sqf b/source/admintoolkit/bootstrap/fn_preInit.sqf index 768d91d..bb11973 100644 --- a/source/admintoolkit/bootstrap/fn_preInit.sqf +++ b/source/admintoolkit/bootstrap/fn_preInit.sqf @@ -7,12 +7,10 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private ['_code', '_function', '_file']; - { - _code = ''; - _function = _x select 0; - _file = _x select 1; + private _code = ''; + private _function = _x select 0; + private _file = _x select 1; _code = compileFinal preprocessFileLineNumbers _file; @@ -26,8 +24,10 @@ forEach ['AdminToolkit_loadActions', 'admintoolkit\code\AdminToolkit_loadActions.sqf'], ['AdminToolkit_loadDetails', 'admintoolkit\code\AdminToolkit_loadDetails.sqf'], ['AdminToolkit_addMenu', 'admintoolkit\code\AdminToolkit_addMenu.sqf'], + ['AdminToolkit_addParam', 'admintoolkit\code\AdminToolkit_addParam.sqf'], ['AdminToolkit_doAction', 'admintoolkit\code\AdminToolkit_doAction.sqf'], ['AdminToolkit_onActionChanged', 'admintoolkit\code\AdminToolkit_onActionChanged.sqf'], + ['AdminToolkit_onDetailChanged', 'admintoolkit\code\AdminToolkit_onDetailChanged.sqf'], ['AdminToolkit_uiList', 'admintoolkit\code\AdminToolkit_uiList.sqf'], ['AdminToolkit_addAction', 'admintoolkit\code\AdminToolkit_addAction.sqf'], ['AdminToolkit_hasPermission', 'admintoolkit\code\AdminToolkit_hasPermission.sqf'], diff --git a/source/admintoolkit/code/AdminToolkit_addAction.sqf b/source/admintoolkit/code/AdminToolkit_addAction.sqf index 41c0fbb..c0faca4 100644 --- a/source/admintoolkit/code/AdminToolkit_addAction.sqf +++ b/source/admintoolkit/code/AdminToolkit_addAction.sqf @@ -7,12 +7,11 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_title', '_command', '_check', '_hasPerm', '_index']; +params['_title', '_command', '_check']; disableSerialization; -_title = _this select 0; -_command = _this select 1; -_check = _this select 2; +private _hasPerm = false; +private _index = 0; if(!(isNil "_check")) then { // skip the permission check diff --git a/source/admintoolkit/code/AdminToolkit_addMenu.sqf b/source/admintoolkit/code/AdminToolkit_addMenu.sqf index f9a56bb..e60478e 100644 --- a/source/admintoolkit/code/AdminToolkit_addMenu.sqf +++ b/source/admintoolkit/code/AdminToolkit_addMenu.sqf @@ -7,10 +7,11 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_title', '_ext', '_index', '_code', '_size']; +params['_title', '_ext']; disableSerialization; -_title = _this select 0; +private _index = 0; +private _code = {}; _index = lbAdd [RscAdminToolkitMainMenu_IDC, _title]; // if extension parameter is set, load the file! diff --git a/source/admintoolkit/code/AdminToolkit_addParam.sqf b/source/admintoolkit/code/AdminToolkit_addParam.sqf new file mode 100644 index 0000000..31eef6c --- /dev/null +++ b/source/admintoolkit/code/AdminToolkit_addParam.sqf @@ -0,0 +1,20 @@ +params ['_value', '_pos']; + +if(!isNil "_pos") then { + _pos = parseNumber (_pos); +}; + +if(typeName AdminToolkit_Params != "ARRAY") then { + AdminToolkit_Params = []; +}; + +_size = (count AdminToolkit_Params); + +if(_size > 0 && !isNil "_pos") then { + if((_pos + 1) <= _size) then { + AdminToolkit_Params set [_pos, _value]; + }; +} else { + AdminToolkit_Params pushBack _value; +}; + diff --git a/source/admintoolkit/code/AdminToolkit_bindKeyEvents.sqf b/source/admintoolkit/code/AdminToolkit_bindKeyEvents.sqf index ab77d3c..55c6703 100644 --- a/source/admintoolkit/code/AdminToolkit_bindKeyEvents.sqf +++ b/source/admintoolkit/code/AdminToolkit_bindKeyEvents.sqf @@ -6,11 +6,12 @@ * * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ - -private['_handled']; -_handled = false; -switch (_this select 1) do +params['_control','_keydown']; + +private _handled = false; + +switch (_keydown) do { // Function Key 2 (F2) case 0x3C: diff --git a/source/admintoolkit/code/AdminToolkit_doAction.sqf b/source/admintoolkit/code/AdminToolkit_doAction.sqf index 11cd270..16e39bd 100644 --- a/source/admintoolkit/code/AdminToolkit_doAction.sqf +++ b/source/admintoolkit/code/AdminToolkit_doAction.sqf @@ -7,100 +7,53 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_action', '_selection', '_tmp', '_tmp2', '_IDC']; + /** + * _action STRING what action + * _params ARRAY array of parameters for the action + * + */ +params['_action', '_params']; + +private _tmp = ''; try { - if(count _this > 0) then { - _action = _this select 0; - } else { - _action = AdminToolkit_Action; + if(count _this < 1) then { + throw 'AdminToolkit_doAction requires at least one parameter'; }; - - if(isNil "_action") throw "NO ACTION SELECTED"; - _IDC = RscAdminToolkitDetailList_IDC; - - if((count _this) > 1) then { - _selection = _this select 1; - } else { - switch (_action) do - { - case 'login': - { - _selection = ''; - }; - case 'message': - { - _tmp = lbData [_IDC, lbCurSel _IDC]; - _selection = [_tmp, AdminToolkit_Params]; - }; - case 'messageall': { - _selection = AdminToolkit_Params; - }; - case 'givevehicle': - { - if(isNil "AdminToolkit_Player") then { throw "No player selected"; }; - - _selection = [lbData [_IDC, lbCurSel _IDC], netId AdminToolkit_Player]; - }; - case 'removevehicle': { - _selection = [lbData [_IDC, lbCurSel _IDC]]; - }; - case 'getweapon': { - _tmp = lbData [_IDC, lbCurSel _IDC]; - _tmp2 = [_tmp] call AdminToolkit_weaponMagazine; - - // parameter 1: weapon class name or empty when already in inventory - // parameter 2: compatible magazine - _selection = [_tmp, _tmp2]; - }; - case 'getammo': { - _tmp = lbData [_IDC, lbCurSel _IDC]; - _tmp2 = [_tmp] call AdminToolkit_weaponMagazine; - - // parameter 1: compatible magazine - _selection = [_tmp2]; - }; - case 'giveammo': { - _tmp = lbData [_IDC, lbCurSel _IDC]; + switch(_action) do { + case 'message': { + _tmp = ctrlText RscAdminToolkitParam_IDC; + _params pushBack _tmp; + }; + case 'messageall': { + _tmp = ctrlText RscAdminToolkitParam_IDC; + _params pushBack _tmp; + }; + case 'spawn': { + _tmp = player modelToWorld [0,2, (position player) select 2]; + _params pushBack _tmp; + }; + case 'getweapon': { + _tmp = _params select 0; + _tmp = [_tmp] call AdminToolkit_weaponMagazine; + + _params pushBack _tmp; + }; + case 'getammo': { + _tmp = _params select 0; + _tmp = [_tmp] call AdminToolkit_weaponMagazine; - systemChat format["Giving ammo to %1", _tmp]; - _selection = _tmp; - }; - case 'spawn': { - _tmp = lbData [_IDC, lbCurSel _IDC]; - _tmp2 = player modelToWorld [0,2, (position player) select 2]; - - systemChat format["spawn: %1 %2", _tmp, str _tmp2]; - _selection = [_tmp, _tmp2]; - }; - case 'build': { - _selection = lbData [_IDC, lbCurSel _IDC]; - }; - case 'buildpers': { - AdminToolkitIsBuildingPersistent = true; - _selection = lbData [_IDC, lbCurSel _IDC]; - }; - case 'buildremove': { - _tmp = cursorObject; - if !(isNull _tmp) then { - _selection = [netId _tmp, getPosASL _tmp]; - } else { - systemChat "No building found"; - _selection = nil; - }; - }; - default - { - _selection = lbData [_IDC, lbCurSel _IDC]; - }; - }; + _params = [_tmp]; + }; }; - if !(isNil "_selection") then { - [player, _action, _selection] remoteExecCall ['AdminToolkit_network_receiveRequest', 2]; + if (!isNil "_params") then { + [player, _action, _params] remoteExecCall ['AdminToolkit_network_receiveRequest', 2]; systemChat format["Command '%1' executed", _action]; - AdminToolkit_LastAction = [_action, _selection]; + AdminToolkit_LastAction = [_action, _params]; + } else { + systemChat format["ERROR: No parameters for '%1'", _action]; }; } catch { systemChat format['EXCEPTION: %1', _exception]; diff --git a/source/admintoolkit/code/AdminToolkit_hasPermission.sqf b/source/admintoolkit/code/AdminToolkit_hasPermission.sqf index 76378a3..0e9f957 100644 --- a/source/admintoolkit/code/AdminToolkit_hasPermission.sqf +++ b/source/admintoolkit/code/AdminToolkit_hasPermission.sqf @@ -7,11 +7,10 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_action', '_permissionSet', '_result']; -_action = _this select 0; +params['_action']; -_result = true; -_permissionSet = missionNamespace getVariable ['AdminToolkit_permissionSet', []]; +private _result = true; +private _permissionSet = missionNamespace getVariable ['AdminToolkit_permissionSet', []]; if((count _permissionSet > 0) && !(_action in _permissionSet)) then { _result = false; diff --git a/source/admintoolkit/code/AdminToolkit_initMenu.sqf b/source/admintoolkit/code/AdminToolkit_initMenu.sqf index b0e4a9c..664e2c5 100644 --- a/source/admintoolkit/code/AdminToolkit_initMenu.sqf +++ b/source/admintoolkit/code/AdminToolkit_initMenu.sqf @@ -7,15 +7,13 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_display', '_extensions', '_IDC', '_i']; disableSerialization; -_display = findDisplay 40000; +private _display = findDisplay 40000; +private _extensions = getArray(missionConfigFile >> 'CfgAdminToolkitCustomMod' >> 'ExcludeMenu'); // show the title of its tool (_display displayCtrl RscAdminToolkitTitle_IDC) ctrlSetStructuredText parseText "AdminToolkit Main Menu"; -_extensions = getArray(missionConfigFile >> 'CfgAdminToolkitCustomMod' >> 'ExcludeMenu'); - // load the default menu into main menu combo box { if (_extensions find _x == -1) then { @@ -35,10 +33,10 @@ if(isClass(missionConfigFile >> 'CfgAdminToolkitCustomMod')) then { // quick access buttons QUICK 1 - 4 ( RscAdminToolkitQuickX_IDC ) if(isArray(missionConfigFile >> 'CfgAdminToolkitCustomMod' >> 'QuickButtons')) then { - _i = 1; + private _i = 1; _extensions = getArray(missionConfigFile >> 'CfgAdminToolkitCustomMod' >> 'QuickButtons'); { - _IDC = missionNamespace getVariable format["RscAdminToolkitQuick%1_IDC", _i]; + private _IDC = missionNamespace getVariable format["RscAdminToolkitQuick%1_IDC", _i]; ctrlSetText [_IDC, _x select 0]; buttonSetAction [_IDC, _x select 1]; _i = _i + 1; @@ -51,9 +49,6 @@ if(!isNil "AdminToolkit_MenuIndex") then { call AdminToolkit_loadActions; }; -AdminToolkit_Selection = nil; -AdminToolkit_Player = nil; - // hide the second list initially false call AdminToolkit_toggleDetail; @@ -67,6 +62,12 @@ if(!(isDamageAllowed player)) then { (_display displayCtrl RscAdminToolkitActionLabel_IDC) ctrlSetStructuredText parseText "Pick an entry from Main Menu to display the actions"; }; +// Requesting players list +[] spawn { + systemChat "Loading players..."; + [player, 'getplayers'] remoteExecCall ['AdminToolkit_network_receiveRequest', 2]; +}; + // hide the parameters edit field by default (_display displayCtrl RscAdminToolkitParam_IDC) ctrlShow false; @@ -77,8 +78,10 @@ if(!(isDamageAllowed player)) then { (_display displayCtrl RscAdminToolkitEditAction_IDC) ctrlSetEventHandler ["KeyDown", "if ((_this select 1) == 0x1C or (_this select 1) == 0x9C) then { call AdminToolkit_loadActions };"]; // setup the event onLbSelChanged for the centered listbox -//(_display displayCtrl RscAdminToolkitDetailList_IDC) ctrlSetEventHandler ['LBSelChanged', "call AdminToolkit_onListboxChanged"]; +(_display displayCtrl RscAdminToolkitDetailList_IDC) ctrlSetEventHandler ['LBSelChanged', "call AdminToolkit_onDetailChanged"]; (_display displayCtrl RscAdminToolkitEditDetail_IDC) ctrlSetEventHandler ["KeyDown", "if ((_this select 1) == 0x1C or (_this select 1) == 0x9C) then { call AdminToolkit_loadDetails };"]; (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText ""; -(_display displayCtrl RscAdminToolkitParam_IDC) ctrlSetEventHandler ['KillFocus', "AdminToolkit_Params = ctrlText RscAdminToolkitParam_IDC"]; + +// define the AdminToolkit_OnExecute event used by the Run button - overwritable by extensions +buttonSetAction [RscAdminToolkitRun_IDC, 'call AdminToolkit_OnExecute']; \ No newline at end of file diff --git a/source/admintoolkit/code/AdminToolkit_loadActions.sqf b/source/admintoolkit/code/AdminToolkit_loadActions.sqf index 1697c57..6390450 100644 --- a/source/admintoolkit/code/AdminToolkit_loadActions.sqf +++ b/source/admintoolkit/code/AdminToolkit_loadActions.sqf @@ -7,19 +7,21 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_filter','_display','_menuIndex', '_menuName', '_menuData', '_list', '_displayName']; disableSerialization; -_display = findDisplay 40000; + +private _display = findDisplay 40000; +private _list = []; +private _displayName = '(unknown)'; // receive the selected index and name from the Main Menu combobox -_menuIndex = lbCurSel RscAdminToolkitMainMenu_IDC; -_menuName = lbText [RscAdminToolkitMainMenu_IDC, _menuIndex]; -_menuData = lbData [RscAdminToolkitMainMenu_IDC, _menuIndex]; +private _menuIndex = lbCurSel RscAdminToolkitMainMenu_IDC; +private _menuName = lbText [RscAdminToolkitMainMenu_IDC, _menuIndex]; +private _menuData = lbData [RscAdminToolkitMainMenu_IDC, _menuIndex]; AdminToolkit_MenuIndex = _menuIndex; // ### Search filter -_filter = ctrlText RscAdminToolkitEditAction_IDC; +private _filter = ctrlText RscAdminToolkitEditAction_IDC; if(_filter != "") then { // search filter is set, so reset the textbox ctrlSetText [RscAdminToolkitEditAction_IDC, ""]; @@ -35,15 +37,13 @@ lbSetCurSel [RscAdminToolkitActionList_IDC, -1]; false call AdminToolkit_toggleDetail; -missionNamespace setVariable ['AdminToolkit_OnExecute', {AdminToolkit_Params = ctrlText RscAdminToolkitParam_IDC; [] call AdminToolkit_doAction;}]; +// Prepare the execution event used by the Run button event - overwritable by extensions +missionNamespace setVariable ['AdminToolkit_OnExecute', { [AdminToolkit_Action, AdminToolkit_Params] call AdminToolkit_doAction; }]; _menuName = toLower _menuName; switch (_menuName) do { case "players": { - // get player list from server while doing a receiveRequest - [player, 'getplayers'] remoteExecCall ['AdminToolkit_network_receiveRequest', 2]; - _list = [ ["Send Message", "message"], ["Send Message to ALL", "messageall"], @@ -74,20 +74,16 @@ switch (_menuName) do { _list = [ ["Build (temporary)", 'build'], ["Build (persistent)", 'buildpers'], - ["Remove", "buildremove"], + ["Remove (nearby)", "buildremove"], ["Status", 'buildinfopersistent'], ["Save Persistent", 'savepersistent'], ["Clear Persistent", 'clearpersistent'] ]; }; - case "other": { - _list = [ - ["Spawn", 'spawn'] - ]; - }; case "items": { _list = [ - ["Get Item", 'getitem'] + ["Get Item", 'getitem'], + ["Spawn", 'spawn'] ]; }; default { @@ -111,7 +107,4 @@ switch (_menuName) do { }; } forEach _list; -// set execute button to di the action -buttonSetAction [RscAdminToolkitRun_IDC, '[] call AdminToolkit_OnExecute']; - true; \ No newline at end of file diff --git a/source/admintoolkit/code/AdminToolkit_loadDetails.sqf b/source/admintoolkit/code/AdminToolkit_loadDetails.sqf index b945f83..d751836 100644 --- a/source/admintoolkit/code/AdminToolkit_loadDetails.sqf +++ b/source/admintoolkit/code/AdminToolkit_loadDetails.sqf @@ -7,14 +7,16 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_filter','_display', '_list', '_tmp', '_tmp2', '_show', '_menuData', '_extCode']; disableSerialization; -_display = findDisplay 40000; -_show = false; +private _display = findDisplay 40000; +private _show = false; +private _list = []; +private _tmp = ''; +private _tmp2 = ''; // ### Search filter -_filter = ctrlText RscAdminToolkitEditDetail_IDC; +private _filter = ctrlText RscAdminToolkitEditDetail_IDC; if(_filter != "") then { // search filter is set, so reset the textbox ctrlSetText [RscAdminToolkitEditDetail_IDC, ""]; @@ -24,8 +26,10 @@ if(_filter != "") then { // clear details list lbClear RscAdminToolkitDetailList_IDC; +lbSetCurSel [RscAdminToolkitDetailList_IDC, -1]; -switch (AdminToolkit_Action) do { +switch (AdminToolkit_Detail) do { + case "_players"; case "message"; case "tp2player"; case "tpplayer"; @@ -41,6 +45,7 @@ switch (AdminToolkit_Action) do { } forEach AdminToolkit_Players; _show = true; }; + case "givevehicle"; case "getvehicle": { _list = "((getText(_x >> 'VehicleClass') in ['Car', 'Armored', 'Air']) and (getNumber(_x >> 'scope') == 2))" configClasses (configFile >> "CfgVehicles"); [RscAdminToolkitDetailList_IDC, _list, _filter] call AdminToolkit_uiList; @@ -63,6 +68,11 @@ switch (AdminToolkit_Action) do { [RscAdminToolkitDetailList_IDC, _list, _filter] call AdminToolkit_uiList; _show = true; }; + case "buildremove": { + _list = nearestObjects [player, ["House", "Building"], 50]; + [RscAdminToolkitDetailList_IDC, _list, _filter] call AdminToolkit_uiList; + _show = true; + }; case "spawn": { _list ="((configName _x isKindOf 'ReammoBox') and (getNumber(_x >> 'scope') == 2))" configClasses (configFile >> "CfgVehicles"); [RscAdminToolkitDetailList_IDC, _list, _filter] call AdminToolkit_uiList; @@ -75,7 +85,6 @@ switch (AdminToolkit_Action) do { }; case "messageall"; case "godmodeoff"; - case "givevehicle"; case "buildremove"; case "buildinfopersistent"; case "savepersistent"; @@ -85,8 +94,8 @@ switch (AdminToolkit_Action) do { /* manage all non extension actions not listed above */ }; default { - _menuData = lbData [RscAdminToolkitMainMenu_IDC, AdminToolkit_MenuIndex]; - _extCode = missionNamespace getVariable [format["%1_loadDetails", _menuData], ""]; + private _menuData = lbData [RscAdminToolkitMainMenu_IDC, AdminToolkit_MenuIndex]; + private _extCode = missionNamespace getVariable [format["%1_loadDetails", _menuData], ""]; if(typeName _extCode == "CODE") then { systemChat format["Calling %1 action %2", _menuData, _value]; _show = [_filter] call _extCode; diff --git a/source/admintoolkit/code/AdminToolkit_moveStart.sqf b/source/admintoolkit/code/AdminToolkit_moveStart.sqf index 05060a3..5dd595a 100644 --- a/source/admintoolkit/code/AdminToolkit_moveStart.sqf +++ b/source/admintoolkit/code/AdminToolkit_moveStart.sqf @@ -6,12 +6,14 @@ * * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ - -private['_position', '_objectDistance', '_playerDir']; +/** + * _netId STRING the netId of an object to be moved + */ +params['_netId']; try { // gather the object created from server through the netId - AdminToolkitBuildingObject = objectFromNetId (_this select 0); + AdminToolkitBuildingObject = objectFromNetId _netId; // if the object is null throw an exception before starting build progress if (isNull AdminToolkitBuildingObject) then { throw "No object received from server"; }; diff --git a/source/admintoolkit/code/AdminToolkit_moveStop.sqf b/source/admintoolkit/code/AdminToolkit_moveStop.sqf index b802960..e8ed555 100644 --- a/source/admintoolkit/code/AdminToolkit_moveStop.sqf +++ b/source/admintoolkit/code/AdminToolkit_moveStop.sqf @@ -7,9 +7,7 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_canceled']; - -_canceled = _this select 0; +params['_canceled']; if !(isNil "_canceled") then { AdminToolkitIsBuilding = -1; diff --git a/source/admintoolkit/code/AdminToolkit_moveThread.sqf b/source/admintoolkit/code/AdminToolkit_moveThread.sqf index fc0731c..4674567 100644 --- a/source/admintoolkit/code/AdminToolkit_moveThread.sqf +++ b/source/admintoolkit/code/AdminToolkit_moveThread.sqf @@ -6,11 +6,10 @@ * * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ - -private['_position', '_vectorUp', '_rotation', '_vectorDirection']; - -_position = [0, 0, 0]; -_vectorUp = [0, 0, 1]; +private _position = [0, 0, 0]; +private _vectorUp = [0, 0, 1]; +private _rotation = 0; +private _vectorDirection = [0,0,0]; while {AdminToolkitIsBuilding isEqualTo 1} do { @@ -27,10 +26,10 @@ while {AdminToolkitIsBuilding isEqualTo 1} do // destroy the object when AdminToolkitBuildingObject is set to -1 if(AdminToolkitIsBuilding isEqualTo -1) then { hint parseText "Construction aborted"; - [player, "buildabort", netId AdminToolkitBuildingObject] remoteExecCall ['AdminToolkit_network_receiveRequest', 2]; + ['buildabort', [netId AdminToolkitBuildingObject]] call AdminToolkit_doAction; } else { - if (AdminToolkitIsBuildingPersistent) then { - [player, "buildpersistent", [typeOf AdminToolkitBuildingObject, getPosASL AdminToolkitBuildingObject, getDir AdminToolkitBuildingObject]] remoteExecCall ['AdminToolkit_network_receiveRequest', 2]; + if (!isNil "AdminToolkitIsBuildingPersistent") then { + ['buildpersistent', [netId AdminToolkitBuildingObject, _position, getDir AdminToolkitBuildingObject]] call AdminToolkit_doAction; AdminToolkitIsBuildingPersistent = nil; }; hint parseText "Construction placed"; diff --git a/source/admintoolkit/code/AdminToolkit_network_receiveResponse.sqf b/source/admintoolkit/code/AdminToolkit_network_receiveResponse.sqf index 54e7afe..836ac26 100644 --- a/source/admintoolkit/code/AdminToolkit_network_receiveResponse.sqf +++ b/source/admintoolkit/code/AdminToolkit_network_receiveResponse.sqf @@ -7,14 +7,13 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private["_request", "_params", '_tmp', '_tmp2']; +params["_request", "_params"]; + +private _tmp = ''; +private _tmp2 = ''; + try -{ - _request = _this select 0; // what to do - _params = _this select 1; // mixed value - - //systemChat format["[ADMINTOOLKIT]: networkResponse: %1", _request]; - +{ switch(_request) do { //system case 'loginok': { @@ -27,6 +26,7 @@ try //player case 'getplayers': { missionNamespace setVariable ['AdminToolkit_Players', _params]; + systemChat "Players loaded!"; }; case 'message': { _params call AdminToolkit_showMessage; @@ -38,18 +38,27 @@ try [_params] call AdminToolkit_spectatePlayer; }; //Building - case 'buildpers'; + case 'buildpers': { + AdminToolkitIsBuildingPersistent = true; + // the netId of its vehicle created from the server + [_params] call AdminToolkit_moveStart; + }; case 'build': { // the netId of its vehicle created from the server [_params] call AdminToolkit_moveStart; }; case 'buildinfopersistent': { - _tmp = _params select 1; - if (isNil "_tmp") then { - hint parseText "AdminToolkit

NOT SAVED YET"; - } else { - hint parseText format["AdminToolkit
%1 persistent objects stored in serverProfile", str (_params select 0)]; + _tmp = _params select 0; + _tmp2 = _params select 1; + + private _text = "AdminToolkit
"; + + _text = _text + format["%1 persistent buildings stored on server", str _tmp]; + if (!_tmp2) then { + _text = _text + "
NOT SAVED YET"; }; + + hint parseText _text; }; case 'clearpersistent': { hint parseText format["AdminToolkit

Persistent objects cleared
Buildings will be removed after server restart", str _params]; diff --git a/source/admintoolkit/code/AdminToolkit_onActionChanged.sqf b/source/admintoolkit/code/AdminToolkit_onActionChanged.sqf index ed142d9..ca52954 100644 --- a/source/admintoolkit/code/AdminToolkit_onActionChanged.sqf +++ b/source/admintoolkit/code/AdminToolkit_onActionChanged.sqf @@ -7,17 +7,25 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_display','_index','_text', '_value']; -_display = findDisplay 40000; +/** + * _control CONTROL the listbox + * _index NUMBER the current selected index of the listbox + */ +params['_control', '_index']; +private _display = findDisplay 40000; + +private _text = lbText [RscAdminToolkitActionList_IDC, _index]; +private _value = lbData [RscAdminToolkitActionList_IDC, _index]; -_index = lbCurSel RscAdminToolkitActionList_IDC; -_text = lbText [RscAdminToolkitActionList_IDC, _index]; -_value = lbData [RscAdminToolkitActionList_IDC, _index]; +if(_index < 0) exitWith {}; AdminToolkit_Action = _value; +AdminToolkit_Detail = _value; +AdminToolkit_Params = []; // hide the parameters edit field by default (_display displayCtrl RscAdminToolkitParam_IDC) ctrlShow false; +(_display displayCtrl RscAdminToolkitParam_IDC) ctrlSetText ""; (_display displayCtrl RscAdminToolkitRun_IDC) ctrlShow true; (_display displayCtrl RscAdminToolkitRepeat_IDC) ctrlShow true; @@ -55,12 +63,30 @@ switch (_value) do { case 'godmodeoff': { (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "IMPORTANT: Godmode works only for you"; }; - case 'buildremove'; case 'givevehicle': { - (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "Temporary offline"; - (_display displayCtrl RscAdminToolkitRun_IDC) ctrlShow false; - (_display displayCtrl RscAdminToolkitRepeat_IDC) ctrlShow false; - }; + (_display displayCtrl RscAdminToolkitDetailLabel_IDC) ctrlSetStructuredText parseText "Step 1: Select vehicle"; + }; + case 'build': { + (_display displayCtrl RscAdminToolkitDetailLabel_IDC) ctrlSetStructuredText parseText "Select a building"; + (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "Tempoary buildings are gone after server restart"; + }; + case 'buildpers': { + (_display displayCtrl RscAdminToolkitDetailLabel_IDC) ctrlSetStructuredText parseText "Select a building"; + (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "These buildings are stored in serverProfie"; + }; + case 'buildremove': { + (_display displayCtrl RscAdminToolkitDetailLabel_IDC) ctrlSetStructuredText parseText "Select a nearby building"; + (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "PLEASE NOTE: Map related objects cannot be removed"; + }; + case 'buildinfopersistent': { + (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "Show information about persistent buildings"; + }; + case 'savepersistent': { + (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "Stores the buildings to keep after server restart"; + }; + case 'clearpersistent': { + (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "THIS WILL REMOVE ALL PERSISTENT BUILDINGS FROM ATK"; + }; }; call AdminToolkit_loadDetails; \ No newline at end of file diff --git a/source/admintoolkit/code/AdminToolkit_onDetailChanged.sqf b/source/admintoolkit/code/AdminToolkit_onDetailChanged.sqf new file mode 100644 index 0000000..d9bf5ed --- /dev/null +++ b/source/admintoolkit/code/AdminToolkit_onDetailChanged.sqf @@ -0,0 +1,39 @@ +/** + * AdminToolkit + * + * Author: ole1986 + * Website: https://github.com/ole1986/a3-admintoolkit + * + * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. + */ + +/** + * _control CONTROL the listbox + * _index NUMBER the current selected index of the listbox + */ +params['_control', '_index']; + +private _display = findDisplay 40000; + +private _text = lbText [RscAdminToolkitDetailList_IDC, _index]; +private _value = lbData [RscAdminToolkitDetailList_IDC, _index]; + +if(_index < 0) exitWith {}; + +switch (AdminToolkit_Action) do { + case "givevehicle": { + if(count AdminToolkit_Params < 1) then { + [_value] call AdminToolkit_addParam; + AdminToolkit_Detail = '_players'; + call AdminToolkit_loadDetails; + (_display displayCtrl RscAdminToolkitDetailLabel_IDC) ctrlSetStructuredText parseText "Step 2: Select player"; + } else { + [_value] call AdminToolkit_addParam; + (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "Step 3: Press Run"; + }; + }; + default { + AdminToolkit_Params = []; + [_value] call AdminToolkit_addParam; + }; +}; \ No newline at end of file diff --git a/source/admintoolkit/code/AdminToolkit_spectatePlayer.sqf b/source/admintoolkit/code/AdminToolkit_spectatePlayer.sqf index cc8c2a4..eb645b2 100644 --- a/source/admintoolkit/code/AdminToolkit_spectatePlayer.sqf +++ b/source/admintoolkit/code/AdminToolkit_spectatePlayer.sqf @@ -7,7 +7,7 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_player', '_info']; +params['_player']; if (!isNil "AdminToolkit_camera") then { (findDisplay 46) displayRemoveEventHandler ["KeyDown", AdminToolkit_cameraKeyDownId]; @@ -19,10 +19,10 @@ if (!isNil "AdminToolkit_camera") then { systemChat "Spectating stopped"; } else { - AdminToolkit_Player = vehicle (_this select 0); + AdminToolkit_Player = vehicle _player; // show user friendly message - _info = "The following keyboard keys can be used

Q/E = first/3rd person, W/A/S/D = Change camera perspective, ESC = Stop spectating
"; + private _info = "The following keyboard keys can be used

Q/E = first/3rd person, W/A/S/D = Change camera perspective, ESC = Stop spectating
"; [format["Spectating %1", name AdminToolkit_Player], _info] call AdminToolkit_showMessage; systemChat format["Spectating %1", name AdminToolkit_Player]; diff --git a/source/admintoolkit/code/AdminToolkit_toggleDetail.sqf b/source/admintoolkit/code/AdminToolkit_toggleDetail.sqf index 30acdf6..dfd49aa 100644 --- a/source/admintoolkit/code/AdminToolkit_toggleDetail.sqf +++ b/source/admintoolkit/code/AdminToolkit_toggleDetail.sqf @@ -1,7 +1,6 @@ -private ['_toggle', '_display']; disableSerialization; -_toggle = _this; -_display = findDisplay 40000; +private _toggle = _this; +private _display = findDisplay 40000; (_display displayCtrl RscAdminToolkitDetailList_IDC) ctrlShow _toggle; (_display displayCtrl RscAdminToolkitEditDetail_IDC) ctrlShow _toggle; diff --git a/source/admintoolkit/code/AdminToolkit_uiList.sqf b/source/admintoolkit/code/AdminToolkit_uiList.sqf index 81d60c1..a57b886 100644 --- a/source/admintoolkit/code/AdminToolkit_uiList.sqf +++ b/source/admintoolkit/code/AdminToolkit_uiList.sqf @@ -7,17 +7,17 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_listboxId','_list', '_filter','_index', '_className', '_displayName', '_picture']; +params['_listboxId','_list', '_filter']; disableSerialization; -// listbox IDC -_listboxId = _this select 0; -// array of config classes -_list = _this select 1; // string filter expression -_filter = toLower (_this select 2); -_picture = ""; +_filter = toLower _filter; + +private _index = nil; +private _className = ''; +private _displayName = ''; +private _picture = ''; + { - _index = nil; // get the weapon, vehicle, item CLASS name, like "B_Heli_Light_01_F" if(typeName _x == "CONFIG") then { _className = configName _x; diff --git a/source/admintoolkit/code/AdminToolkit_weaponMagazine.sqf b/source/admintoolkit/code/AdminToolkit_weaponMagazine.sqf index 303f47e..54b820d 100644 --- a/source/admintoolkit/code/AdminToolkit_weaponMagazine.sqf +++ b/source/admintoolkit/code/AdminToolkit_weaponMagazine.sqf @@ -7,10 +7,8 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_weaponClass', '_result']; -_weaponClass = _this select 0; -_result = ''; +params['_weaponClass']; +private _result = ''; _result = getArray (configFile >> "CfgWeapons" >> _weaponClass >> "magazines"); -_result = _result select 0; -_result; \ No newline at end of file +_result select 0; \ No newline at end of file diff --git a/source/admintoolkit_server/bootstrap/fn_preInit.sqf b/source/admintoolkit_server/bootstrap/fn_preInit.sqf index dc74e33..b89ab9b 100644 --- a/source/admintoolkit_server/bootstrap/fn_preInit.sqf +++ b/source/admintoolkit_server/bootstrap/fn_preInit.sqf @@ -6,13 +6,12 @@ * * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ - -private ['_code', '_function', '_file']; + +private _code = ''; { - _code = ''; - _function = _x select 0; - _file = _x select 1; + private _function = _x select 0; + private _file = _x select 1; _code = compileFinal (preprocessFileLineNumbers _file); diff --git a/source/admintoolkit_server/code/AdminToolkit_loadProfile.sqf b/source/admintoolkit_server/code/AdminToolkit_loadProfile.sqf index 72bc880..800dd3d 100644 --- a/source/admintoolkit_server/code/AdminToolkit_loadProfile.sqf +++ b/source/admintoolkit_server/code/AdminToolkit_loadProfile.sqf @@ -6,26 +6,25 @@ * * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ - -private['_section', '_create', '_result', '_name', '_pos', '_rot', '_obj', "_tmp"]; -_section = _this select 0; -_create = _this select 1; -_result = profileNamespace getVariable [format["ATK_PERSISTENT_%1", _section], []]; +params['_section', '_create']; + +private _result = profileNamespace getVariable [format["ATK_PERSISTENT_%1", _section], []]; if(_create) then { switch (_section) do { case "BUILDINGS": { { - _name = _x select 0; - _pos = _x select 1; - _rot = _x select 2; + private _name = _x select 0; + private _pos = _x select 1; + private _rot = _x select 2; diag_log format["[ADMINTOOLKIT] createVehicle '%1' at pos '%2'", _name, str _pos]; - _obj = createVehicle [_name, _pos, [], 0, "CAN_COLLIDE"]; + private _obj = createVehicle [_name, _pos, [], 0, "CAN_COLLIDE"]; + _obj setVariable ["ATK_IsPersistent", true]; _obj setVariable ["BIS_enableRandomization", false]; - _obj setPosASL _pos; _obj setDir _rot; + _obj setPosATL _pos; } forEach _result; }; default { }; diff --git a/source/admintoolkit_server/code/AdminToolkit_network_fetchPlayer.sqf b/source/admintoolkit_server/code/AdminToolkit_network_fetchPlayer.sqf index adb9fed..e06ca0a 100644 --- a/source/admintoolkit_server/code/AdminToolkit_network_fetchPlayer.sqf +++ b/source/admintoolkit_server/code/AdminToolkit_network_fetchPlayer.sqf @@ -15,10 +15,10 @@ * Usage: [nil, true] call admintoolkit_fetchPlayer; // returns the player name only matching "playername" or nil * Usage: call admintoolkit_fetchPlayer; // returns the array of all player units or nil if no player is available */ -private['_match', '_nameOnly', '_result']; -_nameOnly = false; -_match = ''; -_result = []; +private _nameOnly = false; +private _match = ''; +private _result = []; + if(typeName _this == "ARRAY") then { _match = _this select 0; if(count _this > 1) then { _nameOnly = _this select 1; }; diff --git a/source/admintoolkit_server/code/AdminToolkit_network_receiveRequest.sqf b/source/admintoolkit_server/code/AdminToolkit_network_receiveRequest.sqf index 9c20070..f675546 100644 --- a/source/admintoolkit_server/code/AdminToolkit_network_receiveRequest.sqf +++ b/source/admintoolkit_server/code/AdminToolkit_network_receiveRequest.sqf @@ -6,25 +6,30 @@ * * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ - -private["_safepos","_payload","_adminList", "_moderatorList", "_moderatorCmds","_player","_request", "_params","_result", "_tmp", "_mod"]; -_payload = _this; -_adminList = getArray(configFile >> "CfgSettings" >> "AdminToolkit" >> "AdminList"); -_moderatorList = getArray(configFile >> "CfgSettings" >> "AdminToolkit" >> "ModeratorList"); -_moderatorCmds = []; -_result = true; + +/** + * _player OBJECT player + * _request STRING request + * _params ARRAY additional parameters + */ +params['_player', '_request', '_params']; + +private _adminList = getArray(configFile >> "CfgSettings" >> "AdminToolkit" >> "AdminList"); +private _moderatorList = getArray(configFile >> "CfgSettings" >> "AdminToolkit" >> "ModeratorList"); +private _moderatorCmds = []; +private _result = true; +private _tmp = ''; +private _mod = ''; + try { - _player = _payload select 0; - _request = _payload select 1; // what to do - _params = _payload select 2; // an array of parameters if !( getPlayerUID _player in (_adminList + _moderatorList) ) then { ['loginfailed', ''] remoteExecCall ['AdminToolkit_network_receiveResponse', owner _player]; throw format ["Player %1 with UID %2 does not have access", name _player, getPlayerUID _player]; }; - diag_log format ["[ADMINTOOLKIT] Calling %1 from player %2", _request, name _player]; + diag_log format ["[ADMINTOOLKIT] Calling %1 from player %2, params: %3", _request, name _player, str _params]; // if its a moderator, check if commands is allowed if ( getPlayerUID _player in _moderatorList ) then { @@ -53,7 +58,7 @@ try // initialize the spectator mode (client callback required) // Example: [player, 'specplayer', netId] case "specplayer": { - _tmp = objectFromNetId _params; + _tmp = objectFromNetId (_params select 0); if(!(isNil "_tmp") && (typeName _tmp == "OBJECT")) then { [_request, netId _tmp] remoteExecCall ['AdminToolkit_network_receiveResponse', owner _player]; }; @@ -63,12 +68,11 @@ try ['message', [_params select 1, format["Sender: %1", name _player]]] remoteExecCall ['AdminToolkit_network_receiveResponse', owner _tmp]; }; case 'messageall': { - diag_log format ["[ADMINTOOLKIT] messageall params: %1 ", _params]; - ['message', [_params, format["Sender: %1", name _player]]] remoteExecCall ['AdminToolkit_network_receiveResponse', -2]; + ['message', [(_params select 0), format["Sender: %1", name _player]]] remoteExecCall ['AdminToolkit_network_receiveResponse', -2]; }; // Give ammo to selected player case 'giveammo': { - _tmp = objectFromNetId _params; + _tmp = objectFromNetId (_params select 0); if (!(isNil "_tmp") && (typeName _tmp == "OBJECT")) then { diag_log format ["[ADMINTOOLKIT] Giving ammo to %1", name _tmp]; _tmp addMagazines [(getArray (configFile >> 'CfgWeapons' >> primaryWeapon _tmp >> 'magazines') select 0), 1]; @@ -82,7 +86,7 @@ try { _tmp = getText(configFile >> "CfgSettings" >> "AdminToolkit" >> "ServerCommandPassword"); if(_tmp != "") then { - _tmp serverCommand format["#kick %1", name (objectFromNetId _params)]; + _tmp serverCommand format["#kick %1", name (objectFromNetId (_params select 0))]; }; }; // Ban player from server @@ -91,14 +95,14 @@ try { _tmp = getText(configFile >> "CfgSettings" >> "AdminToolkit" >> "ServerCommandPassword"); if(_tmp != "") then { - _tmp serverCommand format["#ban %1", name (objectFromNetId _params)]; + _tmp serverCommand format["#ban %1", name (objectFromNetId (_params select 0))]; }; }; // Teleport the player defined in parameter 0 to players position defined in parameter 2 // Example: [player, 'tp2player', ] case "tp2player": { - _tmp = objectFromNetId _params; + _tmp = objectFromNetId (_params select 0); if(!isNil "_tmp") then { _player setPosATL (getPosATL _tmp); }; @@ -107,7 +111,7 @@ try // Example: [player, 'tpplayer', ] case "tpplayer": { - _tmp = objectFromNetId _params; + _tmp = objectFromNetId (_params select 0); if(!isNil "_tmp") then { _tmp setPosATL (position _player); }; @@ -119,8 +123,8 @@ try //search safe Position for Vehicle Teleport if (vehicle _player != _player) then { - _safepos = [_params, 1, 20, 5, 1, 0, 0] call BIS_fnc_findSafePos; - vehicle _player setPos _safepos; + _tmp = [_params, 1, 20, 5, 1, 0, 0] call BIS_fnc_findSafePos; + vehicle _player setPos _tmp; } else { _player setPos _params; }; @@ -144,18 +148,18 @@ try // Example: [player, 'getvehicle', ] case "getvehicle": { //find save position for the vehicle - _safepos = [position _player, 1, 20, 5, 1, 0, 0] call BIS_fnc_findSafePos; - _result = _params createVehicle _safepos; + _tmp = [position _player, 1, 20, 5, 1, 0, 0] call BIS_fnc_findSafePos; + _result = (_params select 0) createVehicle _tmp; }; // spawn a vehicle at the position of another player - // Example: [player, 'givevehicle', [, ]] + // Example: [player, 'givevehicle', [, ]] case "givevehicle": { _tmp = objectFromNetId (_params select 1); if(!(isNil "_tmp")) then { diag_log format ["[ADMINTOOLKIT] Giving vehicle %1 to %2 ", (_params select 0), name _tmp]; //find save position for the vehicle - _safepos = [_tmp, 1, 50, 5, 1, 0, 0] call BIS_fnc_findSafePos; - (_params select 0) createVehicle _safepos; + _mod = [_tmp, 1, 50, 5, 1, 0, 0] call BIS_fnc_findSafePos; + (_params select 0) createVehicle _mod; }; }; // remove a vehicle using its netId as parameter @@ -186,7 +190,8 @@ try // add an item to admins inventory // Example: [player, 'getitem', ] case "getitem": { - if (_params != "") then { _player addItem _params; }; + _tmp = _params select 0; + if (typeName _tmp == "STRING") then { _player addItem _tmp; }; }; // spawn an object at a position defined in parameter 2 // Example: [player, 'spawn', [, ]] @@ -200,15 +205,14 @@ try // Example: [player, 'build', ] case "buildpers"; case "build": { - _tmp = createVehicle [_params, [0,0,1000], [], 0, "CAN_COLLIDE"]; + _tmp = createVehicle [(_params select 0), [0,0,1000], [], 0, "CAN_COLLIDE"]; _tmp setVariable ["BIS_enableRandomization", false]; _tmp enableSimulationGlobal false; _tmp allowDamage false; + _tmp removeAllEventHandlers "HandleDamage"; [_tmp, owner _player] spawn { - private['_vehicle', '_owner']; - _vehicle = _this select 0; - _owner = _this select 1; + params['_vehicle', '_owner']; _vehicle setOwner _owner; diag_log format["[ADMINTOOLKIT] Setting owner %1 on vehicle %2", str _owner, str _vehicle]; }; @@ -217,17 +221,26 @@ try }; // remoe building which is in player cursor position case "buildremove": { - _tmp = objectFromNetId _params; - if !(isNull _tmp) then { - ['BUILDINGS', (_params select 1)] call AdminToolkit_removePersistent; - deleteVehicle _tmp; - AdminToolkit_IsPersistentSaved = nil; + _tmp = objectFromNetId (_params select 0); + _mod = _tmp getVariable ["ATK_IsPersistent", false]; + + if (_mod) then { + ['BUILDINGS', (getPosATL _tmp)] call AdminToolkit_removePersistent; + AdminToolkit_IsPersistentSaved = false; }; + + deleteVehicle _tmp; }; - case "buildpersistent": { - ['BUILDINGS', _params] call AdminToolkit_savePersistent; - AdminToolkit_IsPersistentSaved = nil; + _mod = objectFromNetId (_params select 0); + _mod setDir (_params select 2); + _mod setVectorUp [0,0,1]; + _mod setPosATL (_params select 1); + _mod setVariable ["ATK_IsPersistent", true, true]; + _mod setOwner 2; + + ['BUILDINGS', [typeOf _mod, (_params select 1), (_params select 2)] ] call AdminToolkit_savePersistent; + AdminToolkit_IsPersistentSaved = false; }; case "buildinfopersistent": { [_request, [count AdminToolkit_Buildings, AdminToolkit_IsPersistentSaved]] remoteExecCall ['AdminToolkit_network_receiveResponse', owner _player]; @@ -249,7 +262,7 @@ try }; // abort the build progress by deleting the vehicle just created case "buildabort": { - _tmp = objectFromNetId _params; + _tmp = objectFromNetId (_params select 0); if !(isNull _tmp) then { deleteVehicle _tmp; }; }; // used for extensions diff --git a/source/admintoolkit_server/code/AdminToolkit_removePersistent.sqf b/source/admintoolkit_server/code/AdminToolkit_removePersistent.sqf index bc5dc4e..5cc414f 100644 --- a/source/admintoolkit_server/code/AdminToolkit_removePersistent.sqf +++ b/source/admintoolkit_server/code/AdminToolkit_removePersistent.sqf @@ -7,9 +7,9 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_section','_objectPos', '_pos', '_vectorDiff', '_index']; -_section = _this select 0; -_objectPos = _this select 1; +params['_section','_objectPos']; + +private _index = 0; switch (_section) do { case "BUILDINGS": { @@ -18,12 +18,12 @@ switch (_section) do { } else { _index = 0; { - _pos = _x select 1; - _vectorDiff = _pos vectorDistance _objectPos; + private _pos = _x select 1; + private _vectorDiff = _pos vectorDistance _objectPos; if(_vectorDiff < 0.3) exitWith { // remove object where difference is less than 0.3 - diag_log format["[ADMINTOOLKIT]: '%1' removed from persistence", _x select 0]; + diag_log format["[ADMINTOOLKIT]: Removed '%1' removed from persistence", str _x]; AdminToolkit_Buildings deleteAt _index; }; diff --git a/source/admintoolkit_server/code/AdminToolkit_savePersistent.sqf b/source/admintoolkit_server/code/AdminToolkit_savePersistent.sqf index c152564..7d48191 100644 --- a/source/admintoolkit_server/code/AdminToolkit_savePersistent.sqf +++ b/source/admintoolkit_server/code/AdminToolkit_savePersistent.sqf @@ -7,14 +7,12 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_section', '_value', '_pos', '_result']; -_section = _this select 0; -_value = _this select 1; +params ['_section', '_value']; switch (_section) do { case "BUILDINGS": { - if ((typeName _value == "ARRAY") and (count _value == 3) ) then { - diag_log format["[ADMINTOOLKIT] Saving '%1' into '%2' ", str _value, _section]; + if (typeName _value == "ARRAY" ) then { + diag_log format["[ADMINTOOLKIT] Saving '%1' to '%2'",str _value]; AdminToolkit_Buildings pushBackUnique _value; } }; diff --git a/source/admintoolkit_server/code/AdminToolkit_saveProfile.sqf b/source/admintoolkit_server/code/AdminToolkit_saveProfile.sqf index ebfa91b..ace88e5 100644 --- a/source/admintoolkit_server/code/AdminToolkit_saveProfile.sqf +++ b/source/admintoolkit_server/code/AdminToolkit_saveProfile.sqf @@ -7,9 +7,6 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_result']; - -// save buildings into server profile diag_log format["[ADMINTOOLKIT-DEBUG] : Storing %1 buildings...", count AdminToolkit_Buildings]; profileNamespace setVariable [format["ATK_PERSISTENT_%1", 'BUILDINGS'], AdminToolkit_Buildings]; diff --git a/source/admintoolkit_servercfg/extension/ExileMod.sqf b/source/admintoolkit_servercfg/extension/ExileMod.sqf index 7794f3d..54bcbfe 100644 --- a/source/admintoolkit_servercfg/extension/ExileMod.sqf +++ b/source/admintoolkit_servercfg/extension/ExileMod.sqf @@ -7,13 +7,15 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_playerObject','_request', '_params', '_position', '_tmp', '_tmp2', '_object']; -_playerObject = _this select 0; -_request = _this select 1; -_params = _this select 2; +params['_playerObject','_request', '_params']; -_result = true; -try +private _result = true; +private _position = []; +private _tmp = ''; +private _tmp2 = ''; +private _object = objNull; + +try { switch (_request) do { case 'exile_getvehicle': @@ -40,14 +42,12 @@ try [_playerObject, "dynamicTextRequest", [format ["UNLOCK PIN: %1", _tmp2], 0, 2, "#ffffff"]] call ExileServer_system_network_send_to; }; case 'exile_setvehiclepin': { - _tmp = _params select 1; _object = objectFromNetId (_params select 0); - _object setVariable ["ExileAccessCode", _tmp]; - _object call ExileServer_object_vehicle_database_update; - - _tmp2 = typeof _object; - - [_playerObject, "toastRequest", ["SuccessTitleOnly", [format["PIN %1 set to %2", _tmp, _tmp2] ]]] call ExileServer_system_network_send_to; + _tmp = _params select 1; + + _object setVariable ["ExileAccessCode",_tmp]; + [_playerObject, "resetCodeResponse", [["SuccessTitleOnly", ["PIN changed successfully!"]], netId _object,_tmp]] call ExileServer_system_network_send_to; + [_object,_tmp] call ExileServer_object_vehicle_database_resetCode; }; case 'exile_repvehicle': { diff --git a/source/admintoolkit_servercfg/extension/Furniture.sqf b/source/admintoolkit_servercfg/extension/Furniture.sqf index 9e6a42a..93f5823 100644 --- a/source/admintoolkit_servercfg/extension/Furniture.sqf +++ b/source/admintoolkit_servercfg/extension/Furniture.sqf @@ -6,8 +6,4 @@ * * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_playerObject','_request', '_params']; -_playerObject = _this select 0; -_request = _this select 1; -_params = _this select 2; - +params['_playerObject','_request', '_params']; diff --git a/source/admintoolkit_servercfg/extension/VanillaAI.sqf b/source/admintoolkit_servercfg/extension/VanillaAI.sqf index 8623b39..c2e29ff 100644 --- a/source/admintoolkit_servercfg/extension/VanillaAI.sqf +++ b/source/admintoolkit_servercfg/extension/VanillaAI.sqf @@ -7,14 +7,14 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_playerObject','_request', '_params', '_object', '_tmp']; -_playerObject = _this select 0; -_request = _this select 1; -_params = _this select 2; +params['_playerObject','_request', '_params']; + +private _object = objNull; +private _tmp = ''; +private _result = true; if(isNil "VanillaAI_Units") then { missionNamespace setVariable["VanillaAI_Units", []] }; -_result = true; try { switch (_request) do { diff --git a/source/mission_file/atk/extension/ExileMod.sqf b/source/mission_file/atk/extension/ExileMod.sqf index 991000d..03b81dd 100644 --- a/source/mission_file/atk/extension/ExileMod.sqf +++ b/source/mission_file/atk/extension/ExileMod.sqf @@ -1,13 +1,10 @@ -private['_result']; disableSerialization; // overwrite the OnExecute code from AdminToolkit_OnExecute AdminToolkit_OnExecute = { - private ["_data"]; - - AdminToolkit_Params = ctrlText RscAdminToolkitParam_IDC; - - _data = lbData [RscAdminToolkitDetailList_IDC, lbCurSel RscAdminToolkitDetailList_IDC]; + private _object = objNull; + private _data = lbData [RscAdminToolkitDetailList_IDC, lbCurSel RscAdminToolkitDetailList_IDC]; + private _userInput = ctrlText RscAdminToolkitParam_IDC; switch (AdminToolkit_Action) do { case "exile_repvehicle"; @@ -16,20 +13,20 @@ AdminToolkit_OnExecute = { [AdminToolkit_Action, _data] call AdminToolkit_doAction; }; case "exile_setvehiclepin": { - [AdminToolkit_Action, [_data, AdminToolkit_Params]] call AdminToolkit_doAction; + [AdminToolkit_Action, [_data, _userInput]] call AdminToolkit_doAction; }; case "exile_getvehicle": { - [AdminToolkit_Action] call AdminToolkit_doAction; + [AdminToolkit_Action, _data] call AdminToolkit_doAction; }; case 'exile_sendmoney'; case 'exile_sendscore': { - [AdminToolkit_Action, [_data, parseNumber AdminToolkit_Params]] call AdminToolkit_doAction; + [AdminToolkit_Action, [_data, parseNumber _userInput]] call AdminToolkit_doAction; }; case "exile_getmoney": { - ['exile_getmoney', parseNumber AdminToolkit_Params] call AdminToolkit_doAction; + ['exile_getmoney', parseNumber _userInput] call AdminToolkit_doAction; }; case "exile_getscore": { - ['exile_getscore', parseNumber AdminToolkit_Params] call AdminToolkit_doAction; + ['exile_getscore', parseNumber _userInput] call AdminToolkit_doAction; }; case "exile_getheal": { ['exile_getheal', ""] call AdminToolkit_doAction; @@ -41,10 +38,11 @@ AdminToolkit_OnExecute = { }; AdminToolkit_ExileMod_loadDetails = { - private ["_filter","_list", "_show", '_tmp']; + params["_filter"]; - _filter = _this select 0; - _show = false; + private _show = false; + private _list = []; + private _player = objNull; switch (AdminToolkit_Action) do { case "exile_destvehicle"; @@ -101,7 +99,7 @@ AdminToolkit_ExileMod_loadDetails = { _show; }; -_result = [ +[ ['Repair (nearby)', 'exile_repvehicle'], ['Destroy (nearby)', 'exile_destvehicle'], ['Remove (nearby)', 'exile_delvehicle'], @@ -112,6 +110,4 @@ _result = [ ['Send Money to Player', 'exile_sendmoney'], ['Send Respect to Player', 'exile_sendscore'], ['Heal Me', 'exile_getheal'] -]; - -_result; \ No newline at end of file +]; \ No newline at end of file diff --git a/source/mission_file/atk/extension/Furniture.sqf b/source/mission_file/atk/extension/Furniture.sqf index 9529f9a..2fb3137 100644 --- a/source/mission_file/atk/extension/Furniture.sqf +++ b/source/mission_file/atk/extension/Furniture.sqf @@ -5,33 +5,30 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_result']; disableSerialization; // overwrite the OnExecute code from AdminToolkit_OnExecute -AdminToolkit_OnExecute = { - private ["_data"]; - - _data = lbData [RscAdminToolkitDetailList_IDC, lbCurSel RscAdminToolkitDetailList_IDC]; +AdminToolkit_OnExecute = { + private _data = lbData [RscAdminToolkitDetailList_IDC, lbCurSel RscAdminToolkitDetailList_IDC]; switch (AdminToolkit_Action) do { case "fu_build": { - ['build', _data] call AdminToolkit_doAction; + ['build', [_data]] call AdminToolkit_doAction; }; case "fu_buildpers": { - ['buildpers', _data] call AdminToolkit_doAction; + ['buildpers', [_data]] call AdminToolkit_doAction; }; default { - [AdminToolkit_Action] call AdminToolkit_doAction; + [AdminToolkit_Action, AdminToolkit_Params] call AdminToolkit_doAction; }; }; }; AdminToolkit_Furniture_loadDetails = { - private ["_filter","_list", "_show"]; + params["_filter"]; - _filter = _this select 0; - _show = false; + private _show = false; + private _list = []; switch (AdminToolkit_Action) do { case "fu_build"; @@ -44,13 +41,11 @@ AdminToolkit_Furniture_loadDetails = { _show; }; -_result = [ +[ ["Build (temporary)", 'fu_build'], ["Build (persistent)", 'fu_buildpers'], - ["Remove (Target)", "buildremove"], + ["Remove (nearby)", "buildremove"], ["Status", 'buildinfopersistent'], ["Save Persistent", 'savepersistent'], ["Clear Persistent", 'clearpersistent'] -]; - -_result; \ No newline at end of file +]; \ No newline at end of file diff --git a/source/mission_file/atk/extension/VanillaAI.sqf b/source/mission_file/atk/extension/VanillaAI.sqf index 784968d..d605238 100644 --- a/source/mission_file/atk/extension/VanillaAI.sqf +++ b/source/mission_file/atk/extension/VanillaAI.sqf @@ -1,8 +1,9 @@ -private['_result', '_object', '_tmp']; disableSerialization; // overwrite the OnExecute code from AdminToolkit_OnExecute AdminToolkit_OnExecute = { + private _object = objNull; + switch (AdminToolkit_Action) do { case "vai_enemy": { ['vai_enemy', ""] call AdminToolkit_doAction; @@ -25,10 +26,10 @@ AdminToolkit_OnExecute = { }; AdminToolkit_VanillaAI_loadDetails = { - private ["_filter","_list", "_show"]; + params['_filter']; - _filter = _this select 0; - _show = false; + private _show = false; + private _list = []; (_display displayCtrl RscAdminToolkitParamLabel_IDC) ctrlSetStructuredText parseText "Sorry, not fully implemented yet:"; @@ -37,27 +38,30 @@ AdminToolkit_VanillaAI_loadDetails = { VanillaAI_UnitList = { - private['_names', '_object']; - _names = []; + params['_units']; + + private _object = objNull; + private _names = []; + { _object = objectFromNetId _x; _names pushBack [name _object, _x]; - } forEach (_this select 0); + } forEach (_units); _names; }; "VanillaAI_Units" addPublicVariableEventHandler { - private['_names']; - _names = [_this select 1] call VanillaAI_UnitList; + params['_id','_unit']; + + private _names = [_unit] call VanillaAI_UnitList; lbClear RscAdminToolkitList_IDC; [RscAdminToolkitList_IDC, _names, ""] call AdminToolkit_uiList; }; -_result = [ +[ ['New Enemy AI', 'vai_enemy'], ['New Friendly AI', 'vai_friend'], ['Attack Target', 'vai_attack'], ['Delete selected AI', 'vai_delete'] ]; -_result; \ No newline at end of file diff --git a/source/mission_file/atk/system/AdminToolkit_receiveResponse.sqf b/source/mission_file/atk/system/AdminToolkit_receiveResponse.sqf index 0d3f3e9..cd954f7 100644 --- a/source/mission_file/atk/system/AdminToolkit_receiveResponse.sqf +++ b/source/mission_file/atk/system/AdminToolkit_receiveResponse.sqf @@ -1,9 +1,6 @@ -private["_request", "_params", '_tmp']; +params["_request", "_params"]; try -{ - _request = _this select 0; // what to do - _params = _this select 1; // mixed value - +{ switch(_request) do { case 'message': { _params call AdminToolkit_showMessage; diff --git a/source/mission_file/atk/system/AdminToolkit_showMessage.sqf b/source/mission_file/atk/system/AdminToolkit_showMessage.sqf index d30cec1..7a8af1d 100644 --- a/source/mission_file/atk/system/AdminToolkit_showMessage.sqf +++ b/source/mission_file/atk/system/AdminToolkit_showMessage.sqf @@ -7,20 +7,17 @@ * This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License. */ -private['_title', '_message', '_interval', '_display', '_control']; +params['_title', '_message']; disableSerialization; -_display = findDisplay 46; -_title = _this select 0; -_message = _this select 1; +private _display = findDisplay 46; +private _interval = 10; +private _control = (_display displayCtrl RscAdminToolkitMessage_IDC); -_interval = 10; if(count _this > 2) then { _interval = _this select 2; }; -_control = (_display displayCtrl RscAdminToolkitMessage_IDC); - _title = format["%1", _title]; _control ctrlSetStructuredText parseText format["%1
%2", _title, _message]; diff --git a/source/mission_file/atk/system/init.sqf b/source/mission_file/atk/system/init.sqf index e39fa0b..cead586 100644 --- a/source/mission_file/atk/system/init.sqf +++ b/source/mission_file/atk/system/init.sqf @@ -5,9 +5,9 @@ // wait until main display has been loaded [] spawn { - private['_control', '_controlIDC', '_code']; - - _code = compileFinal preprocessFileLineNumbers 'atk\system\AdminToolkit_showMessage.sqf'; + private _controlIDC = 1999; + private _code = compileFinal preprocessFileLineNumbers 'atk\system\AdminToolkit_showMessage.sqf'; + missionNamespace setVariable ['AdminToolkit_showMessage', _code]; if(isNil "AdminToolkit_network_receiveResponse") then { @@ -18,9 +18,7 @@ disableSerialization; waitUntil {!isNull (findDisplay 46)}; - // create a structured text control - _controlIDC = 1901; - _control = (finddisplay 46) ctrlCreate ["RscStructuredText", _controlIDC]; + private _control = (finddisplay 46) ctrlCreate ["RscStructuredText", _controlIDC]; _control ctrlSetPosition [0,0, 1,1]; _control ctrlCommit 0; missionNamespace setVariable ['RscAdminToolkitMessage_IDC', _controlIDC];