DRS Advanced Admin

v1.1.0 drs_admin
Ver na loja

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

RecursoObrigatório
oxmysqlSim
Qbox, QBCore ou ESXNão (deteção automática; sem framework funciona na mesma)
screenshot-basicNão — só para as capturas de ecrã
pma-voiceNão — só para silenciar

#Instalação

  1. Coloca drs_admin em resources.
  2. Adiciona ao server.cfg, depois da framework e do oxmysql:
server.cfg
ensure oxmysql
ensure qb-core
ensure drs_admin
  1. As tabelas criam-se sozinhas no primeiro arranque (também tens sql/drs_admin.sql).
  2. Dá-te o cargo de Fundador (escolhe uma forma):
    • na consola do servidor: drsadmin_setrank <id> owner (ou drsadmin_setrank license:... owner);
    • em config.lua: põe a tua licença em Config.Owners;
    • no server.cfg, pelos grupos da framework:
server.cfg
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
  1. Entra no jogo e carrega F9 (ou /admin). Os outros staffs adicionas no próprio menu, em Staff > Adicionar staff.

#Comandos e teclas

Comando / teclaO que faz
F9 · /admin · /drsadminAbre o menu
HOME · /noclipNoclip (W A S D, espaço/CTRL sobe e desce, SHIFT rápido, ALT devagar, roda do rato muda a velocidade)
/reportQualquer jogador fala com a staff (se os reports estiverem ligados)
/sc mensagemChat da staff
/anuncio textoAnúncio para todos
/tpm · /coordsIr 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.expireDays dias.

#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

servidor
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.lua
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

server_config.lua
-- 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'