local config = require 'config.client' local spawns local previewCam local scaleform local buttonsScaleform local currentButtonId = 1 local previousButtonId = 1 local function setupCamera() previewCam = CreateCamWithParams('DEFAULT_SCRIPTED_CAMERA', -24.77, -590.35, 90.8, -2.0, 0.0, 160.0, 45.0, false, 2) SetCamActive(previewCam, true) RenderScriptCams(true, false, 1, true, true) end local function stopCamera() SetCamActive(previewCam, false) DestroyCam(previewCam, true) RenderScriptCams(false, false, 1, true, true) BeginScaleformMovieMethod(scaleform, 'CLEANUP') EndScaleformMovieMethod() end local function managePlayer() SetEntityCoords(cache.ped, -21.58, -583.76, 86.31, false, false, false, false) FreezeEntityPosition(cache.ped, true) DisplayRadar(false) SetTimeout(500, function() DoScreenFadeIn(5000) end) end local function createSpawnArea() for i = 1, #spawns, 1 do local spawn = spawns[i] BeginScaleformMovieMethod(scaleform, 'ADD_AREA') ScaleformMovieMethodAddParamInt(i) ScaleformMovieMethodAddParamFloat(spawn.coords.x) ScaleformMovieMethodAddParamFloat(spawn.coords.y) ScaleformMovieMethodAddParamFloat(500.0) ScaleformMovieMethodAddParamInt(255) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(100) EndScaleformMovieMethod() end end local function setupInstructionalButton(index, control, text) BeginScaleformMovieMethod(buttonsScaleform, 'SET_DATA_SLOT') ScaleformMovieMethodAddParamInt(index) ScaleformMovieMethodAddParamPlayerNameString(GetControlInstructionalButton(2, control, true)) BeginTextCommandScaleformString('STRING') AddTextComponentSubstringKeyboardDisplay(text) EndTextCommandScaleformString() EndScaleformMovieMethod() end local function setupInstructionalScaleform() DrawScaleformMovieFullscreen(buttonsScaleform, 255, 255, 255, 0, 0) BeginScaleformMovieMethod(buttonsScaleform, 'CLEAR_ALL') EndScaleformMovieMethod() BeginScaleformMovieMethod(buttonsScaleform, 'SET_CLEAR_SPACE') ScaleformMovieMethodAddParamInt(200) EndScaleformMovieMethod() setupInstructionalButton(0, 191, 'Submit') setupInstructionalButton(1, 187, 'Down') setupInstructionalButton(2, 188, 'Up') BeginScaleformMovieMethod(buttonsScaleform, 'DRAW_INSTRUCTIONAL_BUTTONS') EndScaleformMovieMethod() end local function setupMap() scaleform = lib.requestScaleformMovie('HEISTMAP_MP', 5000) or 0 buttonsScaleform = lib.requestScaleformMovie('INSTRUCTIONAL_BUTTONS', 5000) or 0 CreateThread(function() setupInstructionalScaleform() createSpawnArea() while DoesCamExist(previewCam) do DrawScaleformMovie_3d(scaleform, -24.86, -593.38, 91.8, -180.0, -180.0, -20.0, 0.0, 2.0, 0.0, 3.815, 2.27, 1.0, 2) HideHudComponentThisFrame(6) HideHudComponentThisFrame(7) HideHudComponentThisFrame(9) DrawScaleformMovieFullscreen(buttonsScaleform, 255, 255, 255, 255, 0) Wait(0) end SetScaleformMovieAsNoLongerNeeded(scaleform) SetScaleformMovieAsNoLongerNeeded(buttonsScaleform) end) end local function scaleformDetails(index) local spawn = spawns[index] local arrowStart = { vec2(-3150.25, -1427.83), vec2(4173.08, 1338.72), vec2(-2390.23, 6262.24) } BeginScaleformMovieMethod(scaleform, 'ADD_HIGHLIGHT') ScaleformMovieMethodAddParamInt(index) ScaleformMovieMethodAddParamFloat(spawn.coords.x) ScaleformMovieMethodAddParamFloat(spawn.coords.y) ScaleformMovieMethodAddParamFloat(500.0) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(255) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(100) EndScaleformMovieMethod() BeginScaleformMovieMethod(scaleform, 'COLOUR_AREA') ScaleformMovieMethodAddParamInt(index) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(255) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(0) EndScaleformMovieMethod() BeginScaleformMovieMethod(scaleform, 'ADD_TEXT') ScaleformMovieMethodAddParamInt(index) ScaleformMovieMethodAddParamTextureNameString(spawn.label) ScaleformMovieMethodAddParamFloat(spawn.coords.x) ScaleformMovieMethodAddParamFloat(spawn.coords.y - 500) ScaleformMovieMethodAddParamFloat(25 - math.random(0, 50)) ScaleformMovieMethodAddParamInt(24) ScaleformMovieMethodAddParamInt(100) ScaleformMovieMethodAddParamInt(255) ScaleformMovieMethodAddParamBool(true) EndScaleformMovieMethod() local randomCoords = arrowStart[math.random(#arrowStart)] BeginScaleformMovieMethod(scaleform, 'ADD_ARROW') ScaleformMovieMethodAddParamInt(index) ScaleformMovieMethodAddParamFloat(randomCoords.x) ScaleformMovieMethodAddParamFloat(randomCoords.y) ScaleformMovieMethodAddParamFloat(spawn.coords.x) ScaleformMovieMethodAddParamFloat(spawn.coords.y) ScaleformMovieMethodAddParamFloat(math.random(30, 80)) EndScaleformMovieMethod() BeginScaleformMovieMethod(scaleform, 'COLOUR_ARROW') ScaleformMovieMethodAddParamInt(index) ScaleformMovieMethodAddParamInt(255) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(100) EndScaleformMovieMethod() end local function updateScaleform() if previousButtonId == currentButtonId then return end for i = 1, #spawns, 1 do BeginScaleformMovieMethod(scaleform, 'REMOVE_HIGHLIGHT') ScaleformMovieMethodAddParamInt(i) EndScaleformMovieMethod() BeginScaleformMovieMethod(scaleform, 'REMOVE_TEXT') ScaleformMovieMethodAddParamInt(i) EndScaleformMovieMethod() BeginScaleformMovieMethod(scaleform, 'REMOVE_ARROW') ScaleformMovieMethodAddParamInt(i) EndScaleformMovieMethod() BeginScaleformMovieMethod(scaleform, 'COLOUR_AREA') ScaleformMovieMethodAddParamInt(i) ScaleformMovieMethodAddParamInt(255) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(0) ScaleformMovieMethodAddParamInt(100) EndScaleformMovieMethod() end scaleformDetails(currentButtonId) end local function inputHandler() while DoesCamExist(previewCam) do if IsControlJustReleased(0, 188) then previousButtonId = currentButtonId currentButtonId -= 1 if currentButtonId < 1 then currentButtonId = #spawns end updateScaleform() elseif IsControlJustReleased(0, 187) then previousButtonId = currentButtonId currentButtonId += 1 if currentButtonId > #spawns then currentButtonId = 1 end updateScaleform() elseif IsControlJustReleased(0, 191) then DoScreenFadeOut(1000) while not IsScreenFadedOut() do Wait(0) end TriggerServerEvent('QBCore:Server:OnPlayerLoaded') TriggerEvent('QBCore:Client:OnPlayerLoaded') FreezeEntityPosition(cache.ped, false) DisplayRadar(true) local spawnData = spawns[currentButtonId] if spawnData.propertyId then TriggerServerEvent('qbx_properties:server:enterProperty', { id = spawnData.propertyId, isSpawn = true }) else SetEntityCoords(cache.ped, spawnData.coords.x, spawnData.coords.y, spawnData.coords.z, false, false, false, false) SetEntityHeading(cache.ped, spawnData.coords.w or 0.0) end DoScreenFadeIn(1000) break end Wait(0) end stopCamera() end RegisterNetEvent('qb-spawn:client:setupSpawns', function() spawns = {} local lastCoords, lastPropertyId = lib.callback.await('qbx_spawn:server:getLastLocation') spawns[#spawns + 1] = { label = locale('last_location'), coords = lastCoords, propertyId = lastPropertyId } for i = 1, #config.spawns do spawns[#spawns + 1] = config.spawns[i] end local properties = lib.callback.await('qbx_spawn:server:getProperties') for i = 1, #properties do spawns[#spawns + 1] = properties[i] end Wait(400) managePlayer() setupCamera() setupMap() Wait(400) scaleformDetails(currentButtonId) inputHandler() end)