151 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
	
		
			4.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| activePlayerPositions = {}
 | |
| 
 | |
| -- returns a loaded vehicled with a given number plate
 | |
| function TryGetLoadedVehicle(plate, loadedVehicles)
 | |
|     for i = 1, #loadedVehicles, 1 do
 | |
|         if (plate == GetVehicleNumberPlateText(loadedVehicles[i]) and DoesEntityExist(loadedVehicles[i])) then
 | |
|             return loadedVehicles[i]
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return nil
 | |
| end
 | |
| 
 | |
| function ContainsPlate(plate, vehiclePlates)
 | |
|     for i = 1, #vehiclePlates, 1 do
 | |
|         if (plate == vehiclePlates[i]) then
 | |
|             return true
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return false
 | |
| end
 | |
| 
 | |
| -- Logs text to the server console
 | |
| function Log(text)
 | |
|     if (Config.isDebug) then
 | |
|         Print(GetCurrentResourceName() .. ": " .. text)
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- return the distance between two positions (Vector3)
 | |
| function Vector3Dist(v1, v2)
 | |
| 	return math.sqrt( (v2.x - v1.x) * (v2.x - v1.x) + (v2.y - v1.y) * (v2.y - v1.y) + (v2.z - v1.z) * (v2.z - v1.z) )
 | |
| end
 | |
| 
 | |
| -- return the distance between two positions without sqrt (Vector3)
 | |
| function Vector3DistFast(v1, v2)
 | |
| 	return (v2.x - v1.x) * (v2.x - v1.x) + (v2.y - v1.y) * (v2.y - v1.y) + (v2.z - v1.z) * (v2.z - v1.z)
 | |
| end
 | |
| 
 | |
| -- returns the difference in degrees from the axis with the highest difference
 | |
| function GetRotationDifference(r1, r2)
 | |
|     local x = math.abs(r1.x - r2.x)
 | |
|     local y = math.abs(r1.y - r2.y)
 | |
|     local z = math.abs(r1.z - r2.z)
 | |
| 
 | |
|     if (x > y and x > z) then
 | |
|         return x
 | |
|     elseif (y > z) then
 | |
|         return y
 | |
|     else
 | |
|         return z
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- get the amount of currently active players
 | |
| function GetActivePlayerCount()
 | |
|     local playerCount = 0
 | |
|     for k, v in pairs(activePlayerPositions) do
 | |
|         playerCount = playerCount + 1
 | |
|     end
 | |
|     return playerCount
 | |
| end
 | |
| 
 | |
| -- return the ID of the closest player
 | |
| function GetClosestPlayerId(position)
 | |
| 	local closestDistance = 1000000.0
 | |
| 	local closestPlayerID = nil
 | |
|     local closestPos = nil
 | |
| 	
 | |
|     for playerID, pos in pairs(activePlayerPositions) do
 | |
|         local distance = Vector3DistFast(position, pos)
 | |
|         
 | |
|         if (distance < closestDistance) then
 | |
|             closestDistance = distance
 | |
|             closestPlayerID = playerID
 | |
|             closestPos = pos
 | |
|         end
 | |
| 	end
 | |
| 	
 | |
|     local distance = nil
 | |
|     if (closestPlayerID ~= nil) then
 | |
|         distance = Vector3Dist(position, closestPos)
 | |
|     end
 | |
|     
 | |
| 	return closestPlayerID, distance
 | |
| end
 | |
| 
 | |
| function IsAnyPlayerInsideVehicle(vehicle, playerPeds)
 | |
|     for i = 1, #playerPeds, 1 do
 | |
|         local veh = GetVehiclePedIsIn(playerPeds[i], false)
 | |
| 
 | |
|         if (DoesEntityExist(veh) and veh == vehicle) then
 | |
|             return true
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return false
 | |
| end
 | |
| 
 | |
| -- return the ped of the closest player
 | |
| function GetClosestPlayerPed(position, playerPeds)
 | |
| 	local closestDistance = 1000000.0
 | |
| 	local closestPlayerPed = nil
 | |
|     local closestPos = nil
 | |
| 	
 | |
|     for k, playerPed in pairs(playerPeds) do
 | |
|         local pos = GetEntityCoords(playerPed)
 | |
|         local distance = Vector3DistFast(position, pos)
 | |
|         
 | |
|         if (distance < closestDistance) then
 | |
|             closestDistance = distance
 | |
|             closestPlayerPed = playerPed
 | |
|             closestPos = pos
 | |
|         end
 | |
| 	end
 | |
| 	
 | |
|     local distance = 0.0
 | |
|     if (closestPlayerPed ~= nil) then
 | |
|         distance = Vector3Dist(position, closestPos)
 | |
|     end
 | |
|     
 | |
| 	return closestPlayerPed, distance
 | |
| end
 | |
| 
 | |
| -- returns true if a player is active on the server with the specified license
 | |
| function IsPlayerWithLicenseActive(license)
 | |
|     for playerId, playerPos in pairs(activePlayerPositions) do
 | |
|         if (GetPlayerIdentifiersSorted(playerId)["license"] == license) then
 | |
|             return true
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     return false
 | |
| end
 | |
| 
 | |
| -- Return an array with all identifiers - e.g. ids["license"] = license:xxxxxxxxxxxxxxxx
 | |
| function GetPlayerIdentifiersSorted(playerServerId)
 | |
| 	local ids = {}
 | |
| 
 | |
| 	local identifiers = GetPlayerIdentifiers(playerServerId)
 | |
| 
 | |
| 	for k, identifier in pairs (identifiers) do
 | |
| 		local i, j = string.find(identifier, ":")
 | |
| 		local idType = string.sub(identifier, 1, i-1)
 | |
| 
 | |
| 		ids[idType] = identifier
 | |
| 	end
 | |
| 
 | |
| 	return ids
 | |
| end
 | 
