Comandos#
Admin Menu registra dos comandos de chat, tres atajos de teclado y dos comandos de consola. Cada acción que hay detrás se comprueba con los permisos del jugador en el servidor.
Comando | Dónde | Descripción |
|---|---|---|
| En el juego | Abre o cierra el Admin Panel. Sin cuenta, se abre en el registro: así se registra el staff nuevo. El nombre es |
| En el juego | Abre el Report Center para cualquier jugador. El nombre es |
| Tecla | Abre el Admin Panel; solo para administradores del framework y cuentas aprobadas. Para los demás no hace nada. |
| Tecla | Activa o desactiva el noclip ( |
| Tecla | Abre Fast Actions. |
| Consola del servidor | Si Cloudflare TURN está activado, los servidores que usa y cuándo caducan sus credenciales. |
| Consola del servidor | Obtiene ahora credenciales nuevas de Cloudflare TURN. |
Las tres teclas son valores por defecto de Config.Shortcuts; cada miembro del staff puede reasignar las suyas en el Profile.
Exports del cliente#
Para abrir los menús desde tus propios scripts (un menú radial, una app del teléfono, un botón del HUD) y para consultar en qué estado están.
Menús y ventanas
local open = exports['qs-adminmenu']:IsAdminMenuOpen()
local fastOpen = exports['qs-adminmenu']:IsFastActionMenuOpen()
exports['qs-adminmenu']:ToggleFastActionMenu()
-- The players' Report Center
exports['qs-adminmenu']:OpenPlayerReports()
exports['qs-adminmenu']:ClosePlayerReports()Útil para evitar que tu propia interfaz se abra encima del panel, o para poner un botón "Report" en un teléfono o un menú radial.
Noclip y modo espectador
local flying = exports['qs-adminmenu']:IsNoclipEnabled()
exports['qs-adminmenu']:SetNoclipEnabled(false) -- returns the new state
exports['qs-adminmenu']:ExitSpectate()SetNoclipEnabled actúa sobre el jugador local sin comprobar sus permisos: llámalo solo desde tu propio código, por ejemplo para sacar a un miembro del staff del noclip cuando empieza una cinemática.
Atajos
local keys = exports['qs-adminmenu']:GetShortcuts()
-- { openMenu = 'F5', noclip = 'PAGE_DOWN', fastAction = 'DELETE' }
local defaults = exports['qs-adminmenu']:GetDefaultShortcuts()
local allowed = exports['qs-adminmenu']:GetSupportedShortcutKeys()
-- { 'DELETE', 'F10', 'F5', 'F6', 'F7', 'F8', 'F9', 'PAGE_DOWN' }
local result = exports['qs-adminmenu']:UpdateShortcuts({
openMenu = 'F6',
noclip = 'F7',
fastAction = 'F8',
})
-- { ok = true|false, err = nil|'invalid_shortcut', shortcuts = {...} }UpdateShortcuts necesita las tres teclas, cada una de la lista admitida. La elección se guarda en el PC de ese jugador.
Preferencias
local prefs = exports['qs-adminmenu']:GetPreferences()
-- { fastActionPosition = 'right-center' }
local defaults = exports['qs-adminmenu']:GetDefaultPreferences()
local result = exports['qs-adminmenu']:UpdatePreferences({
fastActionPosition = 'left-bottom',
})
-- { ok = true|false, err = nil|string, preferences = {...} }Posiciones: left-top, left-center, left-bottom, right-top, right-center, right-bottom.
Exports del servidor#
Cómo un anticheat, un bot de Discord o tus propios scripts moderan a través de Admin Menu, para que cada advertencia, expulsión y baneo acabe en la misma lista de baneos, los mismos logs y los mismos canales de Discord que uno hecho desde el panel. Las acciones hechas mediante un export se registran como procedentes de console.
WarnPlayer · KickPlayer
local ok, err = exports['qs-adminmenu']:WarnPlayer(source, 'Mic spam')
local ok, err = exports['qs-adminmenu']:KickPlayer(source, 'AFK in a restricted zone')El jugador ve el aviso a pantalla completa con el motivo y después se aplica la acción.
BanPlayer
-- durationSeconds: nil or 0 = permanent, otherwise 60 seconds to 10 years
local ok, banId = exports['qs-adminmenu']:BanPlayer(source, 'Aimbot detected', 7 * 24 * 3600)
-- ok = false → banId holds the error, e.g. 'invalid_duration'Banea a un jugador conectado con todos sus identificadores y tokens de hardware, y lo expulsa con el mensaje de baneo.
BanIdentifiers
local ok, banId = exports['qs-adminmenu']:BanIdentifiers(
{ 'license:xxxxxxxx', 'discord:123456789012345678' },
'Chargeback',
nil, -- permanent
'PlayerName' -- optional, shown in the Bans page
)Banea a alguien que está desconectado. Si alguno de esos identificadores está conectado ahora mismo, ese jugador es expulsado.
UnbanPlayer · IsPlayerBanned
local ok, err = exports['qs-adminmenu']:UnbanPlayer(banId, 'Appeal accepted')
local banned = exports['qs-adminmenu']:IsPlayerBanned(source)GetPlayerGroup · GetAdminRole
local group = exports['qs-adminmenu']:GetPlayerGroup(source)
-- the framework group: 'user', 'admin', 'superadmin'...
local role = exports['qs-adminmenu']:GetAdminRole(source)
-- { name = 'ADMIN', label = 'ADMIN', priority = 700 }, or nil when they have no approved accountCompara priority en lugar del nombre para que siga funcionando cuando renombres roles.
Eventos del servidor#
Se disparan con cada advertencia, expulsión, baneo y desbaneo, ya sea desde el panel, un export o cualquier otro sitio. Son solo del lado del servidor: escúchalos con AddEventHandler, no con RegisterNetEvent.
Evento | Datos |
|---|---|
|
|
|
|
|
|
|
|
admin es el id de servidor del miembro del staff, o 0 cuando la acción vino de la consola o de un export. target es nil en un baneo por identificadores; duration (segundos) y expiresAt (tiempo unix) son nil en un baneo permanente.
AddEventHandler('qs-adminmenu:playerBanned', function(data)
print(('%s banned %s (#%s): %s'):format(data.adminName, data.targetName, data.banId, data.reason))
end)Sobre los errores#
Los exports que pueden rechazar devuelven false y una clave corta en lugar de una frase: invalid_duration, player_not_found, bans_unavailable. Registra la clave en tu propio script; la frase correspondiente en cada idioma está en locales/. Errores comunes explica los que probablemente te encuentres.



