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