-- Variables local QBCore = exports['qb-core']:GetCoreObject() local frozen = false local permissions = { ['kill'] = 'admin', ['ban'] = 'admin', ['noclip'] = 'admin', ['kickall'] = 'admin', ['kick'] = 'admin', ['revive'] = 'admin', ['freeze'] = 'admin', ['goto'] = 'admin', ['spectate'] = 'admin', ['intovehicle'] = 'admin', ['bring'] = 'admin', ['inventory'] = 'admin', ['clothing'] = 'admin' } function GetQBPlayers() local playerReturn = {} local players = QBCore.Functions.GetQBPlayers() for id, player in pairs(players) do local playerPed = GetPlayerPed(id) local name = (player.PlayerData.charinfo.firstname or '') .. ' ' .. (player.PlayerData.charinfo.lastname or '') playerReturn[#playerReturn + 1] = { name = name .. ' | (' .. (player.PlayerData.name or '') .. ')', id = id, coords = GetEntityCoords(playerPed), cid = name, citizenid = player.PlayerData.citizenid, sources = playerPed, sourceplayer = id } end return playerReturn end -- Get Dealers QBCore.Functions.CreateCallback('test:getdealers', function(_, cb) cb(exports['qb-drugs']:GetDealers()) end) -- Get Players QBCore.Functions.CreateCallback('test:getplayers', function(_, cb) -- WORKS local players = GetQBPlayers() cb(players) end) QBCore.Functions.CreateCallback('qb-admin:isAdmin', function(src, cb) -- WORKS cb(QBCore.Functions.HasPermission(src, 'admin') or IsPlayerAceAllowed(src, 'command')) end) QBCore.Functions.CreateCallback('qb-admin:server:getrank', function(source, cb) if QBCore.Functions.HasPermission(source, 'god') or IsPlayerAceAllowed(source, 'command') then cb(true) else cb(false) end end) -- Functions local function tablelength(table) local count = 0 for _ in pairs(table) do count = count + 1 end return count end local function BanPlayer(src) MySQL.insert('INSERT INTO bans (name, license, discord, ip, reason, expire, bannedby) VALUES (?, ?, ?, ?, ?, ?, ?)', { GetPlayerName(src), QBCore.Functions.GetIdentifier(src, 'license'), QBCore.Functions.GetIdentifier(src, 'discord'), QBCore.Functions.GetIdentifier(src, 'ip'), 'Trying to revive theirselves or other players', 2147483647, 'qb-adminmenu' }) TriggerEvent('qb-log:server:CreateLog', 'adminmenu', 'Player Banned', 'red', string.format('%s was banned by %s for %s', GetPlayerName(src), 'qb-adminmenu', 'Trying to trigger admin options which they dont have permission for'), true) DropPlayer(src, 'You were permanently banned by the server for: Exploiting') end -- Events RegisterNetEvent('qb-admin:server:GetPlayersForBlips', function() local src = source local players = GetQBPlayers() TriggerClientEvent('qb-admin:client:Show', src, players) end) RegisterNetEvent('qb-admin:server:kill', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['kill']) or IsPlayerAceAllowed(src, 'command') then TriggerClientEvent('hospital:client:KillPlayer', player.id) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:revive', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['revive']) or IsPlayerAceAllowed(src, 'command') then TriggerClientEvent('hospital:client:Revive', player.id) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:kick', function(player, reason) local src = source if QBCore.Functions.HasPermission(src, permissions['kick']) or IsPlayerAceAllowed(src, 'command') then TriggerEvent('qb-log:server:CreateLog', 'bans', 'Player Kicked', 'red', string.format('%s was kicked by %s for %s', GetPlayerName(player.id), GetPlayerName(src), reason), true) DropPlayer(player.id, Lang:t('info.kicked_server') .. ':\n' .. reason .. '\n\n' .. Lang:t('info.check_discord') .. QBCore.Config.Server.Discord) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:ban', function(player, time, reason) local src = source if QBCore.Functions.HasPermission(src, permissions['ban']) or IsPlayerAceAllowed(src, 'command') then time = tonumber(time) local banTime = tonumber(os.time() + time) if banTime > 2147483647 then banTime = 2147483647 end local timeTable = os.date('*t', banTime) MySQL.insert('INSERT INTO bans (name, license, discord, ip, reason, expire, bannedby) VALUES (?, ?, ?, ?, ?, ?, ?)', { GetPlayerName(player.id), QBCore.Functions.GetIdentifier(player.id, 'license'), QBCore.Functions.GetIdentifier(player.id, 'discord'), QBCore.Functions.GetIdentifier(player.id, 'ip'), reason, banTime, GetPlayerName(src) }) TriggerClientEvent('chat:addMessage', -1, { template = "
ANNOUNCEMENT | {0} has been banned: {1}
", args = { GetPlayerName(player.id), reason } }) TriggerEvent('qb-log:server:CreateLog', 'bans', 'Player Banned', 'red', string.format('%s was banned by %s for %s', GetPlayerName(player.id), GetPlayerName(src), reason), true) if banTime >= 2147483647 then DropPlayer(player.id, Lang:t('info.banned') .. '\n' .. reason .. Lang:t('info.ban_perm') .. QBCore.Config.Server.Discord) else DropPlayer(player.id, Lang:t('info.banned') .. '\n' .. reason .. Lang:t('info.ban_expires') .. timeTable['day'] .. '/' .. timeTable['month'] .. '/' .. timeTable['year'] .. ' ' .. timeTable['hour'] .. ':' .. timeTable['min'] .. '\n🔸 Check our Discord for more information: ' .. QBCore.Config.Server.Discord) end else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:spectate', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['spectate']) or IsPlayerAceAllowed(src, 'command') then local targetped = GetPlayerPed(player.id) local coords = GetEntityCoords(targetped) TriggerClientEvent('qb-admin:client:spectate', src, player.id, coords) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:freeze', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['freeze']) or IsPlayerAceAllowed(src, 'command') then local target = GetPlayerPed(player.id) if not frozen then frozen = true FreezeEntityPosition(target, true) else frozen = false FreezeEntityPosition(target, false) end else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:goto', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['goto']) or IsPlayerAceAllowed(src, 'command') then local admin = GetPlayerPed(src) local coords = GetEntityCoords(GetPlayerPed(player.id)) SetEntityCoords(admin, coords) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:intovehicle', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['intovehicle']) or IsPlayerAceAllowed(src, 'command') then local admin = GetPlayerPed(src) local targetPed = GetPlayerPed(player.id) local vehicle = GetVehiclePedIsIn(targetPed, false) local seat = -1 if vehicle ~= 0 then for i = 0, 8, 1 do if GetPedInVehicleSeat(vehicle, i) == 0 then seat = i break end end if seat ~= -1 then SetPedIntoVehicle(admin, vehicle, seat) TriggerClientEvent('QBCore:Notify', src, Lang:t('sucess.entered_vehicle'), 'success', 5000) else TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_free_seats'), 'danger', 5000) end end else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:bring', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['bring']) or IsPlayerAceAllowed(src, 'command') then local admin = GetPlayerPed(src) local coords = GetEntityCoords(admin) local target = GetPlayerPed(player.id) SetEntityCoords(target, coords) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:inventory', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['inventory']) or IsPlayerAceAllowed(src, 'command') then exports['qb-inventory']:OpenInventoryById(src, player.id) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:cloth', function(player) local src = source if QBCore.Functions.HasPermission(src, permissions['clothing']) or IsPlayerAceAllowed(src, 'command') then TriggerClientEvent('qb-clothing:client:openMenu', player.id) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:setPermissions', function(targetId, group) local src = source if QBCore.Functions.HasPermission(src, 'god') or IsPlayerAceAllowed(src, 'command') then QBCore.Functions.AddPermission(targetId, group[1].rank) TriggerClientEvent('QBCore:Notify', targetId, Lang:t('info.rank_level') .. group[1].label) else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:SendReport', function(name, targetSrc, msg) local src = source if QBCore.Functions.HasPermission(src, 'admin') or IsPlayerAceAllowed(src, 'command') then if QBCore.Functions.IsOptin(src) then TriggerClientEvent('chat:addMessage', src, { color = { 255, 0, 0 }, multiline = true, args = { Lang:t('info.admin_report') .. name .. ' (' .. targetSrc .. ')', msg } }) end end end) RegisterServerEvent('qb-admin:giveWeapon', function(weapon) local src = source if QBCore.Functions.HasPermission(src, 'admin') or IsPlayerAceAllowed(src, 'command') then exports['qb-inventory']:AddItem(src, weapon, 1, false, false, 'qb-admin:giveWeapon') else BanPlayer(src) end end) RegisterNetEvent('qb-admin:server:SaveCar', function(mods, vehicle, _, plate) local src = source if QBCore.Functions.HasPermission(src, 'admin') or IsPlayerAceAllowed(src, 'command') then local Player = QBCore.Functions.GetPlayer(src) local result = MySQL.query.await('SELECT plate FROM player_vehicles WHERE plate = ?', { plate }) if result[1] == nil then MySQL.insert('INSERT INTO player_vehicles (license, citizenid, vehicle, hash, mods, plate, state) VALUES (?, ?, ?, ?, ?, ?, ?)', { Player.PlayerData.license, Player.PlayerData.citizenid, vehicle.model, vehicle.hash, json.encode(mods), plate, 0 }) TriggerClientEvent('QBCore:Notify', src, Lang:t('success.success_vehicle_owner'), 'success', 5000) else TriggerClientEvent('QBCore:Notify', src, Lang:t('error.failed_vehicle_owner'), 'error', 3000) end else BanPlayer(src) end end) -- Commands QBCore.Commands.Add('maxmods', Lang:t('desc.max_mod_desc'), {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:maxmodVehicle', src) end, 'admin') QBCore.Commands.Add('blips', Lang:t('commands.blips_for_player'), {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:toggleBlips', src) end, 'admin') QBCore.Commands.Add('names', Lang:t('commands.player_name_overhead'), {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:toggleNames', src) end, 'admin') QBCore.Commands.Add('coords', Lang:t('commands.coords_dev_command'), {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:ToggleCoords', src) end, 'admin') QBCore.Commands.Add('noclip', Lang:t('commands.toogle_noclip'), {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:ToggleNoClip', src) end, 'admin') QBCore.Commands.Add('admincar', Lang:t('commands.save_vehicle_garage'), {}, false, function(source, _) TriggerClientEvent('qb-admin:client:SaveCar', source) end, 'admin') QBCore.Commands.Add('announce', Lang:t('commands.make_announcement'), {}, false, function(_, args) local msg = table.concat(args, ' ') if msg == '' then return end TriggerClientEvent('chat:addMessage', -1, { color = { 255, 0, 0 }, multiline = true, args = { 'Announcement', msg } }) end, 'admin') QBCore.Commands.Add('admin', Lang:t('commands.open_admin'), {}, false, function(source, _) TriggerClientEvent('qb-admin:client:openMenu', source) end, 'admin') QBCore.Commands.Add('report', Lang:t('info.admin_report'), { { name = 'message', help = 'Message' } }, true, function(source, args) local src = source local msg = table.concat(args, ' ') local Player = QBCore.Functions.GetPlayer(source) TriggerClientEvent('qb-admin:client:SendReport', -1, GetPlayerName(src), src, msg) TriggerEvent('qb-log:server:CreateLog', 'report', 'Report', 'green', '**' .. GetPlayerName(source) .. '** (CitizenID: ' .. Player.PlayerData.citizenid .. ' | ID: ' .. source .. ') **Report:** ' .. msg, false) end) QBCore.Commands.Add('staffchat', Lang:t('commands.staffchat_message'), { { name = 'message', help = 'Message' } }, true, function(source, args) local msg = table.concat(args, ' ') local name = GetPlayerName(source) local plrs = GetPlayers() for _, plr in ipairs(plrs) do plr = tonumber(plr) if plr then if QBCore.Functions.HasPermission(plr, 'admin') or IsPlayerAceAllowed(plr, 'command') then if QBCore.Functions.IsOptin(plr) then TriggerClientEvent('chat:addMessage', plr, { color = { 255, 0, 0 }, multiline = true, args = { Lang:t('info.staffchat') .. name, msg } }) end end end end end, 'admin') QBCore.Commands.Add('givenuifocus', Lang:t('commands.nui_focus'), { { name = 'id', help = 'Player id' }, { name = 'focus', help = 'Set focus on/off' }, { name = 'mouse', help = 'Set mouse on/off' } }, true, function(_, args) local playerid = tonumber(args[1]) local focus = args[2] local mouse = args[3] TriggerClientEvent('qb-admin:client:GiveNuiFocus', playerid, focus, mouse) end, 'admin') QBCore.Commands.Add('warn', Lang:t('commands.warn_a_player'), { { name = 'ID', help = 'Player' }, { name = 'Reason', help = 'Mention a reason' } }, true, function(source, args) local targetPlayer = QBCore.Functions.GetPlayer(tonumber(args[1])) local senderPlayer = QBCore.Functions.GetPlayer(source) table.remove(args, 1) local msg = table.concat(args, ' ') local warnId = 'WARN-' .. math.random(1111, 9999) if targetPlayer ~= nil then TriggerClientEvent('chat:addMessage', targetPlayer.PlayerData.source, { args = { 'SYSTEM', Lang:t('info.warning_chat_message') .. GetPlayerName(source) .. ',' .. Lang:t('info.reason') .. ': ' .. msg }, color = 255, 0, 0 }) TriggerClientEvent('chat:addMessage', source, { args = { 'SYSTEM', Lang:t('info.warning_staff_message') .. GetPlayerName(targetPlayer.PlayerData.source) .. ', for: ' .. msg }, color = 255, 0, 0 }) MySQL.insert('INSERT INTO player_warns (senderIdentifier, targetIdentifier, reason, warnId) VALUES (?, ?, ?, ?)', { senderPlayer.PlayerData.license, targetPlayer.PlayerData.license, msg, warnId }) else TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end, 'admin') QBCore.Commands.Add('checkwarns', Lang:t('commands.check_player_warning'), { { name = 'id', help = 'Player' }, { name = 'Warning', help = 'Number of warning, (1, 2 or 3 etc..)' } }, false, function(source, args) if args[2] == nil then local targetPlayer = QBCore.Functions.GetPlayer(tonumber(args[1])) local result = MySQL.query.await('SELECT * FROM player_warns WHERE targetIdentifier = ?', { targetPlayer.PlayerData.license }) TriggerClientEvent('chat:addMessage', source, 'SYSTEM', 'warning', targetPlayer.PlayerData.name .. ' has ' .. tablelength(result) .. ' warnings!') else local targetPlayer = QBCore.Functions.GetPlayer(tonumber(args[1])) local warnings = MySQL.query.await('SELECT * FROM player_warns WHERE targetIdentifier = ?', { targetPlayer.PlayerData.license }) local selectedWarning = tonumber(args[2]) if warnings[selectedWarning] ~= nil then local sender = QBCore.Functions.GetPlayer(warnings[selectedWarning].senderIdentifier) TriggerClientEvent('chat:addMessage', source, 'SYSTEM', 'warning', targetPlayer.PlayerData.name .. ' has been warned by ' .. sender.PlayerData.name .. ', Reason: ' .. warnings[selectedWarning].reason) end end end, 'admin') QBCore.Commands.Add('delwarn', Lang:t('commands.delete_player_warning'), { { name = 'id', help = 'Player' }, { name = 'Warning', help = 'Number of warning, (1, 2 or 3 etc..)' } }, true, function(source, args) local targetPlayer = QBCore.Functions.GetPlayer(tonumber(args[1])) local warnings = MySQL.query.await('SELECT * FROM player_warns WHERE targetIdentifier = ?', { targetPlayer.PlayerData.license }) local selectedWarning = tonumber(args[2]) if warnings[selectedWarning] ~= nil then TriggerClientEvent('chat:addMessage', source, 'SYSTEM', 'warning', 'You have deleted warning (' .. selectedWarning .. ') , Reason: ' .. warnings[selectedWarning].reason) MySQL.query('DELETE FROM player_warns WHERE warnId = ?', { warnings[selectedWarning].warnId }) end end, 'admin') QBCore.Commands.Add('reportr', Lang:t('commands.reply_to_report'), { { name = 'id', help = 'Player' }, { name = 'message', help = 'Message to respond with' } }, false, function(source, args) local src = source local playerId = tonumber(args[1]) table.remove(args, 1) local msg = table.concat(args, ' ') local OtherPlayer = QBCore.Functions.GetPlayer(playerId) if msg == '' then return end if not OtherPlayer then return TriggerClientEvent('QBCore:Notify', src, 'Player is not online', 'error') end if not QBCore.Functions.HasPermission(src, 'admin') or IsPlayerAceAllowed(src, 'command') ~= 1 then return end TriggerClientEvent('chat:addMessage', playerId, { color = { 255, 0, 0 }, multiline = true, args = { 'Admin Response', msg } }) TriggerClientEvent('chat:addMessage', src, { color = { 255, 0, 0 }, multiline = true, args = { 'Report Response (' .. playerId .. ')', msg } }) TriggerClientEvent('QBCore:Notify', src, 'Reply Sent') TriggerEvent('qb-log:server:CreateLog', 'report', 'Report Reply', 'red', '**' .. GetPlayerName(src) .. '** replied on: **' .. OtherPlayer.PlayerData.name .. ' **(ID: ' .. OtherPlayer.PlayerData.source .. ') **Message:** ' .. msg, false) end, 'admin') QBCore.Commands.Add('setmodel', Lang:t('commands.change_ped_model'), { { name = 'model', help = 'Name of the model' }, { name = 'id', help = 'Id of the Player (empty for yourself)' } }, false, function(source, args) local model = args[1] local target = tonumber(args[2]) if model ~= nil or model ~= '' then if target == nil then TriggerClientEvent('qb-admin:client:SetModel', source, tostring(model)) else local Trgt = QBCore.Functions.GetPlayer(target) if Trgt ~= nil then TriggerClientEvent('qb-admin:client:SetModel', target, tostring(model)) else TriggerClientEvent('QBCore:Notify', source, Lang:t('error.not_online'), 'error') end end else TriggerClientEvent('QBCore:Notify', source, Lang:t('error.failed_set_model'), 'error') end end, 'admin') QBCore.Commands.Add('setspeed', Lang:t('commands.set_player_foot_speed'), {}, false, function(source, args) local speed = args[1] if speed ~= nil then TriggerClientEvent('qb-admin:client:SetSpeed', source, tostring(speed)) else TriggerClientEvent('QBCore:Notify', source, Lang:t('error.failed_set_speed'), 'error') end end, 'admin') QBCore.Commands.Add('reporttoggle', Lang:t('commands.report_toggle'), {}, false, function(source, _) local src = source QBCore.Functions.ToggleOptin(src) if QBCore.Functions.IsOptin(src) then TriggerClientEvent('QBCore:Notify', src, Lang:t('success.receive_reports'), 'success') else TriggerClientEvent('QBCore:Notify', src, Lang:t('error.no_receive_report'), 'error') end end, 'admin') QBCore.Commands.Add('kickall', Lang:t('commands.kick_all'), {}, false, function(source, args) local src = source if src > 0 then local reason = table.concat(args, ' ') if QBCore.Functions.HasPermission(src, 'god') or IsPlayerAceAllowed(src, 'command') then if reason and reason ~= '' then local players = GetPlayers() for _, playerId in ipairs(players) do DropPlayer(playerId, reason) end else TriggerClientEvent('QBCore:Notify', src, Lang:t('info.no_reason_specified'), 'error') end end else local players = GetPlayers() for _, playerId in ipairs(players) do DropPlayer(playerId, Lang:t('info.server_restart') .. QBCore.Config.Server.Discord) end end end, 'god') QBCore.Commands.Add('setammo', Lang:t('commands.ammo_amount_set'), { { name = 'amount', help = 'Amount of bullets, for example: 20' } }, false, function(source, args) local src = source local ped = GetPlayerPed(src) local amount = tonumber(args[1]) local weapon = GetSelectedPedWeapon(ped) if weapon and amount then SetPedAmmo(ped, weapon, amount) TriggerClientEvent('QBCore:Notify', src, Lang:t('info.ammoforthe', { value = amount, weapon = QBCore.Shared.Weapons[weapon]['label'] }), 'success') end end, 'admin') QBCore.Commands.Add('vector2', 'Copy vector2 to clipboard (Admin only)', {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:copyToClipboard', src, 'coords2') end, 'admin') QBCore.Commands.Add('vector3', 'Copy vector3 to clipboard (Admin only)', {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:copyToClipboard', src, 'coords3') end, 'admin') QBCore.Commands.Add('vector4', 'Copy vector4 to clipboard (Admin only)', {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:copyToClipboard', src, 'coords4') end, 'admin') QBCore.Commands.Add('heading', 'Copy heading to clipboard (Admin only)', {}, false, function(source) local src = source TriggerClientEvent('qb-admin:client:copyToClipboard', src, 'heading') end, 'admin')