157 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
lib.locale()
 | 
						|
 | 
						|
local _registerCommand = RegisterCommand
 | 
						|
 | 
						|
---@param commandName string
 | 
						|
---@param callback fun(source, args, raw)
 | 
						|
---@param restricted boolean?
 | 
						|
function RegisterCommand(commandName, callback, restricted)
 | 
						|
	_registerCommand(commandName, function(_, args, raw)
 | 
						|
        CreateThread(function()
 | 
						|
            if not restricted or lib.callback.await('ox_lib:checkPlayerAce', 100, ('command.%s'):format(commandName)) then
 | 
						|
                lib.notify({ type = 'success', description = locale('success') })
 | 
						|
                return callback(args, raw)
 | 
						|
            end
 | 
						|
 | 
						|
            lib.notify({ type = 'error', description = locale('no_permission') })
 | 
						|
        end)
 | 
						|
	end)
 | 
						|
end
 | 
						|
 | 
						|
local function freezePlayer(state, vehicle)
 | 
						|
    local playerId, ped = cache.playerId, cache.ped
 | 
						|
    vehicle = vehicle and cache.vehicle
 | 
						|
 | 
						|
    SetPlayerInvincible(playerId, state)
 | 
						|
    FreezeEntityPosition(ped, state)
 | 
						|
    SetEntityCollision(ped, not state, true)
 | 
						|
 | 
						|
    if vehicle then
 | 
						|
        if not state then
 | 
						|
            SetVehicleOnGroundProperly(vehicle)
 | 
						|
        end
 | 
						|
 | 
						|
        FreezeEntityPosition(vehicle, state)
 | 
						|
        SetEntityCollision(vehicle, not state, true)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent('ox_commands:freeze', freezePlayer)
 | 
						|
 | 
						|
local function teleport(vehicle, x, y, z)
 | 
						|
    if vehicle then
 | 
						|
        return SetPedCoordsKeepVehicle(cache.ped, x, y, z)
 | 
						|
    end
 | 
						|
 | 
						|
    SetEntityCoords(cache.ped, x, y, z, false, false, false, false)
 | 
						|
end
 | 
						|
 | 
						|
local lastCoords
 | 
						|
 | 
						|
RegisterCommand('goback', function()
 | 
						|
    if lastCoords then
 | 
						|
        local currentCoords = GetEntityCoords(cache.ped)
 | 
						|
        teleport(cache.vehicle, lastCoords.x, lastCoords.y, lastCoords.z)
 | 
						|
        lastCoords = currentCoords
 | 
						|
    end
 | 
						|
end, true)
 | 
						|
 | 
						|
RegisterCommand('tpm', function()
 | 
						|
	local marker = GetFirstBlipInfoId(8)
 | 
						|
 | 
						|
    if marker ~= 0 then
 | 
						|
        local coords = GetBlipInfoIdCoord(marker)
 | 
						|
 | 
						|
        DoScreenFadeOut(100)
 | 
						|
        Wait(100)
 | 
						|
 | 
						|
        local vehicle = cache.seat == -1 and cache.vehicle
 | 
						|
        lastCoords = GetEntityCoords(cache.ped)
 | 
						|
 | 
						|
        freezePlayer(true, vehicle)
 | 
						|
 | 
						|
        local z = GetHeightmapBottomZForPosition(coords.x, coords.y)
 | 
						|
        local inc = Config.TeleportIncrement + 0.0
 | 
						|
 | 
						|
        while z < 800.0 do
 | 
						|
            local found, groundZ = GetGroundZFor_3dCoord(coords.x, coords.y, z, true)
 | 
						|
            local int = GetInteriorAtCoords(coords.x, coords.y, z)
 | 
						|
 | 
						|
            if found or int ~= 0 then
 | 
						|
                if int ~= 0 then
 | 
						|
                    local _, _, z = GetInteriorPosition(int)
 | 
						|
                    groundZ = z
 | 
						|
                end
 | 
						|
 | 
						|
                teleport(vehicle, coords.x, coords.y, groundZ)
 | 
						|
                break
 | 
						|
            end
 | 
						|
 | 
						|
            teleport(vehicle, coords.x, coords.y, z)
 | 
						|
            Wait(0)
 | 
						|
 | 
						|
            z += inc
 | 
						|
        end
 | 
						|
 | 
						|
        SetGameplayCamRelativeHeading(0)
 | 
						|
        Wait(500)
 | 
						|
        freezePlayer(false, vehicle)
 | 
						|
        DoScreenFadeIn(750)
 | 
						|
    end
 | 
						|
end, true)
 | 
						|
 | 
						|
local function stringToCoords(input)
 | 
						|
    local arr, num = {}, 0
 | 
						|
 | 
						|
    for n in string.gmatch(input:gsub('vec.-%d?%(', ''), '(-?[%d.%d]+)') do
 | 
						|
        num += 1
 | 
						|
        arr[num] = tonumber(n)
 | 
						|
    end
 | 
						|
 | 
						|
    return table.unpack(arr)
 | 
						|
end
 | 
						|
 | 
						|
RegisterCommand('setcoords', function(_, raw)
 | 
						|
    local x, y, z, w = stringToCoords(raw)
 | 
						|
 | 
						|
    if x then
 | 
						|
        DoScreenFadeOut(100)
 | 
						|
        Wait(100)
 | 
						|
 | 
						|
        local vehicle = cache.seat == -1 and cache.vehicle
 | 
						|
        lastCoords = GetEntityCoords(cache.ped)
 | 
						|
 | 
						|
        teleport(vehicle, x, y, z)
 | 
						|
 | 
						|
        if w then
 | 
						|
            SetEntityHeading(cache.ped, w)
 | 
						|
        end
 | 
						|
 | 
						|
        SetGameplayCamRelativeHeading(0)
 | 
						|
        DoScreenFadeIn(750)
 | 
						|
    end
 | 
						|
end, true)
 | 
						|
 | 
						|
RegisterCommand('coords', function(args)
 | 
						|
    local coords = GetEntityCoords(cache.ped)
 | 
						|
    local str = args[1] and 'vec4(%.3f, %.3f, %.3f, %.3f)' or 'vec3(%.3f, %.3f, %.3f)'
 | 
						|
    str = str:format(coords.x, coords.y, coords.z, args[1] and GetEntityHeading(cache.ped) or nil)
 | 
						|
 | 
						|
    print(str)
 | 
						|
    lib.setClipboard(str)
 | 
						|
end, false)
 | 
						|
 | 
						|
SetTimeout(1000, function()
 | 
						|
    TriggerEvent('chat:addSuggestion', '/coords', 'Saves current coordinates to the clipboard.', {
 | 
						|
        { name = 'heading', help = 'Save your current heading.' },
 | 
						|
    })
 | 
						|
end)
 | 
						|
 | 
						|
local noClip = false
 | 
						|
 | 
						|
-- https://github.com/Deltanic/fivem-freecam/
 | 
						|
-- https://github.com/tabarra/txAdmin/tree/master/scripts/menu/vendor/freecam
 | 
						|
RegisterCommand('noclip', function()
 | 
						|
    noClip = not noClip
 | 
						|
    SetFreecamActive(noClip)
 | 
						|
end, true)
 |