Como Instalar e Gerenciar Resources no MTA:SA — Guia Completo
Aprenda a instalar, configurar e gerenciar resources no MTA:SA: meta.xml, dependências, ACL, comandos start/stop/refresh e organização de gamemodes.
Resources são a unidade fundamental de qualquer servidor Multi Theft Auto: San Andreas. Tudo que roda no servidor — gamemodes, mapas, sistemas de admin, scripts customizados, recursos visuais — é empacotado como resource. Entender como instalar, organizar e gerenciar esses pacotes é o que separa um servidor que funciona de um que quebra a cada deploy.
Este tutorial é para quem está montando ou customizando um servidor MTA:SA e precisa adicionar resources de terceiros (community.multitheftauto.com), criar os próprios ou reorganizar uma pasta resources/ que virou bagunça. Vamos cobrir estrutura de pastas, sintaxe do meta.xml, gerenciamento de dependências, ACL e os comandos operacionais que você vai usar todo dia. Tempo estimado de execução: 25 a 40 minutos, dependendo de quantos resources você precisa configurar.
Pré-suposto: você já tem um servidor MTA:SA instalado e funcional, com acesso ao console (terminal ou painel) e aos arquivos do servidor via SSH, SFTP ou painel de gerenciamento.
Pré-requisitos
Servidor MTA:SA versão 1.5.9 ou superior já instalado. Acesso ao console do servidor (terminal SSH ou painel). Acesso de leitura/escrita à pasta mods/deathmatch/resources/. Editor de texto que respeite encoding UTF-8 (VSCode, Notepad++, nano). Conhecimento básico de XML.
mods/deathmatch/resources/ mods/deathmatch/mtaserver.conf mods/deathmatch/acl.xml 22003 Estrutura de um resource
Um resource MTA:SA é simplesmente uma pasta dentro de mods/deathmatch/resources/ contendo, no mínimo, um arquivo meta.xml. O nome da pasta vira o identificador do resource — é o nome que você usa em start, stop, refresh e em qualquer referência via getResourceFromName().
A estrutura mínima fica assim:
mods/deathmatch/resources/
├── meu-resource/
│ ├── meta.xml
│ ├── server.lua
│ ├── client.lua
│ └── files/
│ └── imagem.png
O meta.xml declara três coisas: metadados (autor, versão, descrição), arquivos que compõem o resource (scripts, mapas, arquivos cliente) e dependências (outros resources que precisam estar rodando antes).
Crie a pasta do seu resource dentro de mods/deathmatch/resources/:
cd /caminho/para/servidor/mods/deathmatch/resources
mkdir meu-resource
cd meu-resourceO nome da pasta é case-sensitive no Linux. Convenção: use kebab-case ou snake_case, sem espaços e sem caracteres especiais.
Crie o meta.xml com a declaração mínima:
<meta>
<info author="SeuNome" version="1.0.0" type="script"
description="Descrição curta do resource" />
<script src="server.lua" type="server" />
<script src="client.lua" type="client" />
</meta>O atributo type no elemento <info> aceita: script (padrão), gamemode, map, misc. Use gamemode apenas para resources que controlam a lógica principal de jogo — ele aparece na lista do gamemode command e bloqueia outros gamemodes simultâneos.
Declare arquivos client-side que precisam ser baixados pelo jogador com <file>:
<file src="files/imagem.png" />
<file src="sons/efeito.wav" />Esses arquivos são transferidos para o cliente quando ele entra no servidor. Scripts client-side (type="client") também são transferidos automaticamente, mas qualquer asset (imagem, som, modelo) precisa de <file> explícito ou não chega no jogador.
Gerenciando dependências entre resources
Resources raramente vivem isolados. Um sistema de admin pode depender de uma lib de UI; um gamemode pode depender de um sistema de scoreboard. Declarar dependências corretamente evita o cenário clássico: resource A inicia, chama uma função exportada do resource B, e B ainda não terminou de carregar.
Declare a dependência no meta.xml do resource consumidor:
<meta>
<info author="SeuNome" version="1.0.0" type="script" />
<script src="server.lua" type="server" />
<include resource="scoreboard" />
<include resource="mysql-lib" />
</meta>O elemento <include> garante que scoreboard e mysql-lib estarão iniciados antes do resource atual subir. Se a dependência falhar ao iniciar, o resource dependente também falha — comportamento desejado, evita estados parciais.
Para chamar funções exportadas de outro resource, use a sintaxe exports:
-- server.lua do resource consumidor
local sucesso = exports["scoreboard"]:addScoreboardColumn("Kills")
if not sucesso then
outputDebugString("Falha ao adicionar coluna no scoreboard", 1)
endA função precisa estar declarada como exportada no meta.xml do resource provedor com <export function="addScoreboardColumn" type="server" />. Sem esse export, a chamada retorna nil silenciosamente.
Resources listados em mtaserver.conf com startup="1" sobem na ordem do arquivo. Coloque libs e dependências no topo, gamemodes e features de alto nível no fim. Inverter a ordem causa erros de “function not found” que somem após um refreshall, mascarando o bug real.
Comandos operacionais do dia a dia
Todo o controle de resources roda pelo console do servidor (terminal onde o mta-server64 está rodando, ou aba console do painel de gerenciamento de servidores de jogos). Esses comandos não exigem reinício do servidor — mudanças são aplicadas a quente.
| Comando | O que faz |
|---|---|
start <nome> | Inicia um resource específico |
stop <nome> | Para um resource específico |
restart <nome> | Para e inicia novamente (recarrega meta.xml) |
refresh | Detecta resources novos/removidos sem reiniciar |
refreshall | Refresh + recarrega scripts de todos os resources rodando |
gamemode <nome> | Define o resource como gamemode ativo |
info <nome> | Mostra metadados e estado do resource |
resources | Lista todos os resources detectados |
Após adicionar um resource novo na pasta resources/, force o servidor a detectá-lo:
refreshSaída esperada: Refresh completed. Found X new resources, Y removed. Se o seu resource não aparecer na contagem, verifique se o meta.xml é válido (XML mal-formado faz o resource ser ignorado silenciosamente).
Inicie o resource:
start meu-resourceResultado esperado: meu-resource: Resource started. Se aparecer mensagem de dependência faltando, inicie primeiro o resource dependente.
Para que o resource carregue automaticamente em todo boot do servidor, edite mods/deathmatch/mtaserver.conf e adicione:
<resource src="meu-resource" startup="1" protected="0" />O atributo protected="1" impede que clientes baixem o source-code do resource (útil pra resources com lógica anti-cheat). Use protected="0" apenas em resources puramente client-side ou de community.
ACL — Access Control List
Resources que tentam usar funções administrativas (kickPlayer, banPlayer, setElementData em outros jogadores, acesso ao banco de dados interno) precisam de permissão explícita na ACL. Sem isso, a função retorna false e gera um aviso no console.
Quando um resource pede permissão, o console mostra:
ACL: aclrequest list <nome-resource>
ACL: aclrequest allow <nome-resource> allListe as permissões pedidas:
aclrequest list admin-systemSaída exemplo: Pending ACL requests for admin-system: function.kickPlayer, function.banPlayer, general.ModifyOtherObjects.
Aprove as permissões depois de revisar o que o resource está pedindo:
aclrequest allow admin-system allAprove all apenas em resources de fonte confiável (autores conhecidos da community, ou seus próprios). Resources de origem desconhecida pedindo general.ModifyOtherObjects em massa devem ser auditados linha por linha antes de aprovação.
Aprovar todas as permissões dá ao resource acesso a kickar/banir jogadores, modificar dados de outros resources e, em alguns casos, executar comandos no shell do servidor. Leia o código antes de aprovar — especialmente arquivos server.lua e qualquer chamada a executeCommandHandler ou runcode.
Verificação
Confirme que tudo está funcionando:
info meu-resource
Saída esperada inclui State: Running, lista de scripts ativos e contagem de exports. Se o estado for Loaded mas não Running, o resource carregou mas falhou ao iniciar — verifique o console pra erros de Lua.
Para validar scripts client-side, entre no servidor com o cliente MTA:SA, abra o console no jogo (F8) e rode:
debugscript 3
Nível 3 mostra erros, warnings e mensagens de debug do client-side. Erros em arquivos client costumam aparecer só aqui, não no console do servidor.
Resolução de problemas
Resource não aparece no refresh
Causa mais comum: meta.xml mal-formado. XML não tolera tags sem fechamento ou atributos sem aspas. Valide com qualquer parser online ou abra no VSCode com extensão XML. Causa secundária: pasta com nome contendo espaço ou caracter especial (acento, cedilha) — renomeie pra ASCII puro.
Erro “Couldn’t find file ‘arquivo.lua’ for resource”
O meta.xml referencia um arquivo que não existe ou tem typo no nome. Lembre que Linux é case-sensitive: Server.lua e server.lua são arquivos diferentes. Liste o conteúdo da pasta com ls -la e compare exato com o src= do meta.xml.
Resource inicia mas funções não funcionam
Geralmente é problema de ACL (função admin sem permissão) ou de dependência (resource provedor não rodando). Rode info <nome> no consumidor pra ver pendências ACL, e resources pra confirmar que o provedor está Running.
”Unable to start resource X (dependencies not met)”
A dependência declarada em <include> não existe na pasta resources/ ou falhou ao iniciar. Baixe e instale o resource dependente primeiro, ou remova o <include> se a dependência não for realmente necessária.
Próximos passos
Com resources operacionais, vale aprofundar em três frentes: backup automatizado da pasta resources/ antes de cada deploy, versionamento via Git (commit a pasta inteira excluindo logs e cache), e monitoramento de exceções via outputDebugString centralizado em um resource de logging.
Se você está colocando um servidor MTA:SA em produção com muitos jogadores simultâneos, uma VPS Hostini já vem com latência otimizada pra Brasil e proteção DDoS na borda — diferença sensível em servidores com 50+ slots onde o lag do dono trava tudo. Para deploys frequentes, considere automatizar via webhook que faz git pull na pasta resources/ e dispara refreshall no console do servidor.
Perguntas frequentes
Qual a diferença entre gamemode e resource no MTA:SA?
Todo gamemode é um resource, mas nem todo resource é um gamemode. Um resource é qualquer pacote (scripts, mapas, mods, libs). Gamemode é um resource especial declarado com <info type="gamemode"> no meta.xml e iniciado via comando gamemode em vez de start direto.
Por que meu resource inicia mas os scripts client-side não rodam?
Provavelmente o script não está exportado corretamente no meta.xml. Adicione type="client" no elemento <script> e confirme que o arquivo está dentro da pasta do resource. Verifique também o /debugscript 3 no cliente pra ver erros de runtime que não aparecem no console do servidor.
Como faço pra um resource carregar automaticamente quando o servidor sobe?
Adicione o nome do resource em <resource src="nome" startup="1" /> dentro de mods/deathmatch/mtaserver.conf. Resources com startup="1" sobem na ordem do arquivo, então respeite dependências (a lib primeiro, o gamemode depois).
Posso editar um resource enquanto o servidor está rodando?
Pode. Edite os arquivos e rode refresh ou refreshall no console — o MTA detecta mudanças sem precisar reiniciar o servidor. Para mudanças no meta.xml, restart no nome do resource garante recarregamento limpo das declarações.
O que é a ACL e por que meu resource pede permissão?
ACL é Access Control List — controla quais funções administrativas (kick, ban, setElementData em players, etc) cada resource pode chamar. Edite mods/deathmatch/acl.xml ou use aclrequest allow no console pra liberar requests pendentes.
Como organizar resources em categorias?
Crie subpastas dentro de mods/deathmatch/resources/ com prefixo [bracket], tipo [gamemodes], [admin], [maps]. O MTA varre recursivamente e trata o conteúdo igual — facilita manutenção sem afetar funcionamento.