452 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			452 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local FrozenEntities     = {}
 | 
						|
local EntityViewDistance = 10
 | 
						|
local EntityViewEnabled  = false
 | 
						|
local EntityFreeAim      = false
 | 
						|
local EntityPedView      = false
 | 
						|
local EntityObjectView   = false
 | 
						|
local EntityVehicleView  = false
 | 
						|
local FreeAimEntity      = nil
 | 
						|
 | 
						|
-- Configurable values
 | 
						|
local FreeAimInfoBoxX    = 0.60 -- X-axis (0.0 being left, 1.0 being right position of the screen)
 | 
						|
local FreeAimInfoBoxY    = 0.02 -- Y-axis (0.0 being up, 1.0 being down position of the screen)
 | 
						|
local useKph             = true -- True to display KPH or false to display MPH
 | 
						|
 | 
						|
local CanEntityBeUsed    = function(ped)
 | 
						|
    if ped == PlayerPedId() then
 | 
						|
        return false
 | 
						|
    end
 | 
						|
    return true
 | 
						|
end
 | 
						|
 | 
						|
local RoundFloat         = function(number, num)
 | 
						|
    return math.floor(number * math.pow(10, num) + 0.5) / math.pow(10, num)
 | 
						|
end
 | 
						|
 | 
						|
local RoundVector3       = function(vector, num)
 | 
						|
    return 'vector3(' .. RoundFloat(vector.x, num) .. ', ' .. RoundFloat(vector.y, num) .. ', ' .. RoundFloat(vector.z, num) .. ')'
 | 
						|
end
 | 
						|
 | 
						|
 | 
						|
local RelationshipTypes = { ['0'] = 'Companion', ['1'] = 'Respect', ['2'] = 'Like', ['3'] = 'Neutral', ['4'] = 'Dislike', ['5'] = 'Hate', ['255'] = 'Pedestrians' }
 | 
						|
local GetPedRelationshipType = function(value)
 | 
						|
    value = tostring(value)
 | 
						|
    return RelationshipTypes[value] or 'Unknown'
 | 
						|
end
 | 
						|
 | 
						|
local DrawTitle = function(text)
 | 
						|
    SetTextScale(0.50, 0.50)
 | 
						|
    SetTextFont(4)
 | 
						|
    SetTextDropshadow(1.0, 0, 0, 0, 255)
 | 
						|
    SetTextColour(255, 255, 255, 215)
 | 
						|
    SetTextJustification(0)
 | 
						|
    BeginTextCommandDisplayText('STRING')
 | 
						|
    AddTextComponentSubstringPlayerName(text)
 | 
						|
    EndTextCommandDisplayText(0.5, 0.02)
 | 
						|
end
 | 
						|
 | 
						|
local RotationToDirection = function(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 RayCastGamePlayCamera = function(distance)
 | 
						|
    -- Checks to see if the Gameplay Cam is Rendering or another is rendering (no clip functionality)
 | 
						|
    local currentRenderingCam = false
 | 
						|
    if not IsGameplayCamRendering() then
 | 
						|
        currentRenderingCam = GetRenderingCam()
 | 
						|
    end
 | 
						|
 | 
						|
    local cameraRotation = not currentRenderingCam and GetGameplayCamRot() or GetCamRot(currentRenderingCam, 2)
 | 
						|
    local cameraCoord = not currentRenderingCam and GetGameplayCamCoord() or GetCamCoord(currentRenderingCam)
 | 
						|
    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 _, b, c, _, e = GetShapeTestResult(StartShapeTestRay(cameraCoord.x, cameraCoord.y, cameraCoord.z, destination.x, destination.y, destination.z, -1, PlayerPedId(), 0))
 | 
						|
    return b, c, e
 | 
						|
end
 | 
						|
 | 
						|
local DrawEntityBoundingBox = function(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)
 | 
						|
    }
 | 
						|
 | 
						|
    local FUR = {
 | 
						|
        x = position.x + dim.y * rightVector.x + dim.x * forwardVector.x + dim.z * upVector.x,
 | 
						|
        y = position.y + dim.y * rightVector.y + dim.x * forwardVector.y + dim.z * upVector.y,
 | 
						|
        z = 0
 | 
						|
    }
 | 
						|
 | 
						|
    local _, FUR_z = GetGroundZFor_3dCoord(FUR.x, FUR.y, 1000.0, 0)
 | 
						|
    FUR.z = FUR_z
 | 
						|
    FUR.z = FUR.z + 2 * dim.z
 | 
						|
 | 
						|
    local BLL = {
 | 
						|
        x = position.x - dim.y * rightVector.x - dim.x * forwardVector.x - dim.z * upVector.x,
 | 
						|
        y = position.y - dim.y * rightVector.y - dim.x * forwardVector.y - dim.z * upVector.y,
 | 
						|
        z = 0
 | 
						|
    }
 | 
						|
    local _, BLL_z = GetGroundZFor_3dCoord(FUR.x, FUR.y, 1000.0, 0)
 | 
						|
    BLL.z = BLL_z
 | 
						|
 | 
						|
    -- DEBUG
 | 
						|
    local edge1 = BLL
 | 
						|
    local edge5 = FUR
 | 
						|
 | 
						|
    local edge2 = {
 | 
						|
        x = edge1.x + 2 * dim.y * rightVector.x,
 | 
						|
        y = edge1.y + 2 * dim.y * rightVector.y,
 | 
						|
        z = edge1.z + 2 * dim.y * rightVector.z
 | 
						|
    }
 | 
						|
 | 
						|
    local edge3 = {
 | 
						|
        x = edge2.x + 2 * dim.z * upVector.x,
 | 
						|
        y = edge2.y + 2 * dim.z * upVector.y,
 | 
						|
        z = edge2.z + 2 * dim.z * upVector.z
 | 
						|
    }
 | 
						|
 | 
						|
    local edge4 = {
 | 
						|
        x = edge1.x + 2 * dim.z * upVector.x,
 | 
						|
        y = edge1.y + 2 * dim.z * upVector.y,
 | 
						|
        z = edge1.z + 2 * dim.z * upVector.z
 | 
						|
    }
 | 
						|
 | 
						|
    local edge6 = {
 | 
						|
        x = edge5.x - 2 * dim.y * rightVector.x,
 | 
						|
        y = edge5.y - 2 * dim.y * rightVector.y,
 | 
						|
        z = edge5.z - 2 * dim.y * rightVector.z
 | 
						|
    }
 | 
						|
 | 
						|
    local edge7 = {
 | 
						|
        x = edge6.x - 2 * dim.z * upVector.x,
 | 
						|
        y = edge6.y - 2 * dim.z * upVector.y,
 | 
						|
        z = edge6.z - 2 * dim.z * upVector.z
 | 
						|
    }
 | 
						|
 | 
						|
    local edge8 = {
 | 
						|
        x = edge5.x - 2 * dim.z * upVector.x,
 | 
						|
        y = edge5.y - 2 * dim.z * upVector.y,
 | 
						|
        z = edge5.z - 2 * dim.z * upVector.z
 | 
						|
    }
 | 
						|
    color = (color == nil and { r = 255, g = 255, b = 255, a = 255 } or color)
 | 
						|
    DrawLine(edge1.x, edge1.y, edge1.z, edge2.x, edge2.y, edge2.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge1.x, edge1.y, edge1.z, edge4.x, edge4.y, edge4.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge2.x, edge2.y, edge2.z, edge3.x, edge3.y, edge3.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge3.x, edge3.y, edge3.z, edge4.x, edge4.y, edge4.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge5.x, edge5.y, edge5.z, edge6.x, edge6.y, edge6.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge5.x, edge5.y, edge5.z, edge8.x, edge8.y, edge8.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge6.x, edge6.y, edge6.z, edge7.x, edge7.y, edge7.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge7.x, edge7.y, edge7.z, edge8.x, edge8.y, edge8.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge1.x, edge1.y, edge1.z, edge7.x, edge7.y, edge7.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge2.x, edge2.y, edge2.z, edge8.x, edge8.y, edge8.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge3.x, edge3.y, edge3.z, edge5.x, edge5.y, edge5.z, color.r, color.g, color.b, color.a)
 | 
						|
    DrawLine(edge4.x, edge4.y, edge4.z, edge6.x, edge6.y, edge6.z, color.r, color.g, color.b, color.a)
 | 
						|
end
 | 
						|
 | 
						|
local GetEntityInfo = function(entity)
 | 
						|
    local playerCoords = GetEntityCoords(PlayerPedId())
 | 
						|
    local entityType   = GetEntityType(entity)
 | 
						|
    local entityHash   = GetEntityModel(entity)
 | 
						|
    local entityName   = Entities[entityHash] or Lang:t('info.obj_unknown')
 | 
						|
    local entityData   = { '~y~' .. Lang:t('info.entity_view_info'), '', Lang:t('info.model_hash') .. ' ~y~' .. entityHash, ' ', Lang:t('info.ent_id') .. ' ~y~' .. entity, Lang:t('info.obj_name') .. ' ~y~' .. entityName, Lang:t('info.net_id') .. ' ~y~' .. (NetworkGetEntityIsNetworked(entity) and NetworkGetNetworkIdFromEntity(entity) or Lang:t('info.net_id_not_registered')), Lang:t('info.ent_owner') .. ' ~y~' .. GetPlayerServerId(NetworkGetEntityOwner(entity)), ' ' }
 | 
						|
 | 
						|
    if entityType == 1 then
 | 
						|
        local pedRelationshipGroup = GetPedRelationshipGroupHash(entity)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.cur_health') .. ' ~y~' .. GetEntityHealth(entity)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.max_health') .. ' ~y~' .. GetPedMaxHealth(entity)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.armour') .. ' ~y~' .. GetPedArmour(entity)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.rel_group') .. ' ~y~' .. (Entities[pedRelationshipGroup] or Lang:t('info.rel_group_custom'))
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.rel_to_player') .. ' ~y~' .. GetPedRelationshipType(GetRelationshipBetweenPeds(entity, PlayerPedId()))
 | 
						|
    elseif entityType == 2 then
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.veh_rpm') .. ' ~y~' .. RoundFloat(GetVehicleCurrentRpm(entity), 2)
 | 
						|
        entityData[#entityData + 1] = (useKph and Lang:t('info.veh_speed_kph') or Lang:t('info.veh_speed_mph')) .. ' ~y~' .. RoundFloat((GetEntitySpeed(entity) * (useKph and 3.6 or 2.23694)), 0)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.veh_cur_gear') .. ' ~y~' .. GetVehicleCurrentGear(entity)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.veh_acceleration') .. ' ~y~' .. RoundFloat(GetVehicleAcceleration(entity), 2)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.body_health') .. ' ~y~' .. GetVehicleBodyHealth(entity)
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.eng_health') .. ' ~y~' .. GetVehicleEngineHealth(entity)
 | 
						|
    elseif entityType == 3 then
 | 
						|
        entityData[#entityData + 1] = Lang:t('info.cur_health') .. ' ~y~' .. GetEntityHealth(entity)
 | 
						|
    end
 | 
						|
    local entityCoords = GetEntityCoords(entity)
 | 
						|
 | 
						|
    entityData[#entityData + 1] = ' '
 | 
						|
    entityData[#entityData + 1] = Lang:t('info.dist_to_obj') .. ' ~y~' .. RoundFloat(#(playerCoords - entityCoords), 2)
 | 
						|
    entityData[#entityData + 1] = Lang:t('info.obj_heading') .. ' ~y~' .. RoundFloat(GetEntityHeading(entity), 2)
 | 
						|
    entityData[#entityData + 1] = Lang:t('info.obj_coords') .. ' ~y~' .. RoundVector3(entityCoords, 2)
 | 
						|
    entityData[#entityData + 1] = Lang:t('info.obj_rot') .. ' ~y~' .. RoundVector3(GetEntityRotation(entity), 2)
 | 
						|
    entityData[#entityData + 1] = Lang:t('info.obj_velocity') .. ' ~y~' .. RoundVector3(GetEntityVelocity(entity), 2)
 | 
						|
 | 
						|
    return entityData
 | 
						|
end
 | 
						|
 | 
						|
local DrawEntityViewText = function(entity)
 | 
						|
    local data            = GetEntityInfo(entity)
 | 
						|
    local count           = #data
 | 
						|
 | 
						|
    local posX            = FreeAimInfoBoxX
 | 
						|
    local posY            = FreeAimInfoBoxY
 | 
						|
    local titleSpacing    = 0.03
 | 
						|
    local textSpacing     = 0.022
 | 
						|
    local titeLeftMargin  = 0.05
 | 
						|
    local paddingTop      = 0.02
 | 
						|
    local paddingLeft     = 0.005
 | 
						|
    local rectWidth       = 0.18
 | 
						|
    local heightOfContent = (((count) * textSpacing) + titleSpacing) / count
 | 
						|
    local rectHeight      = ((count - 1) * heightOfContent) + paddingTop
 | 
						|
 | 
						|
    DrawRect(posX + (rectWidth / 2), posY + ((rectHeight / 2) - posY / 2), rectWidth, rectHeight, 11, 11, 11, 200)
 | 
						|
 | 
						|
    for k, v in ipairs(data) do
 | 
						|
        SetTextScale(0.35, 0.35)
 | 
						|
        SetTextFont(4)
 | 
						|
        SetTextDropshadow(1.0, 0, 0, 0, 255)
 | 
						|
        SetTextEdge(1, 0, 0, 0, 255)
 | 
						|
        SetTextColour(255, 255, 255, 215)
 | 
						|
        SetTextJustification(1)
 | 
						|
        BeginTextCommandDisplayText('STRING')
 | 
						|
        AddTextComponentSubstringPlayerName(v)
 | 
						|
        if k == 1 then
 | 
						|
            SetTextScale(0.50, 0.50)
 | 
						|
            EndTextCommandDisplayText(posX + titeLeftMargin, posY)
 | 
						|
            posY = posY + titleSpacing
 | 
						|
        else
 | 
						|
            SetTextScale(0.35, 0.35)
 | 
						|
            EndTextCommandDisplayText(posX + paddingLeft, posY)
 | 
						|
            posY = posY + textSpacing
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
local DrawEntityViewTextInWorld = function(entity, coords)
 | 
						|
    local onScreen, posX, posY = World3dToScreen2d(coords.x, coords.y, coords.z)
 | 
						|
    if onScreen then
 | 
						|
        local data        = GetEntityInfo(entity)
 | 
						|
        local count       = #data
 | 
						|
        local textOffsetY = 0.015
 | 
						|
        local leftPadding = 0.005
 | 
						|
        local topPadding  = 0.01
 | 
						|
        local botPadding  = 0.02
 | 
						|
        local offSetCount = (((count - 2) * textOffsetY)) / count
 | 
						|
        local rectWidth   = 0.12
 | 
						|
        local rectHeight  = ((count) * offSetCount) + botPadding
 | 
						|
 | 
						|
        DrawRect(posX, posY, rectWidth, rectHeight, 11, 11, 11, 200)
 | 
						|
 | 
						|
        for k, v in ipairs(data) do
 | 
						|
            if k ~= 1 and k ~= 2 then
 | 
						|
                SetTextScale(0.25, 0.25)
 | 
						|
                SetTextFont(4)
 | 
						|
                SetTextDropshadow(1.0, 0, 0, 0, 255)
 | 
						|
                SetTextEdge(1, 0, 0, 0, 255)
 | 
						|
                SetTextColour(255, 255, 255, 215)
 | 
						|
                SetTextJustification(1)
 | 
						|
                BeginTextCommandDisplayText('STRING')
 | 
						|
                AddTextComponentSubstringPlayerName(v)
 | 
						|
                EndTextCommandDisplayText(posX - rectWidth / 2 + leftPadding, posY - rectHeight / 2 + topPadding)
 | 
						|
                posY = posY + textOffsetY
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
local GetVehicle = function(playerCoords)
 | 
						|
    local handle, vehicle = FindFirstVehicle()
 | 
						|
    local success
 | 
						|
    local rveh = nil
 | 
						|
    repeat
 | 
						|
        if vehicle ~= FreeAimEntity then
 | 
						|
            local pos = GetEntityCoords(vehicle)
 | 
						|
            local distance = #(playerCoords - pos)
 | 
						|
            if distance < EntityViewDistance and distance > 5.0 then
 | 
						|
                DrawEntityBoundingBox(vehicle)
 | 
						|
            elseif distance < 5.0 then
 | 
						|
                rveh = vehicle
 | 
						|
                DrawEntityViewTextInWorld(vehicle, pos)
 | 
						|
            end
 | 
						|
        end
 | 
						|
        success, vehicle = FindNextVehicle(handle)
 | 
						|
    until not success
 | 
						|
    EndFindVehicle(handle)
 | 
						|
    return rveh
 | 
						|
end
 | 
						|
 | 
						|
local GetObject = function(playerCoords)
 | 
						|
    local handle, object = FindFirstObject()
 | 
						|
    local success
 | 
						|
    local robject = nil
 | 
						|
    repeat
 | 
						|
        if object ~= FreeAimEntity then
 | 
						|
            local pos = GetEntityCoords(object)
 | 
						|
            local distance = #(playerCoords - pos)
 | 
						|
            if distance < EntityViewDistance and distance > 5.0 then
 | 
						|
                DrawEntityBoundingBox(object)
 | 
						|
            elseif distance < 5.0 then
 | 
						|
                robject = object
 | 
						|
                DrawEntityViewTextInWorld(object, pos)
 | 
						|
            end
 | 
						|
        end
 | 
						|
        success, object = FindNextObject(handle)
 | 
						|
    until not success
 | 
						|
    EndFindObject(handle)
 | 
						|
    return robject
 | 
						|
end
 | 
						|
 | 
						|
local GetNPC = function(playerCoords)
 | 
						|
    local handle, ped = FindFirstPed()
 | 
						|
    local success
 | 
						|
    local rped = nil
 | 
						|
    repeat
 | 
						|
        if ped ~= FreeAimEntity then
 | 
						|
            local pos = GetEntityCoords(ped)
 | 
						|
            local distance = #(playerCoords - pos)
 | 
						|
            if CanEntityBeUsed(ped) then
 | 
						|
                if distance < EntityViewDistance and distance > 5.0 then
 | 
						|
                    DrawEntityBoundingBox(ped)
 | 
						|
                elseif distance < 5.0 then
 | 
						|
                    rped = ped
 | 
						|
                    DrawEntityViewTextInWorld(ped, pos)
 | 
						|
                end
 | 
						|
            end
 | 
						|
        end
 | 
						|
        success, ped = FindNextPed(handle)
 | 
						|
    until not success
 | 
						|
    EndFindPed(handle)
 | 
						|
    return rped
 | 
						|
end
 | 
						|
 | 
						|
ToggleEntityFreeView = function()
 | 
						|
    EntityFreeAim = not EntityFreeAim
 | 
						|
    if EntityFreeAim and not EntityViewEnabled then
 | 
						|
        RunEntityViewThread()
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
ToggleEntityObjectView = function()
 | 
						|
    EntityObjectView = not EntityObjectView
 | 
						|
    if EntityObjectView and not EntityViewEnabled then
 | 
						|
        RunEntityViewThread()
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
ToggleEntityVehicleView = function()
 | 
						|
    EntityVehicleView = not EntityVehicleView
 | 
						|
    if EntityVehicleView and not EntityViewEnabled then
 | 
						|
        RunEntityViewThread()
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
ToggleEntityPedView = function()
 | 
						|
    EntityPedView = not EntityPedView
 | 
						|
    if EntityPedView and not EntityViewEnabled then
 | 
						|
        RunEntityViewThread()
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
GetCurrentEntityViewDistance = function()
 | 
						|
    return EntityViewDistance / 5
 | 
						|
end
 | 
						|
 | 
						|
SetEntityViewDistance = function(data)
 | 
						|
    EntityViewDistance = tonumber(data)
 | 
						|
end
 | 
						|
 | 
						|
GetFreeAimEntity = function()
 | 
						|
    return FreeAimEntity
 | 
						|
end
 | 
						|
 | 
						|
RunEntityViewThread = function()
 | 
						|
    EntityViewEnabled = true
 | 
						|
    Citizen.CreateThread(function()
 | 
						|
        while EntityViewEnabled do
 | 
						|
            Citizen.Wait(0)
 | 
						|
            local playerPed    = PlayerPedId()
 | 
						|
            local playerCoords = GetEntityCoords(playerPed)
 | 
						|
 | 
						|
            if EntityPedView then
 | 
						|
                GetNPC(playerCoords)
 | 
						|
            end
 | 
						|
 | 
						|
            if EntityObjectView then
 | 
						|
                GetObject(playerCoords)
 | 
						|
            end
 | 
						|
 | 
						|
            if EntityVehicleView then
 | 
						|
                GetVehicle(playerCoords)
 | 
						|
            end
 | 
						|
 | 
						|
            if EntityFreeAim then
 | 
						|
                DrawTitle('~y~' .. Lang:t('info.entity_view_title') .. '~w~\n[~y~E~w~] - ' .. Lang:t('info.entity_freeaim_delete') .. ' ~w~[~y~G~w~] - ' .. Lang:t('info.entity_freeaim_freeze') .. ' ~w~[~y~H~w~] - ' .. Lang:t('info.entity_freeaim_coords'))
 | 
						|
                local color = { r = 255, g = 255, b = 255, a = 200 }
 | 
						|
                local position = GetEntityCoords(playerPed)
 | 
						|
                local hit, coords, entity = RayCastGamePlayCamera(1000.0)
 | 
						|
                -- If entity is found then verify entity
 | 
						|
                if IsControlJustReleased(0, 74) then -- Copy Coords
 | 
						|
                    local x = QBCore.Shared.Round(coords.x, 2)
 | 
						|
                    local y = QBCore.Shared.Round(coords.y, 2)
 | 
						|
                    local z = QBCore.Shared.Round(coords.z, 2)
 | 
						|
                    SendNUIMessage({
 | 
						|
                        string = string.format('vector3(%s, %s, %s)', x, y, z)
 | 
						|
                    })
 | 
						|
                    QBCore.Functions.Notify(Lang:t('info.coords_copied'), 'success')
 | 
						|
                end
 | 
						|
                if hit and (IsEntityAVehicle(entity) or IsEntityAPed(entity) or IsEntityAnObject(entity)) then
 | 
						|
                    color = { r = 0, g = 255, b = 0, a = 200 }
 | 
						|
                    FreeAimEntity = entity
 | 
						|
                    DrawEntityBoundingBox(entity, color)
 | 
						|
                    DrawEntityViewText(entity)
 | 
						|
 | 
						|
                    if IsControlJustReleased(0, 47) then -- Freeze entities
 | 
						|
                        if FrozenEntities[entity] then
 | 
						|
                            FrozenEntities[entity] = not FrozenEntities[entity]
 | 
						|
                        else
 | 
						|
                            FrozenEntities[entity] = true
 | 
						|
                        end
 | 
						|
 | 
						|
                        FreezeEntityPosition(entity, FrozenEntities[entity])
 | 
						|
                        QBCore.Functions.Notify(Lang:t('info.you_have') .. (FrozenEntities[entity] and Lang:t('info.entity_frozen') or Lang:t('info.entity_unfrozen')) .. Lang:t('info.freeaim_entity'), (FrozenEntities[entity] and 'success' or 'error'))
 | 
						|
                    end
 | 
						|
 | 
						|
                    if IsControlJustReleased(0, 38) then -- Delete entity
 | 
						|
                        -- Set as missionEntity so the object can be remove (Even map objects)
 | 
						|
                        SetEntityAsMissionEntity(entity, true, true)
 | 
						|
                        DeleteEntity(entity)
 | 
						|
 | 
						|
                        if not DoesEntityExist(entity) then
 | 
						|
                            QBCore.Functions.Notify(Lang:t('info.entity_del'), 'success')
 | 
						|
                        else
 | 
						|
                            QBCore.Functions.Notify(Lang:t('info.entity_del_error'), 'error')
 | 
						|
                        end
 | 
						|
                    end
 | 
						|
                else
 | 
						|
                    FreeAimEntity = nil
 | 
						|
                end
 | 
						|
 | 
						|
                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, false)
 | 
						|
            end
 | 
						|
 | 
						|
            if EntityPedView == false and EntityObjectView == false and EntityVehicleView == false and EntityFreeAim == false then
 | 
						|
                EntityViewEnabled = false
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end)
 | 
						|
end
 |