79 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
--[[
 | 
						|
    https://github.com/overextended/ox_lib
 | 
						|
 | 
						|
    This file is licensed under LGPL-3.0 or higher <https://www.gnu.org/licenses/lgpl-3.0.en.html>
 | 
						|
 | 
						|
    Copyright © 2025 Linden <https://github.com/thelindat>
 | 
						|
]]
 | 
						|
 | 
						|
lib.raycast = {}
 | 
						|
 | 
						|
local StartShapeTestLosProbe = StartShapeTestLosProbe
 | 
						|
local GetShapeTestResultIncludingMaterial = GetShapeTestResultIncludingMaterial
 | 
						|
local glm_sincos = require 'glm'.sincos
 | 
						|
local glm_rad = require 'glm'.rad
 | 
						|
local math_abs = math.abs
 | 
						|
local GetFinalRenderedCamCoord = GetFinalRenderedCamCoord
 | 
						|
local GetFinalRenderedCamRot = GetFinalRenderedCamRot
 | 
						|
 | 
						|
---@alias ShapetestIgnore
 | 
						|
---| 1 GLASS
 | 
						|
---| 2 SEE_THROUGH
 | 
						|
---| 3 GLASS | SEE_THROUGH
 | 
						|
---| 4 NO_COLLISION
 | 
						|
---| 7 GLASS | SEE_THROUGH | NO_COLLISION
 | 
						|
 | 
						|
---@alias ShapetestFlags integer
 | 
						|
---| 1 INCLUDE_MOVER
 | 
						|
---| 2 INCLUDE_VEHICLE
 | 
						|
---| 4 INCLUDE_PED
 | 
						|
---| 8 INCLUDE_RAGDOLL
 | 
						|
---| 16 INCLUDE_OBJECT
 | 
						|
---| 32 INCLUDE_PICKUP
 | 
						|
---| 64 INCLUDE_GLASS
 | 
						|
---| 128 INCLUDE_RIVER
 | 
						|
---| 256 INCLUDE_FOLIAGE
 | 
						|
---| 511 INCLUDE_ALL
 | 
						|
 | 
						|
---@param coords vector3
 | 
						|
---@param destination vector3
 | 
						|
---@param flags ShapetestFlags? Defaults to 511.
 | 
						|
---@param ignore ShapetestIgnore? Defaults to 4.
 | 
						|
---@return boolean hit
 | 
						|
---@return number entityHit
 | 
						|
---@return vector3 endCoords
 | 
						|
---@return vector3 surfaceNormal
 | 
						|
---@return number materialHash
 | 
						|
function lib.raycast.fromCoords(coords, destination, flags, ignore)
 | 
						|
    local handle = StartShapeTestLosProbe(coords.x, coords.y, coords.z, destination.x, destination.y,
 | 
						|
        destination.z, flags or 511, cache.ped, ignore or 4)
 | 
						|
 | 
						|
    while true do
 | 
						|
        Wait(0)
 | 
						|
        local retval, hit, endCoords, surfaceNormal, material, entityHit = GetShapeTestResultIncludingMaterial(handle)
 | 
						|
 | 
						|
        if retval ~= 1 then
 | 
						|
            return hit, entityHit, endCoords, surfaceNormal, material
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
local function getForwardVector()
 | 
						|
    local sin, cos = glm_sincos(glm_rad(GetFinalRenderedCamRot(2)))
 | 
						|
    return vec3(-sin.z * math_abs(cos.x), cos.z * math_abs(cos.x), sin.x)
 | 
						|
end
 | 
						|
 | 
						|
---@param flags ShapetestFlags? Defaults to 511.
 | 
						|
---@param ignore ShapetestIgnore? Defaults to 4.
 | 
						|
---@param distance number? Defaults to 10.
 | 
						|
function lib.raycast.fromCamera(flags, ignore, distance)
 | 
						|
    local coords = GetFinalRenderedCamCoord()
 | 
						|
    local destination = coords + getForwardVector() * (distance or 10)
 | 
						|
 | 
						|
    return lib.raycast.fromCoords(GetFinalRenderedCamCoord(), destination, flags, ignore)
 | 
						|
end
 | 
						|
 | 
						|
---@deprecated
 | 
						|
lib.raycast.cam = lib.raycast.fromCamera
 | 
						|
 | 
						|
return lib.raycast
 |