Pular para o conteúdo

10% de desconto, aplicado no checkout

RPScriptsRPScripts
Ferramentas FiveM gratuitas

Modelo inicial grátis · arquivos de código-fonte incluídos

Script grátis de regras para servidor FiveM

Ofereça aos jogadores um comando /rules que abre as regras do seu servidor em um pequeno painel NUI. Baixe o modelo existente do RPScripts, edite as regras e teste no seu servidor.

  • 7 arquivos de código-fonte
  • Sem dependência de framework ou banco de dados
Baixar ZIP grátis

Este download não exige conta, pagamento ou créditos de IA.

O que o script faz

O comando /rules abre um painel com regras editáveis. Os jogadores o fecham com Escape ou com o botão “Close”. O código do cliente libera o foco da NUI quando o painel é fechado e quando o recurso é interrompido.

Este é um pequeno modelo inicial que serve apenas para exibir as regras. Ele não registra a aceitação das regras, não fiscaliza seu cumprimento, não gerencia permissões nem substitui ferramentas de moderação.

NUI do painel de regras renderizada em um navegador com mensagens de jogo simuladas
Prévia registrada no navegador com mensagens de jogo simuladas. Não é uma captura de tela dentro do jogo.

Instale em um servidor de teste

  1. Extraia o ZIP em resources/[local]/ para que o manifesto fique em resources/[local]/rules_board/fxmanifest.lua. Evite colocar outra pasta rules_board dentro dela.
  2. Edite Config.Rules em config.lua e os textos do painel em locales/en.lua. Se outro recurso já usa /rules, altere Config.Command antes de iniciar este recurso.
  3. Adicione a linha abaixo a server.cfg e reinicie seu servidor de teste. Mantenha o nome rules_board na pasta do recurso para que corresponda ao comando.
    ensure rules_board
  4. Conecte-se com o FiveM e execute /rules. Confira cada regra, feche pelo botão, abra novamente e feche com Escape. Confirme que o movimento e o controle do mouse voltaram a funcionar e verifique se há erros nos consoles F8 e do servidor. Teste também a interrupção e a reinicialização do recurso.
Ler a referência de manifestos de recursos do FiveM

Deixe do seu jeito

Config.Command
O nome do comando sem a barra. O padrão é rules.
Config.Rules
A lista de textos das regras exibidas no painel. Substitua as três regras de exemplo pelas suas.
Config.Layout.panel
Ponto de ancoragem do painel e deslocamentos x/y em porcentagem. Por padrão, ele fica no canto superior direito.
Config.Theme.name
Escolha blue, red, green, orange ou purple, ou informe uma cor CSS.
locales/en.lua
O título do painel, o texto do botão “Close” e a dica da tecla Escape. Traduza esses textos para seus jogadores.

Inspecione o código-fonte antes de instalar

Estes são exatamente os sete arquivos do ZIP. O código Lua, HTML, CSS e JavaScript pode ser lido e editado. Abrir um arquivo aqui não o executa.

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>

O que foi verificado

Este é um resultado do RPScripts AI registrado em 2026-10-13. O registro de validação salvo não contém problemas apontados pelas verificações estáticas e registra uma verificação com LuaLS. A prévia mostra a NUI em um navegador. Essas verificações não comprovam o comportamento dentro do jogo ou no modo multijogador; teste na sua própria configuração antes de disponibilizar para o público.

SHA-256 do mapa de arquivos de código-fonte registrado

62219c0eb6cef9f6ce6fb2b88c8c7fbfe1c7c6f526230266b8e575306ded40c3

Se o painel não abrir ou fechar

Primeiro, confira a estrutura das pastas e o nome do recurso em server.cfg. Confirme que o recurso foi iniciado, verifique se há conflito em Config.Command e procure erros de Lua ou NUI no F8. Se a entrada continuar presa ao painel, interrompa o recurso de teste e revise client/main.lua antes de continuar.

Quer mudar o comportamento?

Abra este mesmo modelo no RPScripts AI para trabalhar em uma cópia. Abrir o exemplo é grátis e exige uma conta; as alterações feitas pela IA seguem seu plano atual e seus limites de créditos.

Ver os outros exemplos iniciais de IA

Continue montando seu servidor

Use o testador de scripts para uma análise estática das suas alterações ou confira recursos prontos para os outros sistemas de que seu servidor precisa.