Saltar al contenido

10 % de descuento, aplicado al pagar

RPScriptsRPScripts
Herramientas FiveM gratuitas

Plantilla gratuita · archivos fuente incluidos

Script gratis de reglas para tu servidor FiveM

Ofrece a los jugadores un comando /rules que abre las reglas de tu servidor en un pequeño panel NUI. Descarga la plantilla existente de RPScripts, edita las reglas y pruébala en tu servidor.

  • 7 archivos fuente
  • Sin dependencias de framework ni base de datos
Descargar ZIP gratis

Esta descarga no requiere cuenta, pago ni créditos de IA.

Qué hace el script

El comando /rules abre un panel con reglas editables. Los jugadores lo cierran con Escape o con el botón «Close». El código del cliente libera el foco de la NUI al cerrar el panel y al detener el recurso.

Esta pequeña plantilla solo muestra las reglas. No registra su aceptación, no las hace cumplir, no gestiona permisos ni sustituye las herramientas de moderación.

NUI del panel de reglas renderizada en un navegador con mensajes del juego simulados
Vista previa registrada en el navegador con mensajes del juego simulados. No es una captura de pantalla dentro del juego.

Instálalo en un servidor de pruebas

  1. Extrae el ZIP en resources/[local]/ para que el manifiesto quede en resources/[local]/rules_board/fxmanifest.lua. Evita anidar otra carpeta rules_board dentro de ella.
  2. Edita Config.Rules en config.lua y los textos del panel en locales/en.lua. Si otro recurso ya utiliza /rules, cambia Config.Command antes de iniciar este.
  3. Añade la línea de abajo a server.cfg y reinicia tu servidor de pruebas. Mantén el nombre rules_board en la carpeta del recurso para que coincida con el comando.
    ensure rules_board
  4. Conéctate con FiveM y ejecuta /rules. Revisa cada regla, cierra el panel con el botón, vuelve a abrirlo y ciérralo con Escape. Comprueba que recuperas el movimiento y el control del ratón y busca errores en las consolas F8 y del servidor. Prueba también a detener y reiniciar el recurso.
Leer la referencia de manifiestos de recursos de FiveM

Personalízalo

Config.Command
El nombre del comando sin la barra. El valor predeterminado es rules.
Config.Rules
La lista de textos de las reglas que se muestran en el panel. Sustituye las tres reglas de ejemplo por las tuyas.
Config.Layout.panel
Punto de anclaje del panel y desplazamientos x/y en porcentaje. De forma predeterminada, se sitúa arriba a la derecha.
Config.Theme.name
Elige blue, red, green, orange o purple, o indica un color CSS.
locales/en.lua
El título del panel, el texto del botón «Close» y la indicación de la tecla Escape. Tradúcelos para tus jugadores.

Revisa el código fuente antes de instalar

Estos son exactamente los siete archivos del ZIP. El código Lua, HTML, CSS y JavaScript se puede leer y editar. Abrir un archivo aquí no lo ejecuta.

config.lua
Config = {}

Config.Command = 'rules'

-- Exactly three rules shown in the panel
Config.Rules = {
    'Respect all players and staff. No harassment or hate speech.',
    'No random killing (RDM) or vehicle deathmatching (VDM).',
    'No cheating, exploiting bugs or using unfair advantages.'
}

Config.Layout = { panel = { anchor = 'top-right', x = 2.0, y = 3.0 } }
Config.Theme = { name = 'blue' }
Config.SpeedUnit = 'kmh'
fxmanifest.lua
fx_version 'cerulean'
game 'gta5'
lua54 'yes'

name 'rules_board'
description 'Standalone /rules command with NUI panel'
version '1.0.0'

shared_scripts {
    'config.lua',
    'locales/en.lua'
}

client_script 'client/main.lua'

ui_page 'html/index.html'

files {
    'html/index.html',
    'html/style.css',
    'html/script.js'
}
html/script.js
const panel = document.getElementById('panel');
const colors = { blue: '#3b82f6', red: '#ef4444', green: '#22c55e', orange: '#f97316', purple: '#a855f7' };

function post(name, data) {
    return fetch(`https://${GetParentResourceName()}/${name}`, {
        method: 'POST',
        body: JSON.stringify(data || {})
    }).catch(() => {});
}

function place(layout) {
    panel.style.top = panel.style.bottom = panel.style.left = panel.style.right = 'auto';
    panel.style.transform = '';
    const a = (layout && layout.anchor) || 'top-right';
    const x = ((layout && layout.x) || 0) + '%';
    const y = ((layout && layout.y) || 0) + '%';
    let tx = '', ty = '';
    if (a.includes('top')) panel.style.top = y;
    else if (a.includes('bottom')) panel.style.bottom = y;
    else { panel.style.top = '50%'; ty = 'translateY(-50%)'; }
    if (a.includes('left')) panel.style.left = x;
    else if (a.includes('right')) panel.style.right = x;
    else { panel.style.left = '50%'; tx = 'translateX(-50%)'; }
    panel.style.transform = (tx + ' ' + ty).trim();
}

window.addEventListener('message', (e) => {
    const d = e.data;
    if (d.action === 'open') {
        document.getElementById('title').textContent = d.title;
        document.getElementById('hint').textContent = d.hint;
        document.getElementById('closeBtn').textContent = d.close;
        const list = document.getElementById('rules');
        list.innerHTML = '';
        (d.rules || []).forEach((r) => {
            const li = document.createElement('li');
            li.textContent = r;
            list.appendChild(li);
        });
        const c = colors[d.theme] || d.theme || colors.blue;
        panel.style.borderTopColor = c;
        document.getElementById('closeBtn').style.background = c;
        place(d.layout);
        panel.classList.remove('hidden');
    } else if (d.action === 'close') {
        panel.classList.add('hidden');
    }
});

document.getElementById('closeBtn').addEventListener('click', () => post('close'));
document.addEventListener('keydown', (e) => {
    if (e.key === 'Escape' && !panel.classList.contains('hidden')) post('close');
});
html/style.css
html, body { margin: 0; height: 100%; overflow: hidden; background: transparent; font-family: Arial, sans-serif; }
#panel {
    position: absolute;
    width: 320px;
    padding: 18px 20px;
    border-radius: 10px;
    background: rgba(20, 24, 33, 0.92);
    color: #fff;
    border-top: 4px solid #3b82f6;
    box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
}
#panel.hidden { display: none; }
h1 { margin: 0 0 12px; font-size: 20px; }
ol { margin: 0 0 12px; padding-left: 20px; font-size: 14px; line-height: 1.45; }
li { margin-bottom: 8px; }
#hint { margin: 0 0 12px; font-size: 11px; opacity: 0.6; }
button {
    width: 100%;
    padding: 8px;
    border: 0;
    border-radius: 6px;
    background: #3b82f6;
    color: #fff;
    font-size: 14px;
    cursor: pointer;
}
button:hover { filter: brightness(1.15); }
locales/en.lua
Locale = {
    title = 'Server Rules',
    close = 'Close',
    hint = 'Press ESC to close'
}
client/main.lua
local isOpen = false

local function openRules()
    if isOpen then return end
    isOpen = true
    SetNuiFocus(true, true)
    SendNUIMessage({
        action = 'open',
        title = Locale.title,
        close = Locale.close,
        hint = Locale.hint,
        rules = Config.Rules,
        layout = Config.Layout.panel,
        theme = Config.Theme.name
    })
end

local function closeRules()
    isOpen = false
    SetNuiFocus(false, false)
    SendNUIMessage({ action = 'close' })
end

RegisterCommand(Config.Command, function()
    openRules()
end, false)

RegisterNUICallback('close', function(_, cb)
    closeRules()
    cb('ok')
end)

AddEventHandler('onResourceStop', function(resource)
    if resource ~= GetCurrentResourceName() then return end
    SetNuiFocus(false, false)
end)
html/index.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div id="panel" class="hidden">
        <h1 id="title"></h1>
        <ol id="rules"></ol>
        <p id="hint"></p>
        <button id="closeBtn"></button>
    </div>
    <script src="script.js"></script>
</body>
</html>

Qué se ha comprobado

Este es un resultado de RPScripts AI registrado el 2026-10-13. El registro de validación guardado no contiene problemas señalados por las comprobaciones estáticas e incluye una comprobación con LuaLS. La vista previa muestra la NUI en un navegador. Estas comprobaciones no demuestran su comportamiento dentro del juego ni en multijugador; pruébalo en tu propia configuración antes de usarlo en un servidor público.

SHA-256 del mapa registrado de archivos fuente

62219c0eb6cef9f6ce6fb2b88c8c7fbfe1c7c6f526230266b8e575306ded40c3

Si el panel no se abre o no se cierra

Comprueba primero la estructura de carpetas y el nombre del recurso en server.cfg. Confirma que el recurso se ha iniciado, revisa Config.Command por si hay un conflicto y busca errores de Lua o NUI en F8. Si el panel sigue capturando la entrada, detén el recurso de prueba y revisa client/main.lua antes de continuar.

¿Quieres cambiar el comportamiento?

Abre esta misma plantilla en RPScripts AI para trabajar sobre una copia. Abrir el ejemplo es gratis y requiere una cuenta; los cambios realizados por la IA se rigen por tu plan actual y tus límites de créditos.

Ver los demás ejemplos de plantillas de IA

Sigue construyendo tu servidor

Usa el probador de scripts para una revisión estática de tus cambios o explora recursos listos para usar para los demás sistemas que necesita tu servidor.