Crea un recurso independiente para enviar avisos a todos los jugadores desde un comando protegido con ACE. El servidor autoriza y distribuye el mensaje; el cliente muestra una notificación del juego. No requiere ESX, QBCore ni un recurso de chat.
FiveM ya está disponible en las categorías de The Silencers. Este ejemplo sirve como primer recurso para aprender manifiestos, comandos, permisos y eventos con un resultado visible.
Última revisión: 2 de octubre de 2026. Referencia: FXServer actual, manifiesto cerulean y runtime Lua 5.4. Se revisó la sintaxis y las APIs oficiales; no se ejecutó en GTA V/FiveM durante esta revisión. Utiliza el artifact recomendado por Cfx.re para tu plataforma, sin asumir que un número de build antiguo sigue vigente.
Tres archivos en tu servidor
Necesitas un servidor de prueba FiveM operativo, acceso a su carpeta de recursos y a la consola del servidor, además de un cliente para comprobar el aviso. Si aún no tienes servidor, sigue la instalación oficial y descarga los artifacts desde Cfx.re. Trabaja primero en una instancia propia de pruebas.
Crea resources/[local]/silencers_avisos/. Dentro guarda fxmanifest.lua:
fx_version 'cerulean'
game 'gta5'
author 'The Silencers'
description 'Ejemplo de avisos protegidos con ACE'
version '1.0.0'
server_script 'server.lua'
client_script 'client.lua'Ese 1.0.0 identifica nuestro ejemplo, no la versión de FXServer. El archivo debe llamarse fxmanifest.lua, no fxmanifest.lua.txt. server_script ejecuta la autorización en el servidor y client_script registra la presentación en cada cliente. No añadas lua54 'yes': Cfx.re lo marca como obsoleto, ya que sus scripts Lua utilizan 5.4 desde junio de 2025.
Autoriza antes de emitir
Guarda server.lua:
local lastAnnouncement = -math.huge
local function feedback(target, message)
if target == 0 then
print('[silencers_avisos] ' .. message)
else
TriggerClientEvent('silencers:notice', target, message)
end
end
RegisterCommand('aviso', function(source, args)
local message = table.concat(args, ' ')
:gsub('[~%c]', ''):match('^%s*(.-)%s*$')
if #message == 0 or #message > 80 then
feedback(source, 'Uso: aviso texto de hasta 80 bytes')
return
end
local now = os.time()
if now - lastAnnouncement < 15 then
feedback(source, 'Espera 15 segundos entre avisos')
return
end
lastAnnouncement = now
TriggerClientEvent('silencers:notice', -1, message)
print(('[silencers_avisos] origen=%d aviso=%s'):format(source, message))
end, true)El último true restringe el comando mediante el objeto ACE command.aviso. Los jugadores necesitan tenerlo permitido; la consola del servidor puede utilizar el comando. -1 envía el evento a todos los clientes conectados. No se registra un evento del servidor que permita al cliente saltarse el comando.
El límite se mide en bytes: las letras acentuadas pueden ocupar más de uno. Se retiran caracteres de control y ~ para que el texto no introduzca directivas de formato del juego. El enfriamiento es global y se reinicia al reiniciar el recurso; no es una cola persistente de avisos.

Muestra la notificación
Guarda client.lua:
RegisterNetEvent('silencers:notice', function(message)
if source ~= 65535 then return end
if type(message) ~= 'string' or #message == 0 or #message > 80 then return end
local plain = message:gsub('[~%c]', '')
BeginTextCommandThefeedPost('STRING')
AddTextComponentSubstringPlayerName('AVISO: ' .. plain)
EndTextCommandThefeedPostTicker(false, true)
end)La comprobación de source acepta la procedencia de red del servidor y evita llamadas locales ordinarias al manejador. No convierte un cliente manipulado en una fuente de confianza: la autorización relevante sigue en el servidor. Las tres natives abren el texto de una notificación, añaden el contenido y publican el resultado; el segundo booleano guarda también el aviso en el historial de notificaciones del menú.
Da acceso al comando concreto
Añade al server.cfg que utiliza tu instancia:
add_ace group.silencersAvisos command.aviso allow
add_principal identifier.license:REEMPLAZA_CON_TU_LICENSE group.silencersAvisos
ensure silencers_avisosReemplaza el identificador de ejemplo por el license: real de tu jugador, obtenido en el servidor. La referencia oficial de GetPlayerIdentifiers muestra los formatos disponibles; no confundas el ID temporal del jugador con su license. Si ya tienes grupos ACE administrados, puedes conceder command.aviso a uno apropiado y utilizar su pertenencia existente.
Esta regla concede este comando, no todos los comandos de administración. Los permisos de un panel txAdmin y los ACE de tus scripts son sistemas que debes configurar según su ámbito; pertenecer a un panel no demuestra que este objeto esté permitido.
Tras modificar server.cfg reinicia la instancia de prueba. Para cargar solo nuevos archivos de un recurso que acabas de crear, ejecuta refresh y ensure silencers_avisos en la consola. Para aplicar cambios posteriores al código usa restart silencers_avisos.
Comprueba autorización y resultado
Con un cliente conectado, escribe en la consola del servidor aviso Mantenimiento en cinco minutos. Debe aparecer una notificación «AVISO: ...». Espera al menos 15 segundos y utiliza /aviso Hola comunidad en un cliente con acceso al comando, o aviso Hola comunidad desde F8.
Prueba también un jugador sin el ACE: no debe emitir avisos. En la consola puedes comprobar la regla con test_ace identifier.license:TU_LICENSE command.aviso; sustituye el identificador. Si ese jugador ya hereda un permiso amplio command, podría tener acceso por otra regla: inspecciona las herencias en vez de dar por correcta una prueba solo con administradores.
Si el recurso no se encuentra, revisa su carpeta y el nombre usado por ensure. Si aparece una excepción de native en el servidor, confirma que el código de notificación esté únicamente en client.lua. Si el aviso no llega, comprueba que cliente y servidor usan exactamente silencers:notice y que el recurso está iniciado. No necesitas instalar un framework para arreglar este ejemplo.
Fuentes y documentación
Proyecto y desarrollador: FiveM/Cfx.re, parte de Rockstar Games. Página oficial: fivem.net. Descarga del servidor: Cfx.re Server Download. Licencias y condiciones: LICENSE del proyecto y el acuerdo de plataforma al que remite. No se considera que todos sus componentes compartan una licencia única ni se adjunta software de terceros. Código del recurso y diagramas originales de The Silencers.






Comentarios 0
Únete a la conversación con tu cuenta.
Inicia sesiónCargando comentarios…