forked from Simnation/Main
53 lines
No EOL
1.8 KiB
Lua
53 lines
No EOL
1.8 KiB
Lua
Raycast = {}
|
|
|
|
--Rework of oxs Raycast system
|
|
function Raycast.GetForwardVector(rotation)
|
|
local camRot = rotation or GetFinalRenderedCamRot(2)
|
|
|
|
-- Convert each component to radians
|
|
local rx = math.rad(camRot.x)
|
|
local ry = math.rad(camRot.y)
|
|
local rz = math.rad(camRot.z)
|
|
|
|
-- Calculate sin and cos for each axis
|
|
local sx = math.sin(rx)
|
|
local cx = math.cos(rx)
|
|
local sy = math.sin(ry)
|
|
local cy = math.cos(ry)
|
|
local sz = math.sin(rz)
|
|
local cz = math.cos(rz)
|
|
|
|
-- Create forward vector components
|
|
local x = -sz * math.abs(cx)
|
|
local y = cz * math.abs(cx)
|
|
local z = sx
|
|
|
|
return vector3(x, y, z)
|
|
end
|
|
|
|
function Raycast.ToCoords(startCoords, endCoords, flag, ignore)
|
|
local probe = StartShapeTestLosProbe(startCoords.x, startCoords.y, startCoords.z, endCoords.x, endCoords.y, endCoords.z, flag or 511, PlayerPedId(), ignore or 4)
|
|
local retval, entity, finalCoords, normals, material = 1, nil, nil, nil, nil
|
|
|
|
local timeout = 500
|
|
while retval == 1 and timeout > 0 do
|
|
retval, entity, finalCoords, normals, material = GetShapeTestResultIncludingMaterial(probe)
|
|
timeout = timeout - 1
|
|
Wait(0)
|
|
end
|
|
return retval, entity, finalCoords, normals, material
|
|
end
|
|
|
|
function Raycast.FromCamera(flags, ignore, distance)
|
|
local coords = GetFinalRenderedCamCoord()
|
|
distance = distance or 10
|
|
local destination = coords + Raycast.GetForwardVector() * distance
|
|
local retval, entity, finalCoords, normals, material = Raycast.ToCoords(coords, destination, flags, ignore)
|
|
if retval ~= 1 then
|
|
local newDest = destination - vector3(0, 0, 10)
|
|
return Raycast.ToCoords(destination, newDest, flags, ignore)
|
|
end
|
|
return retval, entity, finalCoords, normals, material
|
|
end
|
|
|
|
return Raycast |