290 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			290 lines
		
	
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local IsNoClipping      = false
 | 
						|
local PlayerPed         = nil
 | 
						|
local NoClipEntity      = nil
 | 
						|
local Camera            = nil
 | 
						|
local NoClipAlpha       = nil
 | 
						|
local PlayerIsInVehicle = false
 | 
						|
local ResourceName      = GetCurrentResourceName()
 | 
						|
 | 
						|
local MinY, MaxY        = -89.0, 89.0
 | 
						|
 | 
						|
--[[
 | 
						|
        Configurable values are commented.
 | 
						|
]]
 | 
						|
 | 
						|
-- Perspective values
 | 
						|
local PedFirstPersonNoClip  = true  -- No Clip in first person when not in a vehicle
 | 
						|
local VehFirstPersonNoClip  = false -- No Clip in first person when in a vehicle
 | 
						|
local ESCEnable             = false -- Access Map during NoClip
 | 
						|
 | 
						|
-- Speed settings
 | 
						|
local Speed                 = 1    -- Default: 1
 | 
						|
local MaxSpeed              = 16.0 -- Default: 16.0
 | 
						|
 | 
						|
-- Key bindings
 | 
						|
local MOVE_FORWARDS         = 32  -- Default: W
 | 
						|
local MOVE_BACKWARDS        = 33  -- Default: S
 | 
						|
local MOVE_LEFT             = 34  -- Default: A
 | 
						|
local MOVE_RIGHT            = 35  -- Default: D
 | 
						|
local MOVE_UP               = 44  -- Default: Q
 | 
						|
local MOVE_DOWN             = 46  -- Default: E
 | 
						|
 | 
						|
local SPEED_DECREASE        = 14  -- Default: Mouse wheel down
 | 
						|
local SPEED_INCREASE        = 15  -- Default: Mouse wheel up
 | 
						|
local SPEED_RESET           = 348 -- Default: Mouse wheel click
 | 
						|
local SPEED_SLOW_MODIFIER   = 36  -- Default: Left Control
 | 
						|
local SPEED_FAST_MODIFIER   = 21  -- Default: Left Shift
 | 
						|
local SPEED_FASTER_MODIFIER = 19  -- Default: Left Alt
 | 
						|
 | 
						|
 | 
						|
local DisabledControls = function()
 | 
						|
    HudWeaponWheelIgnoreSelection()
 | 
						|
    DisableAllControlActions(0)
 | 
						|
    DisableAllControlActions(1)
 | 
						|
    DisableAllControlActions(2)
 | 
						|
    EnableControlAction(0, 220, true)
 | 
						|
    EnableControlAction(0, 221, true)
 | 
						|
    EnableControlAction(0, 245, true)
 | 
						|
    if ESCEnable then
 | 
						|
        EnableControlAction(0, 200, true)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
local IsControlAlwaysPressed = function(inputGroup, control)
 | 
						|
    return IsControlPressed(inputGroup, control) or IsDisabledControlPressed(inputGroup, control)
 | 
						|
end
 | 
						|
 | 
						|
local IsPedDrivingVehicle = function(ped, veh)
 | 
						|
    return ped == GetPedInVehicleSeat(veh, -1)
 | 
						|
end
 | 
						|
 | 
						|
local SetupCam = function()
 | 
						|
    local entityRot = GetEntityRotation(NoClipEntity)
 | 
						|
    Camera = CreateCameraWithParams('DEFAULT_SCRIPTED_CAMERA', GetEntityCoords(NoClipEntity), vector3(0.0, 0.0, entityRot.z), 75.0)
 | 
						|
    SetCamActive(Camera, true)
 | 
						|
    RenderScriptCams(true, true, 1000, false, false)
 | 
						|
 | 
						|
    if PlayerIsInVehicle == 1 then
 | 
						|
        AttachCamToEntity(Camera, NoClipEntity, 0.0, VehFirstPersonNoClip == true and 0.5 or -4.5, VehFirstPersonNoClip == true and 1.0 or 2.0, true)
 | 
						|
    else
 | 
						|
        AttachCamToEntity(Camera, NoClipEntity, 0.0, PedFirstPersonNoClip == true and 0.0 or -2.0, PedFirstPersonNoClip == true and 1.0 or 0.5, true)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
local DestroyCamera = function()
 | 
						|
    SetGameplayCamRelativeHeading(0)
 | 
						|
    RenderScriptCams(false, true, 1000, true, true)
 | 
						|
    DetachEntity(NoClipEntity, true, true)
 | 
						|
    SetCamActive(Camera, false)
 | 
						|
    DestroyCam(Camera, true)
 | 
						|
end
 | 
						|
 | 
						|
local GetGroundCoords = function(coords)
 | 
						|
    local rayCast           = StartShapeTestRay(coords.x, coords.y, coords.z, coords.x, coords.y, -10000.0, 1, 0)
 | 
						|
    local _, hit, hitCoords = GetShapeTestResult(rayCast)
 | 
						|
    return (hit == 1 and hitCoords) or coords
 | 
						|
end
 | 
						|
 | 
						|
local CheckInputRotation = function()
 | 
						|
    local rightAxisX = GetControlNormal(0, 220)
 | 
						|
    local rightAxisY = GetControlNormal(0, 221)
 | 
						|
 | 
						|
    local rotation = GetCamRot(Camera, 2)
 | 
						|
 | 
						|
    local yValue = rightAxisY * -5
 | 
						|
    local newX
 | 
						|
    local newZ = rotation.z + (rightAxisX * -10)
 | 
						|
    if (rotation.x + yValue > MinY) and (rotation.x + yValue < MaxY) then
 | 
						|
        newX = rotation.x + yValue
 | 
						|
    end
 | 
						|
    if newX ~= nil and newZ ~= nil then
 | 
						|
        SetCamRot(Camera, vector3(newX, rotation.y, newZ), 2)
 | 
						|
    end
 | 
						|
 | 
						|
    SetEntityHeading(NoClipEntity, math.max(0, (rotation.z % 360)))
 | 
						|
end
 | 
						|
 | 
						|
RunNoClipThread = function()
 | 
						|
    Citizen.CreateThread(function()
 | 
						|
        while IsNoClipping do
 | 
						|
            Citizen.Wait(0)
 | 
						|
            CheckInputRotation()
 | 
						|
            DisabledControls()
 | 
						|
 | 
						|
            if IsControlAlwaysPressed(2, SPEED_DECREASE) then
 | 
						|
                Speed = Speed - 0.5
 | 
						|
                if Speed < 0.5 then
 | 
						|
                    Speed = 0.5
 | 
						|
                end
 | 
						|
            elseif IsControlAlwaysPressed(2, SPEED_INCREASE) then
 | 
						|
                Speed = Speed + 0.5
 | 
						|
                if Speed > MaxSpeed then
 | 
						|
                    Speed = MaxSpeed
 | 
						|
                end
 | 
						|
            elseif IsDisabledControlJustReleased(0, SPEED_RESET) then
 | 
						|
                Speed = 1
 | 
						|
            end
 | 
						|
 | 
						|
            local multi = 1.0
 | 
						|
            if IsControlAlwaysPressed(0, SPEED_FAST_MODIFIER) then
 | 
						|
                multi = 2
 | 
						|
            elseif IsControlAlwaysPressed(0, SPEED_FASTER_MODIFIER) then
 | 
						|
                multi = 4
 | 
						|
            elseif IsControlAlwaysPressed(0, SPEED_SLOW_MODIFIER) then
 | 
						|
                multi = 0.25
 | 
						|
            end
 | 
						|
 | 
						|
            if IsControlAlwaysPressed(0, MOVE_FORWARDS) then
 | 
						|
                local pitch = GetCamRot(Camera, 0)
 | 
						|
 | 
						|
                if pitch.x >= 0 then
 | 
						|
                    SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, 0.0, 0.5 * (Speed * multi), (pitch.x * ((Speed / 2) * multi)) / 89))
 | 
						|
                else
 | 
						|
                    SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, 0.0, 0.5 * (Speed * multi), -1 * ((math.abs(pitch.x) * ((Speed / 2) * multi)) / 89)))
 | 
						|
                end
 | 
						|
            elseif IsControlAlwaysPressed(0, MOVE_BACKWARDS) then
 | 
						|
                local pitch = GetCamRot(Camera, 2)
 | 
						|
 | 
						|
                if pitch.x >= 0 then
 | 
						|
                    SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, 0.0, -0.5 * (Speed * multi), -1 * (pitch.x * ((Speed / 2) * multi)) / 89))
 | 
						|
                else
 | 
						|
                    SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, 0.0, -0.5 * (Speed * multi), ((math.abs(pitch.x) * ((Speed / 2) * multi)) / 89)))
 | 
						|
                end
 | 
						|
            end
 | 
						|
 | 
						|
            if IsControlAlwaysPressed(0, MOVE_LEFT) then
 | 
						|
                SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, -0.5 * (Speed * multi), 0.0, 0.0))
 | 
						|
            elseif IsControlAlwaysPressed(0, MOVE_RIGHT) then
 | 
						|
                SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, 0.5 * (Speed * multi), 0.0, 0.0))
 | 
						|
            end
 | 
						|
 | 
						|
            if IsControlAlwaysPressed(0, MOVE_UP) then
 | 
						|
                SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, 0.0, 0.0, 0.5 * (Speed * multi)))
 | 
						|
            elseif IsControlAlwaysPressed(0, MOVE_DOWN) then
 | 
						|
                SetEntityCoordsNoOffset(NoClipEntity, GetOffsetFromEntityInWorldCoords(NoClipEntity, 0.0, 0.0, -0.5 * (Speed * multi)))
 | 
						|
            end
 | 
						|
 | 
						|
            local coords = GetEntityCoords(NoClipEntity)
 | 
						|
 | 
						|
            RequestCollisionAtCoord(coords.x, coords.y, coords.z)
 | 
						|
 | 
						|
            FreezeEntityPosition(NoClipEntity, true)
 | 
						|
            SetEntityCollision(NoClipEntity, false, false)
 | 
						|
            SetEntityVisible(NoClipEntity, false, false)
 | 
						|
            SetEntityInvincible(NoClipEntity, true)
 | 
						|
            SetLocalPlayerVisibleLocally(true)
 | 
						|
            SetEntityAlpha(NoClipEntity, NoClipAlpha, false)
 | 
						|
            if PlayerIsInVehicle == 1 then
 | 
						|
                SetEntityAlpha(PlayerPed, NoClipAlpha, false)
 | 
						|
            end
 | 
						|
            SetEveryoneIgnorePlayer(PlayerPed, true)
 | 
						|
            SetPoliceIgnorePlayer(PlayerPed, true)
 | 
						|
        end
 | 
						|
        StopNoClip()
 | 
						|
    end)
 | 
						|
end
 | 
						|
 | 
						|
StopNoClip = function()
 | 
						|
    FreezeEntityPosition(NoClipEntity, false)
 | 
						|
    SetEntityCollision(NoClipEntity, true, true)
 | 
						|
    SetEntityVisible(NoClipEntity, true, false)
 | 
						|
    SetLocalPlayerVisibleLocally(true)
 | 
						|
    ResetEntityAlpha(NoClipEntity)
 | 
						|
    ResetEntityAlpha(PlayerPed)
 | 
						|
    SetEveryoneIgnorePlayer(PlayerPed, false)
 | 
						|
    SetPoliceIgnorePlayer(PlayerPed, false)
 | 
						|
    ResetEntityAlpha(NoClipEntity)
 | 
						|
    SetPoliceIgnorePlayer(PlayerPed, true)
 | 
						|
 | 
						|
    if GetVehiclePedIsIn(PlayerPed, false) ~= 0 then
 | 
						|
        while (not IsVehicleOnAllWheels(NoClipEntity)) and not IsNoClipping do
 | 
						|
            Wait(0)
 | 
						|
        end
 | 
						|
        while not IsNoClipping do
 | 
						|
            Wait(0)
 | 
						|
            if IsVehicleOnAllWheels(NoClipEntity) then
 | 
						|
                return SetEntityInvincible(NoClipEntity, false)
 | 
						|
            end
 | 
						|
        end
 | 
						|
    else
 | 
						|
        if (IsPedFalling(NoClipEntity) and math.abs(1 - GetEntityHeightAboveGround(NoClipEntity)) > 1.00) then
 | 
						|
            while (IsPedStopped(NoClipEntity) or not IsPedFalling(NoClipEntity)) and not IsNoClipping do
 | 
						|
                Wait(0)
 | 
						|
            end
 | 
						|
        end
 | 
						|
        while not IsNoClipping do
 | 
						|
            Wait(0)
 | 
						|
            if (not IsPedFalling(NoClipEntity)) and (not IsPedRagdoll(NoClipEntity)) then
 | 
						|
                return SetEntityInvincible(NoClipEntity, false)
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
ToggleNoClip = function(state)
 | 
						|
    IsNoClipping      = state or not IsNoClipping
 | 
						|
    PlayerPed         = PlayerPedId()
 | 
						|
    PlayerIsInVehicle = IsPedInAnyVehicle(PlayerPed, false)
 | 
						|
    if PlayerIsInVehicle ~= 0 and IsPedDrivingVehicle(PlayerPed, GetVehiclePedIsIn(PlayerPed, false)) then
 | 
						|
        NoClipEntity = GetVehiclePedIsIn(PlayerPed, false)
 | 
						|
        SetVehicleEngineOn(NoClipEntity, not IsNoClipping, true, IsNoClipping)
 | 
						|
        NoClipAlpha = PedFirstPersonNoClip == true and 0 or 51
 | 
						|
    else
 | 
						|
        NoClipEntity = PlayerPed
 | 
						|
        NoClipAlpha = VehFirstPersonNoClip == true and 0 or 51
 | 
						|
    end
 | 
						|
 | 
						|
    if IsNoClipping then
 | 
						|
        FreezeEntityPosition(PlayerPed)
 | 
						|
        SetupCam()
 | 
						|
        PlaySoundFromEntity(-1, 'SELECT', PlayerPed, 'HUD_LIQUOR_STORE_SOUNDSET', 0, 0)
 | 
						|
 | 
						|
        if not PlayerIsInVehicle then
 | 
						|
            ClearPedTasksImmediately(PlayerPed)
 | 
						|
            if PedFirstPersonNoClip then
 | 
						|
                Citizen.Wait(1000) -- Wait for the cinematic effect of the camera transitioning into first person
 | 
						|
            end
 | 
						|
        else
 | 
						|
            if VehFirstPersonNoClip then
 | 
						|
                Citizen.Wait(1000) -- Wait for the cinematic effect of the camera transitioning into first person
 | 
						|
            end
 | 
						|
        end
 | 
						|
    else
 | 
						|
        local groundCoords = GetGroundCoords(GetEntityCoords(NoClipEntity))
 | 
						|
        SetEntityCoords(NoClipEntity, groundCoords.x, groundCoords.y, groundCoords.z)
 | 
						|
        Citizen.Wait(50)
 | 
						|
        DestroyCamera()
 | 
						|
        PlaySoundFromEntity(-1, 'CANCEL', PlayerPed, 'HUD_LIQUOR_STORE_SOUNDSET', 0, 0)
 | 
						|
    end
 | 
						|
 | 
						|
    QBCore.Functions.Notify(IsNoClipping and Lang:t('success.noclip_enabled') or Lang:t('success.noclip_disabled'))
 | 
						|
    SetUserRadioControlEnabled(not IsNoClipping)
 | 
						|
 | 
						|
    if IsNoClipping then
 | 
						|
        RunNoClipThread()
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent('qb-admin:client:ToggleNoClip', function()
 | 
						|
    QBCore.Functions.TriggerCallback('qb-admin:isAdmin', function(isAdmin)
 | 
						|
        if not isAdmin then return end
 | 
						|
        ToggleNoClip(not IsNoClipping)
 | 
						|
    end)
 | 
						|
end)
 | 
						|
 | 
						|
AddEventHandler('onResourceStop', function(resourceName)
 | 
						|
    if resourceName == ResourceName then
 | 
						|
        FreezeEntityPosition(NoClipEntity, false)
 | 
						|
        FreezeEntityPosition(PlayerPed, false)
 | 
						|
        SetEntityCollision(NoClipEntity, true, true)
 | 
						|
        SetEntityVisible(NoClipEntity, true, false)
 | 
						|
        SetLocalPlayerVisibleLocally(true)
 | 
						|
        ResetEntityAlpha(NoClipEntity)
 | 
						|
        ResetEntityAlpha(PlayerPed)
 | 
						|
        SetEveryoneIgnorePlayer(PlayerPed, false)
 | 
						|
        SetPoliceIgnorePlayer(PlayerPed, false)
 | 
						|
        ResetEntityAlpha(NoClipEntity)
 | 
						|
        SetPoliceIgnorePlayer(PlayerPed, true)
 | 
						|
        SetEntityInvincible(NoClipEntity, false)
 | 
						|
    end
 | 
						|
end)
 |