mri-QboxResourcesMRI Qmarkerplacer

mri_Qmarkerplacer — Manual

Ferramenta de administração para criar, editar e posicionar markers 3D no mundo em runtime, com texto opcional, persistência em JSON e sincronização com todos os jogadores.


Sumário

  1. Dependências
  2. Instalação
  3. Permissões (ACE)
  4. Comandos
  5. Menu de markers
  6. Modo de seleção com o mouse
  7. Formato dos dados (data.json)
  8. Entrypoints para outros recursos
  9. Localização
  10. Estrutura de arquivos

Dependências

RecursoObrigatórioObservação
qb-coreSimDeclarado em dependencies; exports['qb-core']:GetCoreObject() e o evento QBCore:Client:OnPlayerLoaded
ox_libSimDeclarado em dependencies; menus de contexto, input dialogs, callbacks, comando, locale, raycast e Text UI

Instalação

  1. Copie a pasta mri_Qmarkerplacer para resources/.
  2. Adicione ao server.cfg:
    ensure mri_Qmarkerplacer
  3. Dê a um grupo ou jogador o principal group.admin — veja Permissões (ACE).

Os markers são gravados em data.json, na raiz do recurso, via SaveResourceFile. O arquivo já existe vazio ([]) e não precisa de banco de dados.


Permissões (ACE)

O comando é registrado com lib.addCommand(..., { restricted = 'group.admin' }). O ox_lib cria a ACE command.markermenu e a libera para group.admin automaticamente — você só precisa colocar o administrador nesse grupo:

add_principal identifier.license:<licença_do_admin> group.admin

Comandos

ComandoPermissãoDescrição
/markermenugroup.adminAbre o menu de gerenciamento de markers

O menu principal (/markermenu) lista todos os markers existentes e traz três ações no topo:

OpçãoO que faz
Selecionar tipo de markerEntra no modo de seleção com o mouse
Criar novo markerAbre o formulário direto na posição atual do personagem
Ativar/desativar debugDesenha o ID de cada marker visível como texto 3D

Ao abrir um marker da lista, o submenu oferece:

OpçãoO que faz
TeletransportarMove o personagem para as coordenadas do marker
Editar markerReabre o formulário com os valores atuais
Renomear markerDefine o nome exibido na lista do menu
Texto do markerConfigura o texto 3D acima do marker: conteúdo, cor RGBA, tamanho, fonte, fundo e altura própria
Redefinir localizaçãoMove o marker para a posição atual do personagem
Apagar markerRemove o marker da lista

Toda alteração é sincronizada com todos os clientes na hora e salva em data.json. Não é preciso reiniciar o recurso.


Modo de seleção com o mouse

Um raycast a partir da câmera mostra uma prévia do marker onde você está mirando. Os controles são:

TeclaAção
ScrollMuda o tipo do marker (0 a 43)
Shift + ScrollAumenta/diminui a escala (mínimo 0.1)
QAbaixa o marker (−0.01 por frame)
ELevanta o marker (+0.01 por frame)
EnterConfirma e abre o formulário de criação
EscCancela e volta ao menu

Formato dos dados (data.json)

Cada marker é um objeto do array. Os campos abaixo são os gravados pelo formulário:

CampoTipoObrigatórioDescrição
markernumberSimTipo do marker (0 a 43), usado em DrawMarker
vectorobjeto {x,y,z}SimPosição do marker
scalenumberSimEscala aplicada nos três eixos
r, g, bnumberSimCor do marker (0-255)
alphanumberSimOpacidade. Fixada em 255 na criação
bobUpAndDownboolSimFaz o marker flutuar para cima e para baixo
faceCameraboolSimMantém o marker virado para a câmera
rotateboolSimGira o marker no próprio eixo
rangenumberSimDistância máxima (em metros) em que o marker é desenhado
showboolSimSe false, o marker não é desenhado para ninguém
namestringNãoNome exibido na lista do menu. Definido em “Renomear marker”
textstringNãoTexto 3D desenhado 1 metro acima do marker
textcolorobjeto {r,g,b,a}NãoCor do texto
textsizenumberNãoEscala do texto (0.01 a 0.99)
textfontnumberNãoFonte: 0 London 1960, 1 House Script, 2 House Script 2, 3 Slab Serif, 4 Cologne 1960, 7 Pricedown
togglerectboolNãoDesenha um retângulo escuro atrás do texto
textvectorznumberNãoAltura própria do texto, independente do Z do marker

Entrypoints para outros recursos

Callbacks de servidor

Registrados via lib.callback.register:

-- adiciona um marker e sincroniza com todos os clientes
lib.callback.await('markerplacer:addMarker', false, markerData)
 
-- substitui a lista inteira de markers e sincroniza
lib.callback.await('markerplacer:syncMarkers', false, markers)
 
-- pede a lista atual; o servidor responde com markerplacer:receiveMarkers
lib.callback.await('markerplacer:requestMarkers', false)

Os três são irrestritos: qualquer cliente pode chamá-los. Só o comando /markermenu é protegido por ACE.

Evento markerplacer:receiveMarkers (cliente)

Entrega a lista completa de markers ao cliente.

TriggerClientEvent('markerplacer:receiveMarkers', source, markers)

Evento markerplacer:showMainMenu (cliente)

Abre o menu de markers no cliente. É o que o /markermenu dispara.

TriggerClientEvent('markerplacer:showMainMenu', source)

Localização

As strings do menu e dos formulários passam pelo locale do ox_lib. Os arquivos ficam em locales/:

  • en.json — inglês
  • pt-br.json — português do Brasil

O idioma ativo vem da convar do ox_lib:

setr ox:locale "pt-br"

Para adicionar um idioma, crie locales/<codigo>.json com as mesmas chaves e reinicie o recurso.


Estrutura de arquivos

mri_Qmarkerplacer/
├── client.lua        — menus de contexto, formulários, modo de seleção por raycast, desenho dos markers e do texto 3D
├── server.lua        — carrega/salva data.json, callbacks de CRUD, sync com todos os clientes, comando /markermenu
├── data.json         — lista de markers (fonte da verdade, escrita em runtime)
├── locales/
│   ├── en.json
│   └── pt-br.json
└── fxmanifest.lua