resources/vrp/ e descreve como os recursos conversam entre si e como inicializar (bootstrap) um recurso novo para consumir a API.
1. Visão geral
O coração do servidor é o resourcevrp. Ele define dois objetos de interface (tabelas Lua) publicados via os primitivos de RPC:
vRP — servidor
Tabela do servidor com a lógica de negócio: dinheiro, inventário, identidade, grupos…
tvRP — cliente
Tabela do cliente: manipulação do ped, anim, veículos próximos…
resources/vrp/modules/vrp.lua (servidor):
resources/vrp/client/base.lua (cliente):
2. Proxy vs Tunnel
Os dois primitivos ficam emresources/vrp/lib/Proxy.lua e resources/vrp/lib/Tunnel.lua.
Proxy — mesma realm (server↔server ou client↔client)
Proxy — mesma realm (server↔server ou client↔client)
Comunicação dentro da mesma realm. Baseado em
TriggerEvent local.Proxy.addInterface(name, table): publica uma interface.Proxy.getInterface(name): retorna um proxy que chama os métodos da interface.
Tunnel — entre realms (server↔client)
Tunnel — entre realms (server↔client)
Comunicação entre servidor e cliente via eventos de rede.
Tunnel.bindInterface(name, table): expõe as funções da tabela para a outra realm.Tunnel.getInterface(name): retorna um proxy chamável para a outra realm.
Detalhe importante: quando o servidor chama uma função de cliente via Tunnel, o primeiro argumento é sempre o
source (player de destino):O prefixo _ (fire-and-forget)
O prefixo _ (fire-and-forget)
Prefixar o método com Use
_ faz a chamada não esperar retorno (mais rápido):_ sempre que não precisar do valor de retorno.3. Convenção vRP / tvRP / vRPC / vRPS
Em muitos recursos da base o proxy server→client é nomeado
vRPclient: é o mesmo Tunnel.getInterface("vRP"), só muda o nome da variável.4. Bootstrap padrão de um recurso
1
Obtenha a interface do servidor
Lado servidor (ex. real de
five-bank/config/functions.lua):2
Exponha funções para a NUI/cliente (se necessário)
3
Declare a dependência no fxmanifest.lua
A função
module() (de lib/utils.lua) recebe (Resource, Patch). De dentro do vrp, use module("lib/Proxy"). De outro resource, use module("vrp","lib/Proxy").Acesso ao banco de dados
Passa por oxmysql via prepared statements nomeados:vRP.Prepare(Nome, SQL) e depois vRP.Query, vRP.SingleQuery, vRP.Scalar ou vRP.Update. Recursos próprios costumam usar exports.oxmysql:query_async(...) diretamente.
5. Módulos em resources/vrp/modules/
A pasta
modules/ tem três arquivos que não são carregados pelo fxmanifest.lua: jester.lua e lb-phone.lua (implementações alternativas de integração com celular, ativadas conforme o celular usado) e playing.lua (vRP.UpdatePlaying, vRP.TimePlaying, vRP.WipePlaying). Enquanto não forem adicionados ao manifesto, essas funções não existem em runtime.
