146 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local QBCore = exports['qb-core']:GetCoreObject()
 | |
| local scoreboardOpen = false
 | |
| local playerOptin = {}
 | |
| 
 | |
| -- Functions
 | |
| 
 | |
| local function DrawText3D(x, y, z, text)
 | |
|     SetTextScale(0.35, 0.35)
 | |
|     SetTextFont(4)
 | |
|     SetTextProportional(1)
 | |
|     SetTextColour(255, 255, 255, 215)
 | |
|     BeginTextCommandDisplayText('STRING')
 | |
|     SetTextCentre(true)
 | |
|     AddTextComponentSubstringPlayerName(text)
 | |
|     SetDrawOrigin(x, y, z, 0)
 | |
|     EndTextCommandDisplayText(0.0, 0.0)
 | |
|     local factor = (string.len(text)) / 370
 | |
|     DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75)
 | |
|     ClearDrawOrigin()
 | |
| end
 | |
| 
 | |
| local function GetPlayers()
 | |
|     local players = {}
 | |
|     local activePlayers = GetActivePlayers()
 | |
|     for i = 1, #activePlayers do
 | |
|         local player = activePlayers[i]
 | |
|         local ped = GetPlayerPed(player)
 | |
|         if DoesEntityExist(ped) then
 | |
|             players[#players + 1] = player
 | |
|         end
 | |
|     end
 | |
|     return players
 | |
| end
 | |
| 
 | |
| local function GetPlayersFromCoords(coords, distance)
 | |
|     local players = GetPlayers()
 | |
|     local closePlayers = {}
 | |
|     coords = coords or GetEntityCoords(PlayerPedId())
 | |
|     distance = distance or 5.0
 | |
|     for i = 1, #players do
 | |
|         local player = players[i]
 | |
|         local target = GetPlayerPed(player)
 | |
|         local targetCoords = GetEntityCoords(target)
 | |
|         local targetdistance = #(targetCoords - vector3(coords.x, coords.y, coords.z))
 | |
|         if targetdistance <= distance then
 | |
|             closePlayers[#closePlayers + 1] = player
 | |
|         end
 | |
|     end
 | |
|     return closePlayers
 | |
| end
 | |
| 
 | |
| -- Events
 | |
| 
 | |
| RegisterNetEvent('qb-scoreboard:client:SetActivityBusy', function(activity, busy)
 | |
|     Config.IllegalActions[activity].busy = busy
 | |
| end)
 | |
| 
 | |
| -- Command
 | |
| 
 | |
| if Config.Toggle then
 | |
|     RegisterCommand('scoreboard', function()
 | |
|         if not scoreboardOpen then
 | |
|             QBCore.Functions.TriggerCallback('qb-scoreboard:server:GetScoreboardData', function(players, cops, playerList)
 | |
|                 playerOptin = playerList
 | |
| 
 | |
|                 SendNUIMessage({
 | |
|                     action = 'open',
 | |
|                     players = players,
 | |
|                     maxPlayers = Config.MaxPlayers,
 | |
|                     requiredCops = Config.IllegalActions,
 | |
|                     currentCops = cops
 | |
|                 })
 | |
| 
 | |
|                 scoreboardOpen = true
 | |
|             end)
 | |
|         else
 | |
|             SendNUIMessage({
 | |
|                 action = 'close',
 | |
|             })
 | |
| 
 | |
|             scoreboardOpen = false
 | |
|         end
 | |
|     end, false)
 | |
| 
 | |
|     RegisterKeyMapping('scoreboard', 'Open Scoreboard', 'keyboard', Config.OpenKey)
 | |
| else
 | |
|     RegisterCommand('+scoreboard', function()
 | |
|         if scoreboardOpen then return end
 | |
|         QBCore.Functions.TriggerCallback('qb-scoreboard:server:GetScoreboardData', function(players, cops, playerList)
 | |
|             playerOptin = playerList
 | |
| 
 | |
|             SendNUIMessage({
 | |
|                 action = 'open',
 | |
|                 players = players,
 | |
|                 maxPlayers = Config.MaxPlayers,
 | |
|                 requiredCops = Config.IllegalActions,
 | |
|                 currentCops = cops
 | |
|             })
 | |
| 
 | |
|             scoreboardOpen = true
 | |
|         end)
 | |
|     end, false)
 | |
| 
 | |
|     RegisterCommand('-scoreboard', function()
 | |
|         if not scoreboardOpen then return end
 | |
|         SendNUIMessage({
 | |
|             action = 'close',
 | |
|         })
 | |
| 
 | |
|         scoreboardOpen = false
 | |
|     end, false)
 | |
| 
 | |
|     RegisterKeyMapping('+scoreboard', 'Open Scoreboard', 'keyboard', Config.OpenKey)
 | |
| end
 | |
| 
 | |
| -- Threads
 | |
| 
 | |
| CreateThread(function()
 | |
|     Wait(1000)
 | |
|     local actions = {}
 | |
|     for k, v in pairs(Config.IllegalActions) do
 | |
|         actions[k] = v.label
 | |
|     end
 | |
|     SendNUIMessage({
 | |
|         action = 'setup',
 | |
|         items = actions
 | |
|     })
 | |
| end)
 | |
| 
 | |
| CreateThread(function()
 | |
|     while true do
 | |
|         local loop = 100
 | |
|         if scoreboardOpen then
 | |
|             for _, player in pairs(GetPlayersFromCoords(GetEntityCoords(PlayerPedId()), 10.0)) do
 | |
|                 local playerId = GetPlayerServerId(player)
 | |
|                 local playerPed = GetPlayerPed(player)
 | |
|                 local playerCoords = GetEntityCoords(playerPed)
 | |
|                 if Config.ShowIDforALL or playerOptin[playerId].optin then
 | |
|                     loop = 0
 | |
|                     DrawText3D(playerCoords.x, playerCoords.y, playerCoords.z + 1.0, '[' .. playerId .. ']')
 | |
|                 end
 | |
|             end
 | |
|         end
 | |
|         Wait(loop)
 | |
|     end
 | |
| end)
 | 
