Exemplo Prático de Resource
🎯 Meta.xml Completo
<meta>
<info name="Sistema VIP" author="SeuNome" version="1.0.0" description="Sistema completo de VIP"/>
<!-- Configurações obrigatórias -->
<oop>true</oop>
<min_mta_version server="1.5.6-9.18728" client="1.5.6-9.18728"/>
<!-- APENAS o arquivo server principal tem lockcode="true" -->
<script src="server.lua" type="server" lockcode="true" />
<!-- Outros arquivos server SEM lockcode -->
<script src="server/database.lua" type="server" />
<script src="server/commands.lua" type="server" />
<script src="server/events.lua" type="server" />
<!-- Arquivos client normais -->
<script src="client/ui.lua" type="client" />
<script src="client/events.lua" type="client" />
<!-- Arquivos shared normais -->
<script src="shared/utils.lua" type="shared" />
<!-- Arquivo de configuração (NÃO compilado) -->
<script src="config.lua" type="shared" cache="false"/>
<!-- Arquivos de interface -->
<file src="client/ui.html"/>
<file src="client/style.css"/>
<file src="client/script.js"/>
<!-- Exportações (se necessário) -->
<export function="getPlayerVIP" type="shared"/>
</meta>
🔧 Arquivo de Configuração
-- config.lua (cache="false")
License = {
["User"] = "",
["Key"] = ""
};
-- Configurações do sistema
Config = {
database = {
host = "localhost",
user = "root",
password = "",
database = "mta_server"
},
vip = {
prices = {
bronze = 1000,
silver = 2500,
gold = 5000
},
benefits = {
bronze = {"spawn_veh", "money_bonus"},
silver = {"spawn_veh", "money_bonus", "teleport"},
gold = {"spawn_veh", "money_bonus", "teleport", "weapons"}
}
},
messages = {
success = "VIP ativado com sucesso!",
error = "Erro ao processar VIP",
insufficient_money = "Dinheiro insuficiente"
}
};
🖥️ Código Server Principal (Compilado)
-- server.lua (ÚNICO arquivo com lockcode="true")
local VIPSystem = {}
VIPSystem.__index = VIPSystem
function VIPSystem:new()
local instance = setmetatable({}, VIPSystem)
instance.database = nil
instance.players = {}
return instance
end
function VIPSystem:initialize()
-- Conectar ao banco de dados
self.database = dbConnect("mysql",
"dbname=" .. Config.database.database ..
";host=" .. Config.database.host,
Config.database.user,
Config.database.password
)
if not self.database then
outputDebugString("Erro ao conectar com o banco de dados", 1)
return false
end
-- Criar tabelas
self:createTables()
-- Registrar eventos
addEventHandler("onPlayerJoin", root, function()
self:onPlayerJoin(source)
end)
addEventHandler("onPlayerQuit", root, function()
self:onPlayerQuit(source)
end)
outputDebugString("Sistema VIP inicializado com sucesso!")
return true
end
function VIPSystem:createTables()
local query = "CREATE TABLE IF NOT EXISTS vip_players (" ..
"id INTEGER PRIMARY KEY AUTO_INCREMENT, " ..
"serial VARCHAR(64) NOT NULL UNIQUE, " ..
"vip_type VARCHAR(20) NOT NULL, " ..
"expire_date TIMESTAMP NOT NULL, " ..
"created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP" ..
")"
dbExec(self.database, query)
end
function VIPSystem:onPlayerJoin(player)
if not player or not isElement(player) then
return
end
local serial = getPlayerSerial(player)
if not serial then
return
end
-- Verificar VIP do jogador
local query = "SELECT * FROM vip_players WHERE serial = ? AND expire_date > NOW()"
local result = dbQuery(self.database, query, serial)
if result then
local data = dbPoll(result, -1)
if data and #data > 0 then
local vipData = data[1]
self.players[player] = {
type = vipData.vip_type,
expire = vipData.expire_date
}
outputChatBox("Bem-vindo VIP " .. vipData.vip_type .. "!", player, 0, 255, 0)
self:applyVIPBenefits(player, vipData.vip_type)
end
end
end
function VIPSystem:applyVIPBenefits(player, vipType)
if not Config.vip.benefits[vipType] then
return
end
local benefits = Config.vip.benefits[vipType]
for _, benefit in ipairs(benefits) do
if benefit == "spawn_veh" then
setElementData(player, "vip.spawn_vehicle", true)
elseif benefit == "money_bonus" then
setElementData(player, "vip.money_bonus", 1.5)
elseif benefit == "teleport" then
setElementData(player, "vip.teleport", true)
elseif benefit == "weapons" then
setElementData(player, "vip.weapons", true)
end
end
end
-- Inicializar sistema
local vipSystem = VIPSystem:new()
addEventHandler("onResourceStart", resourceRoot, function()
vipSystem:initialize()
end)
🚀 Passo a Passo
1. Preparação do Código
-- ✅ Verificar se todos os arquivos seguem as regras
-- - Apenas aspas duplas
-- - Código bem formatado
-- - Sem crases
-- - Indentação consistente
2. Configuração do meta.xml
<!-- Checklist obrigatório -->
<oop>true</oop> ✅
<min_mta_version server="1.5.6-9.18728" client="1.5.6-9.18728"/> ✅ (ou superior)
<script src="server.lua" type="server" lockcode="true" /> ✅ (APENAS o principal)
<script src="config.lua" type="shared" cache="false"/> ✅
3. Estrutura de Licença
-- config.lua
License = {
["User"] = "",
["Key"] = ""
};
4. Upload para Compilação
Compactar resource em .zip
Fazer upload no painel LockCode
Aguardar processamento
Download da versão compilada
5. Teste da Resource Compilada
-- Verificar se tudo funciona:
-- ✅ Resource inicia sem erros
-- ✅ Todas as funcionalidades mantidas
-- ✅ Sistema de licenciamento ativo
-- ✅ Performance otimizada
⚠️ Troubleshooting
Erros Comuns
Erro
Causa
Solução
Compilation failed: Invalid quotes
Aspas simples no código
Substituir ' por "
OOP not enabled
meta.xml sem OOP
Adicionar <oop>true</oop>
Version not supported
MTA version muito antiga
Usar 1.5.6-9.18728 ou superior
License not found
config.lua incorreto
Verificar License table
Multiple lockcode files
lockcode em vários arquivos
Usar apenas no server principal
Atualizado