134 lines
5.3 KiB
Lua
134 lines
5.3 KiB
Lua
|
local ObjectList = require "data.object"
|
||
|
|
||
|
local function DrawEntityBoundingBox(entity, color)
|
||
|
local model = GetEntityModel(entity)
|
||
|
local min, max = GetModelDimensions(model)
|
||
|
local rightVector, forwardVector, upVector, position = GetEntityMatrix(entity)
|
||
|
|
||
|
-- Calculate size
|
||
|
local dim =
|
||
|
{
|
||
|
x = 0.5 * (max.x - min.x),
|
||
|
y = 0.5 * (max.y - min.y),
|
||
|
z = 0.5 * (max.z - min.z)
|
||
|
}
|
||
|
|
||
|
-- Calculate the eight bounding box edges
|
||
|
local edges = {}
|
||
|
edges[1] = position - dim.y * rightVector - dim.x * forwardVector - dim.z * upVector
|
||
|
edges[2] = edges[1] + 2 * dim.y * rightVector
|
||
|
edges[3] = edges[2] + 2 * dim.z * upVector
|
||
|
edges[4] = edges[1] + 2 * dim.z * upVector
|
||
|
edges[5] = position + dim.y * rightVector + dim.x * forwardVector + dim.z * upVector
|
||
|
edges[6] = edges[5] - 2 * dim.y * rightVector
|
||
|
edges[7] = edges[6] - 2 * dim.z * upVector
|
||
|
edges[8] = edges[5] - 2 * dim.z * upVector
|
||
|
|
||
|
-- Draw lines to connect the edges and create the bounding box
|
||
|
for i = 1, 4 do
|
||
|
local j = i % 4 + 1
|
||
|
DrawLine(edges[i].x, edges[i].y, edges[i].z, edges[j].x, edges[j].y, edges[j].z, color.r, color.g, color.b, color.a)
|
||
|
DrawLine(edges[i + 4].x, edges[i + 4].y, edges[i + 4].z, edges[j + 4].x, edges[j + 4].y, edges[j + 4].z, color.r, color.g, color.b, color.a)
|
||
|
DrawLine(edges[i].x, edges[i].y, edges[i].z, edges[i + 4].x, edges[i + 4].y, edges[i + 4].z, color.r, color.g, color.b, color.a)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function RotationToDirection(rotation)
|
||
|
local adjustedRotation =
|
||
|
{
|
||
|
x = (math.pi / 180) * rotation.x,
|
||
|
y = (math.pi / 180) * rotation.y,
|
||
|
z = (math.pi / 180) * rotation.z
|
||
|
}
|
||
|
local direction =
|
||
|
{
|
||
|
x = -math.sin(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)),
|
||
|
y = math.cos(adjustedRotation.z) * math.abs(math.cos(adjustedRotation.x)),
|
||
|
z = math.sin(adjustedRotation.x)
|
||
|
}
|
||
|
return direction
|
||
|
end
|
||
|
|
||
|
local function RayCastGamePlayCamera(distance)
|
||
|
local cameraRotation = GetGameplayCamRot()
|
||
|
local cameraCoord = GetGameplayCamCoord()
|
||
|
local direction = RotationToDirection(cameraRotation)
|
||
|
local destination =
|
||
|
{
|
||
|
x = cameraCoord.x + direction.x * distance,
|
||
|
y = cameraCoord.y + direction.y * distance,
|
||
|
z = cameraCoord.z + direction.z * distance
|
||
|
}
|
||
|
local a, b, c, d, e = GetShapeTestResult(StartShapeTestRay(cameraCoord.x, cameraCoord.y, cameraCoord.z, destination.x, destination.y, destination.z, -1, PlayerPedId(), 0))
|
||
|
return b, c, e
|
||
|
end
|
||
|
|
||
|
-- Toggle Delete Laser
|
||
|
local activeLaser = false
|
||
|
RegisterNetEvent('ps-adminmenu:client:ToggleLaser', function()
|
||
|
local x = 0.4
|
||
|
local y = 0.025
|
||
|
activeLaser = not activeLaser
|
||
|
CreateThread(function()
|
||
|
while true do
|
||
|
local wait = 7
|
||
|
if activeLaser then
|
||
|
local color = {r = 255, g = 255, b = 255, a = 200}
|
||
|
local position = GetEntityCoords(PlayerPedId())
|
||
|
local hit, coords, entity = RayCastGamePlayCamera(1000.0)
|
||
|
local objectData = {}
|
||
|
|
||
|
DisableControlAction(0, 200)
|
||
|
DisableControlAction(0, 26)
|
||
|
|
||
|
if hit and (IsEntityAVehicle(entity) or IsEntityAPed(entity) or IsEntityAnObject(entity)) then
|
||
|
local entityCoord = GetEntityCoords(entity)
|
||
|
local heading = GetEntityHeading(entity)
|
||
|
local model = GetEntityModel(entity)
|
||
|
local minimum, maximum = GetModelDimensions(model)
|
||
|
DrawEntityBoundingBox(entity, color)
|
||
|
DrawLine(position.x, position.y, position.z, coords.x, coords.y, coords.z, color.r, color.g, color.b, color.a)
|
||
|
|
||
|
objectData.hash = model
|
||
|
objectData.name = ObjectList[model]
|
||
|
objectData.coords = ("vec4(%s, %s, %s, %s)"):format(entityCoord.x, entityCoord.y, entityCoord.z, heading)
|
||
|
|
||
|
if IsControlJustReleased(0, 38) then
|
||
|
SetEntityAsMissionEntity(entity, true, true)
|
||
|
DeleteEntity(entity)
|
||
|
end
|
||
|
|
||
|
if IsDisabledControlJustReleased(0, 26) then
|
||
|
lib.setClipboard(json.encode(objectData, {indent = true}))
|
||
|
end
|
||
|
|
||
|
elseif coords.x ~= 0.0 and coords.y ~= 0.0 then
|
||
|
DrawLine(position.x, position.y, position.z, coords.x, coords.y, coords.z, color.r, color.g, color.b, color.a)
|
||
|
DrawMarker(28, coords.x, coords.y, coords.z, 0.0, 0.0, 0.0, 0.0, 180.0, 0.0, 0.1, 0.1, 0.1, color.r, color.g, color.b, color.a, false, true, 2, nil, nil, false)
|
||
|
end
|
||
|
|
||
|
if IsDisabledControlJustReleased(0, 200) then
|
||
|
activeLaser = not activeLaser
|
||
|
end
|
||
|
|
||
|
SendNUIMessage({
|
||
|
action = "showEntityInfo",
|
||
|
data = {
|
||
|
show = true,
|
||
|
hash = objectData.hash or "",
|
||
|
name = objectData.name or "",
|
||
|
}
|
||
|
})
|
||
|
else
|
||
|
local wait = 500
|
||
|
SendNUIMessage({
|
||
|
action = "showEntityInfo",
|
||
|
data = {
|
||
|
show = false,
|
||
|
}
|
||
|
})
|
||
|
end
|
||
|
Wait(wait)
|
||
|
end
|
||
|
end)
|
||
|
end)
|