Saltar al contenido
Blog

Permisos ACE en FiveM: solo los comandos que tu staff necesita

Cómo funcionan add_ace y add_principal en server.cfg, una configuración de mods y admins para copiar, comprobaciones en scripts y cuándo ACE se queda corto.

Por Termi

5 min de lectura
  • Staff
  • Permissions
  • server.cfg
  • Security
En esta página

Todo servidor de FiveM acaba topándose con la misma pregunta: ¿cómo dejas que un moderador expulse jugadores sin que pueda repartir dinero ni apagar el servidor? FXServer la responde con ACE, el sistema de permisos que configuras en server.cfg. Esta guía explica cómo funciona ACE, una configuración de staff para copiar, cómo comprueban los scripts los permisos y dónde ACE se queda corto.

Cómo funciona ACE

ACE tiene dos tipos de líneas. add_ace da un permiso a un principal, y add_principal hace que un principal herede de otro. Los jugadores son principals con el nombre de sus identifiers, y los grupos son principals a los que pones nombre tú:

server.cfg
add_ace group.admin command allow
add_ace group.admin command.quit deny
add_ace group.mod command.kick allow
add_ace group.mod command.warn allow

add_principal group.admin group.mod

add_principal identifier.license:9a4f00ab12cd34ef group.admin
add_principal identifier.discord:123456789012345678 group.mod
  • command solo cubre todos los comandos, así que group.admin puede ejecutarlos todos.
  • command.quit deny quita uno de ellos. Un deny gana a un allow para el mismo permiso, y el server.cfg por defecto usa justo esta línea para que los admins no puedan ejecutar quit.
  • command.kick cubre el comando kick y nada más.
  • add_principal group.admin group.mod hace que los admins hereden todo lo que tienen los mods.
  • Los jugadores entran en un grupo mediante un identifier: license, discord, steam o fivem. Usa la licencia siempre que puedas, porque se queda con la cuenta de Rockstar.

Las mismas líneas escritas en la consola del servidor se aplican al instante, así que no necesitas reiniciar para dar un rol. Ponlas también en server.cfg, o desaparecerán en el siguiente reinicio.

Comprobar permisos en un script

Un comando registrado como restringido solo se ejecuta para los principals que tienen command.<nombre>. La restricción es el true del final:

server.lua
RegisterCommand('revive', function(source, args)
    local target = tonumber(args[1]) or source
    TriggerClientEvent('hospital:revive', target)
end, true)

Para todo lo que no sea un comando, como un botón de menú o un net event, comprueba tú mismo el permiso en el servidor y concédelo como cualquier otro ACE:

server.lua
RegisterNetEvent('admin:giveMoney', function(target, amount)
    if not IsPlayerAceAllowed(source, 'admin.money') then return end
    local player = QBCore.Functions.GetPlayer(target)
    if player then player.Functions.AddMoney('bank', amount, 'admin') end
end)
server.cfg
add_ace group.admin admin.money allow

Comprueba en el servidor

No confíes nunca en una comprobación de permisos en un script de cliente. Los jugadores pueden disparar cualquier net event con los argumentos que quieran, así que la comprobación tiene que estar en el handler del servidor.

ESX, QBCore y txAdmin

QBCore también usa ACE: sus niveles de permiso son principals llamados qbcore.god, qbcore.admin y qbcore.mod, que repartes con add_principal. ESX guarda su propia columna group en users y la comprueba con xPlayer.getGroup(). txAdmin tiene un tercer sistema, cuentas de admin con permisos propios para su panel y su menú dentro del juego, como expulsar, banear o reiniciar, y esos solo valen dentro de txAdmin.

Cuándo ACE se queda corto

  • Vive en server.cfg. Cambiar los permisos de un moderador significa editar un archivo y volver a ejecutar la línea en la consola.
  • ACE no guarda quién ejecutó qué, así que después no hay nada que relacione un comando con una persona.
  • Solo puede permitir o denegar. Un comando que reparte un millón de dólares se ejecuta en cuanto alguien con el permiso lo escribe, y no hay forma de hacer que espere a una segunda persona.

Roles y aprobaciones en FiveDock

El panel de FiveDock ejecuta comandos del servidor a través del agente, así que el staff puede actuar desde el móvil sin entrar al juego. Cada miembro del staff inicia sesión con su propia cuenta, con passkey, Discord o un enlace por correo, y cada acción queda en el registro de actividad con su nombre, en todos los planes.

En Metro, los roles deciden quién puede ejecutar cada comando: soporte tiene kick y warn, los owners tienen todo. Con un segundo owner, los comandos peligrosos esperan su aprobación antes de ejecutarse. En Free y City, los comandos que dan dinero o items ya pueden esperar el visto bueno de otro miembro del staff.

Metro también enmascara los datos personales según el rol, así que los nuevos nunca ven direcciones reales ni datos de pago, y su visor de base de datos permite a los admins mirar una tabla mientras la contraseña de la base de datos se queda en el servidor.

Preguntas frecuentes

¿Cómo doy admin a alguien en mi servidor de FiveM?

Añade a server.cfg una línea que meta su identifier en el grupo admin, como add_principal identifier.license:<su licencia> group.admin, y asegúrate de que group.admin tenga los permisos que quieres, por ejemplo add_ace group.admin command allow. Escribe las mismas líneas en la consola del servidor para aplicarlas sin reiniciar.

¿Dónde encuentro el identifier de licencia de un jugador?

La página del jugador en txAdmin lista todos los identifiers, igual que la native GetPlayerIdentifiers(source). La licencia es el que empieza por license:.

¿Cuál es la diferencia entre add_ace y add_principal?

add_ace da un permiso a un principal. add_principal hace que un principal sea miembro de otro, así que hereda sus permisos. Los permisos se los das a los grupos con add_ace y metes a los jugadores en grupos con add_principal.

¿Por qué mi comando restringido dice access denied?

El identifier del jugador no está en ningún grupo que tenga command.<nombre>, o la línea usa un identifier distinto del que usa para conectarse. Revisa el tipo y el valor del identifier, y recuerda que un deny anula un allow.

Todos los artículos