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