Use the office to hire staff, assign roles and edit names. An empty name restores automatic naming; Config.Identity.name can retrieve character names from your framework.
In the Roles tab, click a role header to expand or collapse its permissions; scroll inside the panel to reach the other roles.
Config.Permissions.roles defines initial owner, manager and employee roles. Use nameKey for translated names or name for a custom name. Existing roles retain their settings. Use Config.Permissions.roleOverrides to change existing role permissions: true grants and false revokes.
In the panel, the Owner orders permissions from highest to lowest by dragging or using move-up/down controls. Set the initial order in Config.Permissions.permissionOrder. Only the Owner can grant any permission. Others grant only permissions they hold that rank below their own highest permission; higher roles are protected. Only an Owner can promote someone to Owner.
roles permits creating, renaming and removing roles. Editing permissions also requires assignPermissions. Assigning staff roles requires staff and assignPermissions. Without assignPermissions, hiring uses employee within the hierarchy limits.
reviewPayments and reviewWithdrawals delegate payment and withdrawal reviews. manageOwners permits management of owner records within the promotion rule. ownerAllPermissions controls full Owner access; protectLastOwner preserves the last owner; allowSelfManagement allows editing your own staff record.
For framework roles, configure role and isOwner; nil/false deny corresponding access. When using Config.Identity.resolve for character IDs, migrate existing records before changing the identity format.
Opening the Staff panel
Open /narguile or /bestbuds and click Staff. The button also appears in storage for authorized administrators who have access to it. There is no separate command for this panel; the commands above are defaults and can be changed in the configuration.
Use this panel’s NUI tab to customize the shop appearance; see Names, branding and appearance.
If the button is missing, configure authorization in config_server.lua: use Config.Permissions.isStaff, the Config.Permissions.staff list or Config.Permissions.ace.staff, which defaults to hookah.staff. Being the shop Owner does not automatically grant this access; the staff role permission allows hiring and firing shop employees.
Authorization examples: ACE and vRP
ACE: in server.cfg, authorize the administrator group used by your server. The example below uses group.admin; the player must already belong to this group.
add_ace group.admin hookah.staff allow
Classic vRP: uncomment @vrp/lib/utils.lua in the server_scripts section of fxmanifest.lua and place the callback below at the end of config_server.lua. Replace admin.permissao with your framework administrator permission. This example uses Proxy with table arguments; adapt the calls if your framework uses a different API.
local Proxy = module('vrp', 'lib/Proxy')
local vRP = Proxy.getInterface('vRP')
Config.Permissions.isStaff = function(src)
local userId = vRP.getUserId({ src })
return userId ~= nil
and vRP.hasPermission({ userId, 'admin.permissao' }) == true
end
Choose the method that suits your framework. When Config.Permissions.isStaff is defined, its true or false return value decides Staff panel access.
The Config.Permissions.bootstrapAce ACE authorizes the owner registration command in game.
| Initial role | Initial access |
|---|
| owner | Owner: full access by default. |
| manager | Manager: tables, register, stock, staff, ranking, metrics and payments. |
| employee | Employee: tables, register, stock, ranking and metrics. |
Config.Permissions.roleOverrides = {
manager = { permissions = { withdraw = true, reviewPayments = true } },
}
-- server.cfg
add_ace group.admin hookah.bootstrap allow