Main/resources/[qb]/qb-adminmenu/client/noclip.lua
2025-06-07 08:51:21 +02:00

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)