diff --git a/[admin]/admin/client/gui/admin_acl.lua b/[admin]/admin/client/gui/admin_acl.lua
index d18461643..63276a875 100644
--- a/[admin]/admin/client/gui/admin_acl.lua
+++ b/[admin]/admin/client/gui/admin_acl.lua
@@ -11,6 +11,8 @@
aAclForm = nil
aAclData = {}
+addEvent ( "aAdminACL", true )
+
function aManageACL ()
if ( aAclForm == nil ) then
aAclData["group_objects"] = {}
@@ -47,7 +49,6 @@ function aManageACL ()
aACLExit = guiCreateButton ( 0.75, 0.90, 0.27, 0.04, "Close", true, aAclForm )
aclDisplayOptions ( "", "" )
- addEvent ( "aAdminACL", true )
addEventHandler ( "aAdminACL", localPlayer, aAdminACL )
addEventHandler ( "onClientGUIClick", aAclForm, aClientACLClick )
addEventHandler ( "onClientGUIDoubleClick", aAclForm, aClientACLDoubleClick )
diff --git a/[admin]/admin/client/gui/admin_main.lua b/[admin]/admin/client/gui/admin_main.lua
index c43cbcd63..7dc143a96 100644
--- a/[admin]/admin/client/gui/admin_main.lua
+++ b/[admin]/admin/client/gui/admin_main.lua
@@ -75,7 +75,7 @@ function aAdminMenu ()
aTab1.Nick = guiCreateButton ( 0.71, 0.260, 0.13, 0.04, "Set Nick", true, aTab1.Tab )
aTab1.Shout = guiCreateButton ( 0.85, 0.260, 0.13, 0.04, "Shout!", true, aTab1.Tab, "shout" )
- aTab1.Admin = guiCreateButton ( 0.71, 0.305, 0.27, 0.04, "Give admin rights", true, aTab1.Tab, "setgroup" )
+ aTab1.ManagePerms = guiCreateButton ( 0.71, 0.305, 0.27, 0.04, "Manage permissions", true, aTab1.Tab, "setgroup" )
local y = 0.03 -- Start y coord
local A = 0.045 -- Large line gap
@@ -538,11 +538,6 @@ function aAdminRefresh ()
guiSetText ( aTab1.Vehicle, "Vehicle: Foot" )
guiSetText ( aTab1.VehicleHealth, "Vehicle Health: 0%" )
end
- if ( aPlayers[player]["admin"] ) then
- guiSetText(aTab1.Admin, "Revoke admin rights")
- else
- guiSetText(aTab1.Admin, "Give admin rights")
- end
return player
end
end
@@ -1041,9 +1036,12 @@ function aClientClick ( button )
elseif ( source == aTab1.VehicleBlow ) then triggerServerEvent ( "aVehicle", localPlayer, player, "blowvehicle" )
elseif ( source == aTab1.VehicleDestroy ) then triggerServerEvent ( "aVehicle", localPlayer, player, "destroyvehicle" )
elseif ( source == aTab1.VehicleCustomize ) then aVehicleCustomize ( player )
- elseif ( source == aTab1.Admin ) then
- if ( aPlayers[player]["admin"] ) then aMessageBox ( "warning", "Revoke admin rights from "..name.."?", "revokeAdmin", player )
- else aMessageBox ( "warning", "Give admin rights to "..name.."?", "giveAdmin", player ) end
+ elseif ( source == aTab1.ManagePerms ) then
+ if (aPlayers[player]['accountname'] ~= 'guest') then
+ aPermissions.Show(player)
+ else
+ aMessageBox ( "error", "This player is not logged in!" )
+ end
elseif ( source == aTab1.ACModDetails ) then
aViewModdetails(player)
end
@@ -1290,7 +1288,6 @@ function aAdminReloadInfos()
guiSetText ( aTab1.ACModInfo, "Img Mods: N/A" )
guiSetText ( aTab1.Mute, "Mute" )
guiSetText ( aTab1.Freeze, "Freeze" )
- guiSetText ( aTab1.Admin, "Give admin rights" )
guiSetText ( aTab1.Health, "Health: 0%" )
guiSetText ( aTab1.Armour, "Armour: 0%" )
guiSetText ( aTab1.Skin, "Skin: N/A" )
diff --git a/[admin]/admin/client/gui/admin_messagebox.lua b/[admin]/admin/client/gui/admin_messagebox.lua
index 4a416266e..aec97d8ca 100644
--- a/[admin]/admin/client/gui/admin_messagebox.lua
+++ b/[admin]/admin/client/gui/admin_messagebox.lua
@@ -147,6 +147,8 @@ function runMessageAction(action)
aSpectator.Close(false)
elseif (action == "deleteTeam") then
triggerServerEvent("aTeam", localPlayer, "destroyteam", varOne)
+ elseif (action == "updatePlayerACLGroup") then
+ aPermissions.PerformAction(varOne, varTwo, varThree)
end
end
diff --git a/[admin]/admin/client/gui/admin_permissions.lua b/[admin]/admin/client/gui/admin_permissions.lua
new file mode 100644
index 000000000..73b9557a3
--- /dev/null
+++ b/[admin]/admin/client/gui/admin_permissions.lua
@@ -0,0 +1,137 @@
+--[[**********************************
+*
+* Multi Theft Auto - Admin Panel
+*
+* client\gui\admin_permissions.lua
+*
+* Original File by lil_Toady
+*
+**************************************]]
+aPermissions = {
+ Form = nil,
+ SelectedPlayer = nil,
+}
+
+addEvent('aPermissionsSync', true)
+addEvent('aOnPermissionsChange', true)
+
+function aPermissions.Show(player)
+ if (not aPermissions.Form) then
+ local x, y = guiGetScreenSize()
+ aPermissions.Form = guiCreateWindow(x / 2 - 200, y / 2 - 125, 400, 250, '', false)
+ guiSetAlpha(aPermissions.Form, 1)
+
+ aPermissions.LabelYourPerms = guiCreateLabel(0.03, 0.1, 0.35, 0.07, '', true, aPermissions.Form)
+ aPermissions.PlayerGroups = guiCreateGridList(0.03, 0.18, 0.35, 0.68, true, aPermissions.Form)
+ guiGridListAddColumn(aPermissions.PlayerGroups, "Group Name", 0.85)
+ aPermissions.RemoveGroup = guiCreateButton(0.39, 0.18, 0.075, 0.68, '>\n>\n>', true, aPermissions.Form)
+ guiSetEnabled(aPermissions.RemoveGroup, false)
+
+ aPermissions.LabelAllPerms = guiCreateLabel(0.62, 0.1, 0.35, 0.07, "Available groups:", true, aPermissions.Form)
+ aPermissions.AllGroups = guiCreateGridList(0.62, 0.18, 0.35, 0.68, true, aPermissions.Form)
+ guiGridListAddColumn(aPermissions.AllGroups, "Group Name", 0.85)
+ aPermissions.AddGroup = guiCreateButton(0.535, 0.18, 0.075, 0.68, '<\n<\n<', true, aPermissions.Form)
+ guiSetEnabled(aPermissions.AddGroup, false)
+
+ aPermissions.Update = guiCreateButton(0.03, 0.88, 0.435, 0.09, "Refresh", true, aPermissions.Form)
+ aPermissions.Hide = guiCreateButton(0.535, 0.88, 0.435, 0.09, "Close", true, aPermissions.Form)
+
+ addEventHandler('aPermissionsSync', localPlayer, aPermissions.onSync)
+ addEventHandler('aOnPermissionsChange', localPlayer, aPermissions.Refresh)
+ addEventHandler("onClientGUIClick", aPermissions.Form, aPermissions.onClick)
+
+ --Register With Admin Form
+ aRegister("PlayerPermissions", aPermissions.Form, aPermissions.Show, aPermissions.Close)
+ end
+ guiSetText(aPermissions.Form, ("Manage %s's permissions"):format(getPlayerName(player)))
+ guiSetText(aPermissions.LabelYourPerms, ("%s's groups:"):format(getPlayerName(player)))
+ aPermissions.SelectedPlayer = player
+ aPermissions.Refresh()
+ guiSetVisible(aPermissions.Form, true)
+ guiBringToFront(aPermissions.Form)
+end
+
+function aPermissions.onSync(targetPlayer, permissions)
+ if (targetPlayer == aPermissions.SelectedPlayer) then
+ guiGridListClear(aPermissions.PlayerGroups)
+ guiGridListClear(aPermissions.AllGroups)
+
+ for group, state in pairs(permissions) do
+ local gridlist = state and aPermissions.PlayerGroups or aPermissions.AllGroups
+ guiGridListAddRow(gridlist, group)
+ end
+ end
+end
+
+function aPermissions.Close(destroy)
+ if (destroy) then
+ if (aPermissions.Form) then
+ destroyElement(aPermissions.Form)
+ aPermissions.Form = nil
+ removeEventHandler('aPermissionsSync', localPlayer, aPermissions.onSync)
+ removeEventHandler('aOnPermissionsChange', localPlayer, aPermissions.Refresh)
+ end
+ else
+ guiSetVisible(aPermissions.Form, false)
+ end
+ aPermissions.SelectedPlayer = nil
+end
+
+function aPermissions.onClick(button)
+ if (button == 'left') then
+ if (source == aPermissions.Hide) then
+ aPermissions.Close()
+ elseif (source == aPermissions.Update) then
+ aPermissions.Refresh()
+ elseif (source == aPermissions.RemoveGroup) then
+ aPermissions.ConfirmChange(false)
+ elseif (source == aPermissions.AddGroup) then
+ aPermissions.ConfirmChange(true)
+ elseif (source == aPermissions.AllGroups) then
+ guiSetEnabled(aPermissions.AddGroup, guiGridListGetSelectedItem(aPermissions.AllGroups) > -1)
+ elseif (source == aPermissions.PlayerGroups) then
+ guiSetEnabled(aPermissions.RemoveGroup, guiGridListGetSelectedItem(aPermissions.PlayerGroups) > -1)
+ end
+ end
+end
+
+function aPermissions.ConfirmChange(add)
+ local player = aPermissions.SelectedPlayer
+
+ if (not isElement(player)) then
+ aPermissions.Close(false)
+ messageBox("Player not found!", MB_WARNING)
+ return
+ end
+
+ local gridlist = add and aPermissions.AllGroups or aPermissions.PlayerGroups
+
+ local selected = guiGridListGetSelectedItem(gridlist)
+
+ if (selected <= -1) then
+ return
+ end
+
+ local groupName = guiGridListGetItemText(gridlist, selected, 1)
+
+ local str = add and 'Are you sure you want to add "%s" to the "%s" group?' or 'Are you sure you want to remove "%s" from the "%s" group?'
+ str = str:format(getPlayerName(player), groupName)
+
+ return aMessageBox ( "question", str, "updatePlayerACLGroup", player, groupName, add)
+end
+
+function aPermissions.PerformAction(player, groupName, newState)
+ local playerAccount = player and aPlayers[player] and aPlayers[player]['accountname']
+ if playerAccount and (playerAccount ~= 'guest') then
+ triggerServerEvent('aAdmin', localPlayer, newState and 'acladd' or 'aclremove', 'object', groupName, 'user.'..playerAccount, true)
+ end
+end
+
+function aPermissions.Refresh()
+ local player = aPermissions.SelectedPlayer
+ if isElement(player) and aPermissions.PlayerGroups and aPermissions.AllGroups then
+ guiGridListClear(aPermissions.PlayerGroups)
+ guiGridListClear(aPermissions.AllGroups)
+ triggerServerEvent('aAdmin', localPlayer, "sync", "playeraclgroups", player)
+ end
+end
diff --git a/[admin]/admin/meta.xml b/[admin]/admin/meta.xml
index 6f28e0a25..212e8818b 100644
--- a/[admin]/admin/meta.xml
+++ b/[admin]/admin/meta.xml
@@ -26,6 +26,7 @@
+
diff --git a/[admin]/admin/server/admin_server.lua b/[admin]/admin/server/admin_server.lua
index 845a244ef..d76fc3d5f 100644
--- a/[admin]/admin/server/admin_server.lua
+++ b/[admin]/admin/server/admin_server.lua
@@ -681,6 +681,7 @@ addEventHandler ( "aAdmin", _root, function ( action, ... )
for id, acl in ipairs ( aclList() ) do
table.insert ( tableOut["acl"] ,aclGetName ( acl ) )
end
+ triggerClientEvent ( source, "aAdminACL", _root, type, tableOut )
elseif ( type == "aclobjects" ) then
local group = aclGetGroup ( tostring ( arg[2] ) )
if ( group ) then
@@ -691,6 +692,7 @@ addEventHandler ( "aAdmin", _root, function ( action, ... )
table.insert ( tableOut["acl"], aclGetName ( acl ) )
end
end
+ triggerClientEvent ( source, "aAdminACL", _root, type, tableOut )
elseif ( type == "aclrights" ) then
local acl = aclGet ( tostring ( arg[2] ) )
if ( acl ) then
@@ -700,8 +702,23 @@ addEventHandler ( "aAdmin", _root, function ( action, ... )
tableOut["rights"][name] = aclGetRight ( acl, name )
end
end
+ triggerClientEvent ( source, "aAdminACL", _root, type, tableOut )
+ elseif ( type == 'playeraclgroups') then
+ local player = arg[2]
+ if isElement(player) then
+ local ignoredGroups = {
+ ['Everyone'] = true,
+ ['autoGroup_irc'] = true,
+ }
+ for _, v in ipairs(aclGroupList()) do
+ local groupName = aclGroupGetName(v)
+ if (not ignoredGroups[groupName]) then
+ tableOut[groupName] = isObjectInACLGroup('user.'..getAccountName(getPlayerAccount(player)), v)
+ end
+ end
+ end
+ triggerClientEvent ( source, "aPermissionsSync", _root, player, tableOut )
end
- triggerClientEvent ( source, "aAdminACL", _root, type, tableOut )
elseif ( action == "aclcreate" ) then
local name = arg[2]
if ( ( name ) and ( string.len ( name ) >= 1 ) ) then
@@ -759,6 +776,9 @@ addEventHandler ( "aAdmin", _root, function ( action, ... )
mdata2 = "Object '"..arg[3].."'"
outputServerLog ("ACL: "..getPlayerName(source).."["..getAccountName (getPlayerAccount(source)).."] ["..getPlayerSerial (source).."] ["..getPlayerIP (source).."] added "..object.." to ACL Group "..arg[2])
triggerEvent ( "aAdmin", source, "sync", "aclobjects", arg[2] )
+ if arg[4] then
+ triggerClientEvent ( source, "aOnPermissionsChange", source )
+ end
end
elseif ( arg[1] == "acl" ) then
local group = aclGetGroup ( arg[2] )
@@ -802,6 +822,9 @@ addEventHandler ( "aAdmin", _root, function ( action, ... )
mdata2 = "Object '"..arg[3].."'"
triggerEvent ( "aAdmin", source, "sync", "aclobjects", arg[2] )
outputServerLog ("ACL: "..getPlayerName(source).."["..getAccountName (getPlayerAccount(source)).."] ["..getPlayerSerial (source).."] ["..getPlayerIP (source).."] removed "..mdata2)
+ if arg[4] then
+ triggerClientEvent ( source, "aOnPermissionsChange", source )
+ end
end
elseif ( arg[1] == "acl" ) then
local group = aclGetGroup ( arg[2] )