Lista blanca de FiveM

Lista blanca de FiveM: guía completa (txAdmin, scripts, base de datos)

Una lista blanca en FiveM es un mecanismo de control de acceso que restringe el acceso al servidor a jugadores preaprobados, identificados por sus identificadores únicos (licencia de Rockstar, ID de Steam, ID de Discord, etc.). A continuación, se incluye una guía lista para producción que abarca la lista blanca integrada de txAdmin, los patrones de script, el almacenamiento de la base de datos y las notas de fiabilidad.


Matriz de opciones TL;DR

ModoDónde colocarloQué compruebaMejor paraNotas
Licencia AprobadatxAdmin → Configuración → Administrador de jugadores → Modo de lista blancalicense: (Estrella de rock)La mayoría de los servidoresSimple, confiable; admite aprobaciones manuales o preaprobaciones
Miembro de DiscordtxAdmin (vinculado a Discord)discord: es miembro del gremioComunidades centradas en DiscordUsuarios que no son de Discord bloqueados
Rol de DiscordtxAdmin (vinculado a Discord)discord: tiene un papel específicoAcceso restringido por roles (donante, personal)Combinar con automatizaciones de roles
Solo para administradoresAdministrador de transaccionesSolo administradoresNoches de mantenimiento/desarrolloBloquea efectivamente el servidor, no recomendado
Script personalizadoRecurso de Lua/JSCualquier identificador que quierasReglas granulares y experiencia de usuarioNecesita código + mantenimiento

Recomendación: Usar Licencia Aprobada Para la línea base (todos tienen una licencia de Rockstar), luego agregue Rol de Discord como puerta adicional para niveles especiales.


Cómo habilitar y operar la lista blanca en txAdmin

Prerrequisitos

  • txAdmin ejecutándose (incluido con FXServer).
  • Para los modos de Discord: integración de Discord configurada (bot invitado, gremio/rol seleccionado).

Habilitar lista blanca

  1. Abierto txAdmin → Configuración → Administrador de jugadores.
  2. Colocar Modo de lista blanca a uno de: Licencia Aprobada, Miembro de Discord, Rol de Discord, o Solo para administradores.
  3. Establecer un Mensaje de rechazo, p.ej:
    Not whitelisted. Apply at discord.gg/yourinvite
  4. Ahorrar.

Aprobar jugadores (dos flujos)

  • Pasivo (cola): Cuando un jugador no aprobado intenta unirse, aparece una solicitud debajo Lista blanca. Aprobar/rechazar con un clic.
  • Activo (preaprobación): Ir a Lista blanca → Agregar aprobación y pegar un identificador en el formulario type:value, p.ej
    • license:110000112345678
    • steam:11000010abcdef0
    • discord:123456789012345678

Revocar

  • Abierto Jugadores o Lista blanca y haga clic Revocar junto a la aprobación.

Consejos

  • Preferir licencia Identificadores para acceso de línea base (universalmente presentes).
  • Mantén tu mensaje de rechazo procesable (enlace de Discord + reglas básicas + CTA del ticket).
  • Para el personal/desarrolladores, requisitos de la pila: por ejemplo, debe ser license + discord role.

Detalles de implementación técnica

Las listas blancas se ejecutan durante el diferimiento de conexión etapa. El servidor inspecciona el conjunto de identificadores del jugador y acepta o rechaza antes de que se carguen los recursos. Esto mantiene baja la carga y bloquea a los jugadores no aprobados temprano.

Tipos de Identificadores (confiabilidad)

  • license: (Estrella de rock) — estable, vinculado a la compra del juego; clave principal recomendada.
  • steam: — presente solo si se ejecuta Steam; puede faltar si los jugadores no usan Steam.
  • discord: — presente solo si Discord se ejecuta y su servidor lo lee.
  • ip: — dinámico; se utiliza para telemetría/límite de velocidad, no para identidad.

Script de lista blanca mínima (aplazamientos UX + multi-ID)

-- resource: simple-whitelist
-- fxmanifest.lua should include '@oxmysql/lib/MySQL.lua' if you use DB code below.

local STATIC_WHITELIST = {
 ["license:110000112345678"] = true,
 ["steam:11000010abcdef0"] = true,
 ["discord:123456789012345678"] = true,
}

local function collectIdentifiers(src)
 local ids = {}
 for _, id in ipairs(GetPlayerIdentifiers(src)) do ids[id] = true end
 return ids
end

AddEventHandler("playerConnecting", function(name, setKickReason, deferrals)
 local src = source
 deferrals.defer()
 deferrals.update(("Checking whitelist for %s..."):format(name))

 local ids = collectIdentifiers(src)

 -- Require at least a Rockstar license in all cases
 local hasLicense = false
 for id, _ in pairs(ids) do
 if id:sub(1, 8) == "license:" then hasLicense = true break end
 end
 if not hasLicense then
 return deferrals.done("You must start the game normally (Rockstar license missing). Restart and try again.")
 end

 -- Static allowlist quick‑path
 for id, _ in pairs(ids) do
 if STATIC_WHITELIST[id] then
 return deferrals.done()
 end
 end

 -- Fallback: not approved
 return deferrals.done("Not whitelisted. Apply at discord.gg/yourinvite")
end)

Usar aplazamientos.actualización Mostrar mensajes de progreso al verificar las identificaciones o una base de datos. Esto reduce los informes falsos de tiempo de espera.


Lista blanca basada en bases de datos (oxmysql, lista para producción)

Esquema

CREATE TABLE IF NOT EXISTS whitelist (
 id INT UNSIGNED NOT NULL AUTO_INCREMENT,
 identifier VARCHAR(64) NOT NULL,
 note VARCHAR(120) NULL,
 added_by VARCHAR(64) NULL,
 added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (id),
 UNIQUE KEY u_identifier (identifier)
);

Comprobación del lado del servidor (oxmysql)

-- Requires oxmysql. Add to fxmanifest: '@oxmysql/lib/MySQL.lua'
AddEventHandler('playerConnecting', function(name, setKickReason, deferrals)
 local src = source
 deferrals.defer()
 deferrals.update('Verifying whitelist...')

 local ids = {}
 for _, id in ipairs(GetPlayerIdentifiers(src)) do table.insert(ids, id) end

 -- Single scalar: any identifier approved?
 local rowCount = MySQL.scalar.await(
 'SELECT COUNT(*) FROM whitelist WHERE identifier IN (?)',
 { ids }
 )

 if rowCount and rowCount > 0 then
 return deferrals.done()
 else
 return deferrals.done('Access denied. Apply at discord.gg/yourinvite')
 end
end)

Comandos de calidad de vida del administrador (ejemplo)

RegisterCommand('wladd', function(src, args)
 if src ~= 0 then return end -- console only for simplicity
 local identifier = args[1]
 if not identifier or not identifier:find(':') then
 print('Usage: wladd identifierType:identifierValue')
 return
 end
 local ok = MySQL.prepare.await('INSERT IGNORE INTO whitelist (identifier,note,added_by) VALUES (?, ?, ?)', {
 identifier, 'manual add', 'console'
 })
 print(ok and ('Whitelisted: %s'):format(identifier) or 'Failed to add')
end, true)

RegisterCommand('wlrm', function(src, args)
 if src ~= 0 then return end
 local identifier = args[1]
 local ok = MySQL.prepare.await('DELETE FROM whitelist WHERE identifier = ?', { identifier })
 print(ok and ('Removed: %s'):format(identifier) or 'Failed to remove')
end, true)

Para MySQL asíncrono, reemplazar MySQL.scalar.await con MySQL.Async.fetchScalar y el estilo del parámetro con @param/?. Preferir oxmysql para el rendimiento y esperar soporte.

Actuación

  • Mantener un Índice ÚNICO en identifier (ver esquema).
  • Opcionalmente calentar una memoria caché al iniciar y al cambiar; accede a la base de datos solo en caso de falla de caché.
  • Límite de velocidad de intentos fallidos de conexión repetidos por license/IP.

Reglas de múltiples identificadores

Algunos servidores requieren varias ID (p. ej., Steam y Discord) para los niveles de personal. Ejemplo de patrón:

local function hasType(ids, typ)
 for id, _ in pairs(ids) do if id:sub(1, #typ+1) == (typ..':') then return true end end
 return false
end

-- Require license, and if staff, also discord
if not hasType(ids, 'license') then
 return deferrals.done('Start the game normally (license missing).')
end
if staffModeEnabled and not hasType(ids, 'discord') then
 return deferrals.done('Join our Discord and link your account to enter.')
end

Usar Discord como lista blanca (sin código personalizado)

Si tu comunidad funciona en Discord, usa txAdmin Miembro de Discord o Rol de Discord modos:

  • Vincula txAdmin a tu gremio de Discord.
  • Elegir Miembro de Discord permitir a cualquier miembro del gremio, o Rol de Discord para controlar un rol específico (por ejemplo, @Whitelisted).
  • Mantener Licencia Aprobada como segunda puerta si quieres ambas condiciones.

Mejores prácticas: mantener una #whitelist-requests Canal + formulario ligero. Automatiza la asignación de roles tras la aprobación mediante un bot o un flujo de moderación.

FAXES: Un sistema de lista blanca de Discord para FiveM


Ideas de integración

  • Bots de Discord:aprobar automáticamente cuando un usuario completa una solicitud, la impulsa o se suscribe.
  • Panel web:el personal agrega o elimina identificadores, con registro de auditoría.
  • Niveles de pago: conceder discord role a través de su tienda (Tebex/Patreon) y deje que el modo de rol txAdmin imponga el acceso.

Solución de problemas y trampas

  • El jugador no aparece en las solicitudes de txAdmin:Asegúrese de que la lista blanca esté habilitada en el perfil correcto; verifique que el jugador realmente haya alcanzado la etapa de aplazamiento (mire la consola en vivo de txAdmin).
  • Falta el ID de Steam:Steam debe estar ejecutándose; no configures tu lista blanca únicamente en eso steam:. Preferir license:.
  • Falta el ID de Discord:El usuario debe tener Discord ejecutándose y su servidor debe estar configurado para leer discord:; verificar la integración de Discord.
  • license contra license2:Algunos marcos registran dos campos de licencia; asegúrese de que sus consultas de migración/base de datos consideren ambos al mover datos.
  • Tiempos de espera de aplazamiento:Llamar siempre deferrals.update(...) mientras espera a DB; responda dentro de ~10–15 segundos.
  • Formato de identificador no coincidente:Asegúrate de pegar type:value exactamente (en minúsculas, separador de dos puntos).
  • Altos picos de tráfico:Almacene en caché la lista blanca en la memoria, precaliente al inicio y elimine el rebote de las llamadas a la base de datos.

Preguntas frecuentes sobre SEO (contenido preparado para esquemas)

¿Cuál es el mejor identificador para la lista blanca de FiveM?
La estrella de rock license: es la más universal y confiable; úsela como su clave principal.

¿Puedo incluirme en la lista blanca de Discord sin codificar?
Sí. txAdmin lo admite Miembro de Discord y Rol de Discord modos de lista blanca una vez que Discord esté vinculado.

¿Necesito Steam para la lista blanca?
No. Muchos jugadores no usan Steam; evita hacer steam: obligatorio para el acceso de línea base.

¿Puedo combinar varias comprobaciones (por ejemplo, licencia + rol de Discord)?
Sí. Usar el modo de rol txAdmin y Mantenga una verificación de licencia en su secuencia de comandos personalizada o flujo de admisiones.

¿Cómo puedo preaprobar a los jugadores?
txAdmin → Lista blanca → Agregar aprobación, pegar identifierType:identifier (p.ej, license:...).


Mensajes de rechazo de copiar y pegar (use su marca)

  • Basado en colas: You’re not whitelisted yet. Apply in #whitelist-requests → discord.gg/yourinvite
  • Controlado por roles: Your Discord account doesn’t have @Whitelisted. Join discord.gg/yourinvite and request access.
  • Mantenimiento: Server is in Admin‑only mode for maintenance. Please try again later.

Conclusión

Una lista blanca de FiveM valida los identificadores de los jugadores durante la fase de aplazamiento de la conexión y bloquea a los usuarios no autorizados antes de que se carguen los recursos. En la mayoría de los servidores, habilite Licencia Aprobada En txAdmin, opcionalmente capa Rol de Discord Para el acceso a la comunidad y utilizar un Respaldado por base de datos Lista con almacenamiento en caché para escalar.


Apéndice: Ejemplo mínimo original (para referencia)

-- server.lua
local whitelist = {
 ["steam:110000132456789"] = true,
 ["license:abc123def456789"] = true,
 ["discord:123456789012345678"] = true
}

AddEventHandler("playerConnecting", function(name, setKickReason, deferrals)
 local player = source
 local identifiers = GetPlayerIdentifiers(player)
 local whitelisted = false
 
 deferrals.defer()
 
 for _, id in pairs(identifiers) do
 if whitelist[id] then
 whitelisted = true
 break
 end
 end
 
 if not whitelisted then
 deferrals.done("Not whitelisted. Apply at: your-discord.gg/invite")
 else
 deferrals.done()
 end
end)
Deja una respuesta