272 lines
8.5 KiB
Lua
272 lines
8.5 KiB
Lua
|
|
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)
|