Os recursos do FiveM podem usar o CfxLua, um runtime Lua 5.4 modificado, para scripts de cliente e servidor. Um recurso atual começa com fxmanifest.lua, lista os arquivos que cada contexto carrega e mantém as decisões finais, como permissões, dinheiro e inventário no servidor.
A configuração e os exemplos de código aqui são voltados ao FiveM para GTA V Legacy. O Enhanced tem regras diferentes de runtime e de compatibilidade; verifique as alterações de Legacy para Enhanced do Cfx.re antes de aplicá-las a um servidor Enhanced.
O manifesto antigo __resource.lua e a opção lua54 'yes' estão obsoletos para novos trabalhos. A Cfx.re informa que o suporte a Lua 5.3 terminou em junho de 2025 e que os scripts atuais usam Lua 5.4.
Crie um recurso mínimo
Dentro do diretório resources dos dados do servidor, crie [local]/hello_fivem. Os colchetes agrupam recursos; o recurso em si é o diretório hello_fivem.
fxmanifest.lua:
fx_version 'cerulean'
game 'gta5'
author 'Your name'
description 'Small CfxLua learning resource'
version '1.0.0'
client_script 'client.lua'
server_script 'server.lua'
client.lua:
RegisterCommand('mycoords', function()
local coords = GetEntityCoords(PlayerPedId())
print(('x=%.2f y=%.2f z=%.2f'):format(coords.x, coords.y, coords.z))
end, false)
server.lua:
AddEventHandler('onResourceStart', function(resourceName)
if resourceName ~= GetCurrentResourceName() then
return
end
print(('[%s] started'):format(resourceName))
end)
O manifesto e o comportamento do ambiente de execução estão documentados na referência oficial de manifestos de recursos e no guia do CfxLua.
Entenda os contextos do cliente e do servidor
Um script de cliente é executado separadamente para cada jogador conectado e pode chamar nativos voltados para o jogo, como PlayerPedId e GetEntityCoords. Um script de servidor coordena o estado compartilhado, a persistência e a autorização. Valores fornecidos por um cliente são entradas, não prova.
Use AddEventHandler para eventos que devem permanecer em um único contexto. Use RegisterNetEvent somente quando um evento precisar atravessar o limite entre cliente e servidor. O guia oficial Secure Your Events explica por que cada ação de rede deve validar as permissões e o estado atuais do jogador no servidor.
Evite bloquear o agendador
Scripts CfxLua são agendados cooperativamente. Um loop que nunca cede pode congelar seu contexto de script. Quando um loop precisa esperar, use Wait com um atraso apropriado para a tarefa, e não consulte um banco de dados ou endpoint HTTP a cada frame. Prefira eventos e mudanças de estado em vez de polling permanente.
Use exports para um limite claro de recursos
Um export expõe uma função nomeada para outro recurso. Defina-a explicitamente e documente seus argumentos e valor de retorno:
exports('formatPlayerLabel', function(serverId, playerName)
return ('[%d] %s'):format(serverId, playerName)
end)
Outro recurso Lua pode chamá-lo como exports.hello_fivem:formatPlayerLabel(id, name). Não use um export para contornar verificações de permissão ou propriedade.
Execute e teste o recurso
- Faça backup do recurso que você está substituindo, se houver.
- No console do servidor, execute
refreshe entãoensure hello_fivem. - Verifique o console do servidor para a mensagem de início.
- Conecte-se ao servidor de desenvolvimento, abra o F8 e execute
mycoords. - Adicione ensure hello_fivem ao server.cfg após quaisquer dependências e, em seguida, reinicie o servidor para confirmar a inicialização normal.
Os comandos de recursos compatíveis estão listados na referência oficial de comandos de servidor. Continue com o tutorial oficial do primeiro script Lua antes de adicionar dependências de framework ou banco de dados.