DRS Advanced Admin
Menu de staff completo para fazer tudo sem sair do jogo. Inclui:
- painel com o estado do servidor, 36 ações rápidas e ⭐ favoritos;
- jogadores com ficha, teleportes, espetar, reanimar, economia, inventário, emprego, roupa e veículos;
- bans anti-alt, avisos com castigo automático, prisão, silenciar e capturas de ecrã;
- cargos com níveis e permissões editadas no próprio menu;
- mapa ao vivo com heatmap, analytics, lista de itens e de veículos e ferramentas de programador;
- logs de todas as ações no menu e no Discord;
- 7 temas e um menu que cada staff personaliza.
Funciona com Qbox, QBCore, ESX ou sem framework.
#Requisitos
| Recurso | Obrigatório |
|---|---|
oxmysql | Sim |
| Qbox, QBCore ou ESX | Não (deteção automática; sem framework funciona na mesma) |
screenshot-basic | Não — só para as capturas de ecrã |
pma-voice | Não — só para silenciar |
#Instalação
- Coloca
drs_adminemresources. - Adiciona ao
server.cfg, depois da framework e dooxmysql:
ensure oxmysql
ensure qb-core
ensure drs_admin- As tabelas criam-se sozinhas no primeiro arranque (também tens
sql/drs_admin.sql). - Dá-te o cargo de Fundador (escolhe uma forma):
- na consola do servidor:
drsadmin_setrank <id> owner(oudrsadmin_setrank license:... owner); - em
config.lua: põe a tua licença emConfig.Owners; - no
server.cfg, pelos grupos da framework:
- na consola do servidor:
add_ace qbcore.god drs_admin.rank.owner allow
add_ace qbcore.admin drs_admin.rank.admin allow
add_ace qbcore.mod drs_admin.rank.mod allow- Entra no jogo e carrega F9 (ou
/admin). Os outros staffs adicionas no próprio menu, em Staff > Adicionar staff.
#Comandos e teclas
| Comando / tecla | O que faz |
|---|---|
F9 · /admin · /drsadmin | Abre o menu |
HOME · /noclip | Noclip (W A S D, espaço/CTRL sobe e desce, SHIFT rápido, ALT devagar, roda do rato muda a velocidade) |
/report | Qualquer jogador fala com a staff (se os reports estiverem ligados) |
/sc mensagem | Chat da staff |
/anuncio texto | Anúncio para todos |
/tpm · /coords | Ir ao waypoint · copiar coordenadas |
drsadmin_setrank | (consola) dar ou tirar cargo |
Os nomes estão em Config.Commands e as teclas em Config.Keys. Cada staff muda as teclas em Definições do GTA > Atalhos > FiveM.
#Cargos e permissões
Os cargos estão em Config.Ranks: nome, etiqueta, cor, nível e permissões.
'*'dá tudo (menos o executor de Lua),'players.*'dá um grupo inteiro e'-players.money'tira uma permissão.- Ninguém mexe em quem tem um nível igual ou maior (kick, ban, trazer, etc.).
- Em Staff > Cargos mudas as permissões de cada cargo no menu, com efeito imediato na staff que está online. Só podes mexer nos cargos abaixo do teu e só dás o que tens.
Grupos de permissões: menu, players, self, vehicle, world, server, reports, bans, staff, tools e dev. A lista completa aparece no menu e em shared/permissions.lua.
Atenção
O executor de Lua (dev.lua) não vem com o '*': tem de ser dado à parte (o Fundador já tem 'dev.*') e só funciona com Config.DevTools.luaExecutor = true.
#O que tem
#Painel e ações rápidas
Jogadores online, staff de serviço, reports abertos, números do dia, staff mais ativa, últimas ações e as tuas ações favoritas. A página Ações rápidas tem 36 ações (eu, teleporte, veículo, mundo e ferramentas) com pesquisa, categorias e ⭐ favoritos.
#Jogadores
Lista com pesquisa e ficha. As ações têm pesquisa e favoritos:
- teleporte: ir ter, trazer, devolver e espetar (HUD com ←/→ para trocar de jogador);
- saúde: reanimar (usa o drs_ambulancejob se existir), curar, colete, comida e água, congelar e matar;
- moderação: mensagem, avisar, kick, ban, prisão (drs_prison ou qb-prison), silenciar e captura de ecrã;
- economia: dinheiro, itens, armas, abrir e limpar o inventário, tirar armas;
- personagem: emprego e gangue com graus, mudar ped, repor skin, menu de roupa e dar veículo para a garagem;
- diversão: estalo, atirar ao chão, pegar fogo, lançar ao ar e embebedar.
A ficha mostra a personagem, os identificadores, o histórico de avisos e bans, as notas internas e os veículos. O Registo procura quem já entrou alguma vez, mesmo offline.
#Bans e avisos
- Os bans apanham todas as contas do jogador (licença, Discord, FiveM, Steam e os tokens do PC). Quem volta com outra conta é bloqueado e a conta nova fica junta ao ban.
- Bans temporários, permanentes e offline, com motivos e durações rápidas em
Config.Bans. - Avisos com castigo automático em
Config.Warns.thresholds(ex.: 3 avisos = kick, 5 = ban de 1 dia). - Os bans terminados ficam inativos sozinhos e os avisos apagam-se ao fim de
Config.Warns.expireDaysdias.
#Reports e chat da staff
O jogador escreve, a staff recebe o aviso com som, assume o report e fala com ele. Tem botões para ir ter, trazer e espetar, e fecha com uma nota.
Dica
Já tens outro sistema de reports? Põe Config.Reports.enabled = false: some a página, o /report e os avisos. O chat da staff continua.
#Eu (toggles)
Noclip, invencível, invisível, velocidade, nomes e IDs, jogadores no mapa, munição infinita, sem cair, visão noturna e térmica, carro invencível, coordenadas no ecrã e coordenadas pela mira (E copia vector3, G copia vector4). Com o 📌 um toggle volta a ligar-se sozinho quando entras.
#Mapa ao vivo e analytics
- Mapa: mapa satélite com todos os jogadores (a pé, em veículo ou mortos) e heatmap. A roda do rato faz zoom, arrastar move e um clique num jogador abre a ficha.
- Analytics: jogadores nas últimas 24 h, jogadores novos e castigos dos últimos 14 dias e o ranking de riqueza.
#Itens, veículos e dev
- Itens: todos os itens do servidor com as imagens do teu inventário (ox, qb, qs, codem, origen, tgiann, ps e lj, detetado sozinho ou em
Config.ItemImages). Clique dá-te o item, Shift+clique dá a um jogador e Ctrl+clique copia o nome. - Veículos: todos os veículos da framework (e os de
Config.ExtraVehicles). Clique cria, Shift+clique dá para a garagem de um jogador. - Dev: inspetor de entidades, arma de apagar, coordenadas pela mira e executor de Lua no servidor ou no teu cliente.
#Mais
- Roupa: roupa de staff por cargo (
Config.StaffOutfit), editor ao vivo e até 20 roupas guardadas por staff. - Veículos: criar (com chaves e combustível), reparar, limpar, tuning máximo, cores, matrícula e apagar.
- Mundo: tempo, hora, apagão, anúncios e limpezas (carros, NPCs e objetos).
- Servidor: ligar, parar e reiniciar recursos (os essenciais estão protegidos) e kick a todos menos a staff.
- Serviço: entrar e sair de serviço, com a etiqueta do cargo por cima da cabeça (
Config.DutyTag).
#Aspeto
Em Definições cada staff escolhe: 7 temas ou uma imagem de fundo sua, quanto escurece o fundo, barra só com ícones ou com nomes, a letra, o tamanho do texto, os sons e a cor principal. O menu redimensiona-se pelo canto e guarda o tamanho.
#Logs
Todas as ações ficam na base de dados e aparecem no menu (página Logs). No Discord vão para um webhook por categoria (ServerConfig.Webhooks em server_config.lua). Com o DRS Logs ligado, a página Logs passa a ser a do /logs e as ações vão para o canal ⭐ Staff.
As fotos do Discord no menu precisam de um bot (ServerConfig.DiscordBotToken ou a convar drs_discord_bot_token).
#Para programadores
exports.drs_admin:IsStaff(source) -- true / false
exports.drs_admin:HasPermission(source, 'players.kick')
exports.drs_admin:GetRank(source) -- 'owner', 'admin', ...
exports.drs_admin:Log('economy', 'Deu dinheiro', source, target, '5000 $ no banco')#Configuração completa
Config = {}
-- Idioma / Language: 'pt' | 'en'
Config.Locale = 'pt'
-- Framework: 'auto' | 'qbx' | 'qb' | 'esx' | 'none'
Config.Framework = 'auto'
Config.UseOxNotify = false
-- ----------------------------------------------------------------------------------------------
-- Abrir o menu / Opening the menu
-- ----------------------------------------------------------------------------------------------
-- Teclas por defeito (cada staff pode mudar em Definições do GTA > Atalhos > FiveM).
-- Default keys (each staff member can change them in GTA Settings > Key Bindings > FiveM).
Config.Keys = {
menu = 'F9', -- abre o menu / opens the menu
noclip = 'HOME', -- liga/desliga o noclip / toggles noclip
report = '', -- (jogadores) abre o report; vazio = só pelo comando
}
Config.Commands = {
menu = { 'admin', 'drsadmin' },
noclip = 'noclip',
report = 'report',
staffchat = 'sc', -- /sc mensagem -> chat da staff
announce = 'anuncio', -- /anuncio texto
tpm = 'tpm', -- teleporte para o waypoint
coords = 'coords', -- copia as coordenadas
}
-- ----------------------------------------------------------------------------------------------
-- Cargos e permissões / Ranks and permissions
-- ----------------------------------------------------------------------------------------------
-- Quem é staff: (1) os cargos dados no próprio menu (Staff > Adicionar), guardados na base de dados;
-- (2) ACE: add_ace identifier.license:xxxx drs_admin.rank.admin allow (ou num grupo);
-- (3) os grupos do framework abaixo (QBCore: permissions do qb-core; ESX: grupo do jogador).
--
-- perms: '*' = tudo; 'players.*' = tudo de jogadores; '-players.money' = tira essa permissão.
-- A lista completa está em shared/permissions.lua (e no menu, em Staff > Cargos).
-- level: um staff não pode kickar/banir/etc. alguém com level igual ou maior.
Config.Ranks = {
{
name = 'owner', label = 'Fundador', color = '#f5b942', level = 100,
perms = { '*', 'dev.*' }, -- 'dev.*' = executar Lua (também precisa de Config.DevTools.luaExecutor)
},
{
name = 'admin', label = 'Administrador', color = '#ef4444', level = 80,
perms = { '*', '-staff.manage', '-server.resources' },
},
{
name = 'mod', label = 'Moderador', color = '#3b82f6', level = 50,
perms = {
'menu.*', 'players.*', 'self.*', 'vehicle.*', 'reports.*', 'bans.view', 'bans.unban', 'logs.view',
'staff.chat', 'world.announce', 'tools.*',
'-players.money', '-players.items', '-players.weapons', '-players.vehicle', '-players.identifiers',
'-players.clearinv', '-players.job',
},
},
{
name = 'helper', label = 'Ajudante', color = '#22c55e', level = 20,
perms = {
'menu.*', 'reports.*', 'staff.chat',
'players.view', 'players.goto', 'players.bring', 'players.sendback', 'players.spectate',
'players.revive', 'players.heal', 'players.freeze', 'players.message', 'players.warn', 'players.kick', 'players.notes',
'self.noclip', 'self.names', 'self.tpm', 'self.coords', 'self.outfit', 'self.revive', 'self.invisible',
'vehicle.fix', 'vehicle.delete',
},
},
}
-- Grupo do framework -> cargo (só se a pessoa não tiver cargo dado no menu)
Config.FrameworkGroups = {
god = 'owner',
superadmin = 'owner',
admin = 'admin',
mod = 'mod',
}
-- O 1.º fundador: licenças (license:...) que são sempre 'owner', mesmo sem base de dados.
-- Põe aqui a tua para conseguires dar cargos aos outros no menu.
Config.Owners = {
-- 'license:0000000000000000000000000000000000000000',
}
-- ----------------------------------------------------------------------------------------------
-- Bans, avisos e reports / Bans, warnings and reports
-- ----------------------------------------------------------------------------------------------
Config.Bans = {
appealUrl = 'discord.gg/drs', -- aparece na mensagem de ban
-- durações rápidas no menu (minutos; 0 = permanente)
presets = {
{ label = '1 hora', minutes = 60 },
{ label = '1 dia', minutes = 1440 },
{ label = '3 dias', minutes = 4320 },
{ label = '1 semana', minutes = 10080 },
{ label = '1 mês', minutes = 43200 },
{ label = 'Permanente', minutes = 0 },
},
reasons = { 'RDM', 'VDM', 'Metagaming', 'Powergaming', 'Fail RP', 'Combat log', 'Toxicidade', 'Cheats / modmenu', 'Exploit de bugs' },
}
Config.Warns = {
-- ao chegar a X avisos: { kick = true } ou { ban = minutos (0 = permanente) }
thresholds = {
[3] = { kick = true },
[5] = { ban = 1440 },
[8] = { ban = 0 },
},
reasons = { 'Fail RP', 'Linguagem', 'Desrespeito à staff', 'Anti-jogo', 'Spam no rádio' },
expireDays = 30, -- os avisos apagam-se sozinhos ao fim de X dias (0 = nunca) / warns expire after X days (0 = never)
}
Config.Reports = {
-- false = desliga os reports do drs_admin (usa o teu próprio sistema de reports) / false = turn drs_admin reports off (use your own)
enabled = true,
cooldown = 60, -- segundos entre reports do mesmo jogador
soundForStaff = true, -- som quando chega um report
categories = { 'Dúvida', 'Bug', 'Denúncia de jogador', 'Fiquei preso', 'Outro' },
}
-- ----------------------------------------------------------------------------------------------
-- Roupa de staff / Staff outfit
-- ----------------------------------------------------------------------------------------------
-- Por cargo (ou 'default'). item = drawable, texture = textura. Nos acessórios (props), item = -1 tira.
-- Os staffs também podem criar e guardar as suas próprias roupas no menu (Eu > Roupa).
Config.StaffOutfit = {
autoOnDuty = false, -- veste ao entrar de serviço, tira ao sair
outfits = {
default = {
male = {
mask = { 1, 0, 0 }, arms = { 3, 172, 0 }, pants = { 4, 47, 0 }, bag = { 5, 0, 0 }, shoes = { 6, 25, 0 },
accessory = { 7, 15, 0 }, undershirt = { 8, 15, 0 }, vest = { 9, 0, 0 }, decals = { 10, 0, 0 }, torso = { 11, 545, 1 },
hat = { 'p0', -1, 0 }, glasses = { 'p1', 0, 0 }, ears = { 'p2', -1, 0 }, watch = { 'p6', -1, 0 }, bracelet = { 'p7', -1, 0 },
},
female = {
mask = { 1, 0, 0 }, arms = { 3, 14, 0 }, pants = { 4, 49, 0 }, bag = { 5, 0, 0 }, shoes = { 6, 26, 0 },
accessory = { 7, 0, 0 }, undershirt = { 8, 14, 0 }, vest = { 9, 0, 0 }, decals = { 10, 0, 0 }, torso = { 11, 574, 0 },
hat = { 'p0', -1, 0 }, glasses = { 'p1', -1, 0 }, ears = { 'p2', -1, 0 }, watch = { 'p6', -1, 0 }, bracelet = { 'p7', -1, 0 },
},
},
-- owner = { male = {...}, female = {...} },
},
}
-- ----------------------------------------------------------------------------------------------
-- Veículos, teleportes e mundo / Vehicles, teleports and world
-- ----------------------------------------------------------------------------------------------
Config.VehicleGarage = 'pillboxgarage' -- garagem onde ficam os carros dados pelo menu (jg: o nome da garagem)
Config.VehiclePresets = {
{ label = 'Super', models = { 'adder', 'zentorno', 't20', 'krieger', 'emerus' } },
{ label = 'Desportivos', models = { 'elegy2', 'sultan2', 'jester4', 'comet6', 'kuruma' } },
{ label = 'SUV / Todo-o-terreno', models = { 'baller', 'granger', 'sandking', 'kamacho', 'mesa3' } },
{ label = 'Motas', models = { 'bati', 'akuma', 'sanchez', 'hakuchou2', 'manchez' } },
{ label = 'Serviço', models = { 'police', 'police3', 'ambulance', 'firetruk', 'flatbed' } },
{ label = 'Aéreo', models = { 'buzzard2', 'frogger', 'maverick', 'luxor', 'velum' } },
}
Config.Teleports = {
{ label = 'Praça Legion', coords = vector4(195.17, -933.77, 30.69, 144.0) },
{ label = 'Hospital Pillbox', coords = vector4(298.67, -584.49, 43.26, 70.0) },
{ label = 'Esquadra Mission Row', coords = vector4(428.23, -981.28, 30.71, 90.0) },
{ label = 'Aeroporto LS', coords = vector4(-1037.0, -2737.0, 20.17, 330.0) },
{ label = 'Sandy Shores', coords = vector4(1853.6, 3686.9, 34.27, 210.0) },
{ label = 'Paleto Bay', coords = vector4(-448.0, 6011.0, 31.72, 315.0) },
{ label = 'Monte Chiliad', coords = vector4(501.7, 5604.4, 797.9, 175.0) },
{ label = 'Prisão Bolingbroke', coords = vector4(1846.0, 2585.0, 45.67, 270.0) },
}
Config.Weathers = { 'EXTRASUNNY', 'CLEAR', 'CLOUDS', 'OVERCAST', 'RAIN', 'THUNDER', 'CLEARING', 'SMOG', 'FOGGY', 'SNOW', 'BLIZZARD', 'XMAS', 'HALLOWEEN' }
-- ----------------------------------------------------------------------------------------------
-- Noclip
-- ----------------------------------------------------------------------------------------------
Config.Noclip = {
speeds = { 0.5, 1.5, 3.0, 6.0, 12.0 }, -- roda do rato muda a velocidade; SHIFT = rápido, ALT = devagar
startSpeed = 2,
invisible = true, -- invisível para os outros enquanto em noclip
}
-- ----------------------------------------------------------------------------------------------
-- Aspeto / Look
-- ----------------------------------------------------------------------------------------------
Config.UI = {
serverName = 'DRS',
accent = '#7c5cff', -- cor principal do menu (cada staff pode mudar em Definições)
logo = '', -- URL de uma imagem (vazio = logótipo DRS)
}
-- Mostrar "STAFF" por cima da cabeça de quem está de serviço
Config.DutyTag = true
-- ----------------------------------------------------------------------------------------------
-- Itens, veículos e mapa / Items, vehicles and map
-- ----------------------------------------------------------------------------------------------
-- Imagens dos itens: vazio = deteta o inventário (ox, qb, qs, codem, origen, tgiann, ps, lj).
-- Ou um caminho com %s para o ficheiro, ex.: 'nui://meu-inventario/html/images/%s'
Config.ItemImages = ''
-- Modelos de veículos extra para a lista (além dos do framework) / extra vehicle models for the list
Config.ExtraVehicles = {}
-- Mapa ao vivo: imagem do mapa do GTA em html/img (já incluída). Se a trocares, ajusta os limites. Sem imagem mostra uma grelha.
-- Live map: GTA map image in html/img (square). Without an image a grid is shown.
Config.Map = {
image = 'img/map.jpg',
-- limites do mapa na imagem (coordenadas do jogo nos cantos) / map bounds (game coords at the image corners)
bounds = { minX = -3965.0, maxX = 5635.0, minY = -4263.0, maxY = 7992.0 },
refreshSeconds = 3,
}
-- ----------------------------------------------------------------------------------------------
-- Ferramentas de programador / Developer tools
-- ----------------------------------------------------------------------------------------------
-- O executor de Lua corre código no servidor ou no teu cliente. Só para o dono (permissão dev.lua) e só com isto ligado.
-- The Lua executor runs code on the server or your client. Owner only (dev.lua permission) and only when this is on.
Config.DevTools = {
luaExecutor = false,
}#Webhooks
-- Só no servidor (nunca é enviado aos jogadores): webhooks do Discord.
-- Server only (never sent to players): Discord webhooks.
ServerConfig = {}
-- Um webhook por categoria. Vazio = usa o 'default'. 'default' vazio = sem logs no Discord (ficam na mesma no menu).
ServerConfig.Webhooks = {
default = '',
players = '', -- teleportes, reviver, congelar, espectar, mensagens...
moderation = '', -- kicks, bans, unbans, avisos, prisão
economy = '', -- dinheiro, itens, armas, veículos, emprego
self = '', -- noclip, invencível, invisível, roupa, spawn de veículos
world = '', -- tempo, hora, anúncios, limpezas
server = '', -- recursos, kick a todos
reports = '', -- reports abertos, assumidos, fechados
staff = '', -- cargos dados/tirados, entrar/sair de serviço
chat = '', -- chat da staff
connections = '', -- entradas e saídas de jogadores (e tentativas de quem está banido)
screenshots = '', -- capturas de ecrã pedidas pela staff
}
-- Ações que não vão para o Discord (ficam só no menu). Ex.: { 'self.noclip' }
ServerConfig.SkipDiscord = {}
-- Nome e imagem do bot nos logs
ServerConfig.BotName = 'DRS Admin'
ServerConfig.BotAvatar = ''
-- Fotos de perfil do Discord no menu: precisa de um bot do Discord (qualquer bot serve, não precisa de estar no teu servidor).
-- Põe o token aqui OU numa convar do server.cfg (set drs_discord_bot_token "...") e deixa o nome dela abaixo.
ServerConfig.DiscordBotToken = ''
ServerConfig.DiscordBotTokenConvar = 'drs_discord_bot_token'