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)
 | 
