Main/resources/[qb]/qb-adminmenu/server/server.lua
2025-06-07 08:51:21 +02:00

544 lines
23 KiB
Lua

-- 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 = "<div class=chat-message server'><strong>ANNOUNCEMENT | {0} has been banned:</strong> {1}</div>",
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')