Main/resources/[jobs]/[crime]/lation_247robbery/client/main.lua
2025-07-02 07:48:15 +02:00

296 lines
No EOL
10 KiB
Lua

-- Initialize config(s)
local shared = require 'config.shared'
local client = require 'config.client'
local icons = require 'config.icons'
-- Initialize variables to track active locations
local activeRegister, activeComputer, activeSafe = false, false, false
-- Initialize variables to store code & pin
local safePin
-- Initialize variables to track failed attempts
local wrongPIN, failedHack = 0, 0
-- Initialize table to build questionnaire if applicable
local questionData = {}
-- Build the input dialog for questionnaire if applicable
if shared.computers.questionnaire then
for _, question in ipairs(shared.questionnaire.questions) do
questionData[#questionData + 1] = {
type = question.type,
label = question.label,
description = question.description,
icon = question.icon,
required = question.required
}
if question.type == 'select' then
questionData[#questionData].options = question.options
end
end
end
-- Used to check if the answers submitted are correct
--- @param answers table
local function AreAnswersCorrect(answers)
for question, answer in ipairs(shared.questionnaire.answers) do
local submitted_answer = answers[question]
if shared.questionnaire.questions[question].type == 'select' then
if tonumber(submitted_answer) ~= answer then
return false
end
else
if string.lower(submitted_answer) ~= string.lower(answer) then
return false
end
end
end
return true
end
-- Function to start the initial robbery process
local function InitiateRegisterRobbery()
local canStart = lib.callback.await('lation_247robbery:StartRobbery', false)
if not canStart then activeRegister = false return end
local dict, anim = client.anims.lockpick.dict, client.anims.lockpick.clip
lib.requestAnimDict(dict)
while not HasAnimDictLoaded(dict) do Wait(0) end
TaskPlayAnim(cache.ped, dict, anim, 8.0, 8.0, -1, 51, 1.0, false, false, false)
local skillcheck = Minigame(shared.registers.minigame)
ClearPedTasks(cache.ped)
if not skillcheck then
TriggerServerEvent('lation_247robbery:DoesLockpickBreak')
activeRegister = false
return
end
local coords = GetEntityCoords(cache.ped)
local data = {
coords = coords,
street = GetStreetNameFromHashKey(GetStreetNameAtCoord(coords.x, coords.y, coords.z))
}
PoliceDispatch(data)
if ProgressBar(client.anims.register) then
local codeChance = math.random(100)
if codeChance <= shared.registers.noteChance then
local generatedCode = math.random(1111, 9999)
if safePin then safePin = nil end
safePin = generatedCode
local note = ShowAlert({
header = locale('alerts.note.header'),
content = locale('alerts.note.content', safePin),
icon = icons.received_pin,
centered = true,
cancel = false,
})
if note == 'confirm' then
activeSafe = true
TriggerServerEvent('lation_247robbery:CompleteRegisterRobbery')
end
else
activeComputer = true
TriggerServerEvent('lation_247robbery:CompleteRegisterRobbery')
end
else
activeRegister = false
ShowNotification(locale('notify.cancel-rob'), 'error')
end
end
-- Function to handle hacking the computer if required
local function InitiateComputerHack()
activeComputer = false -- Deactive target
if failedHack >= shared.computers.maxAttempts then
activeRegister = false
activeComputer = false
failedHack = 0
ShowNotification(locale('notify.failed-limit'), 'error')
TriggerServerEvent('lation_247robbery:FailedRobbery')
return
end
local dict, anim = client.anims.hackPC.dict, client.anims.hackPC.clip
lib.requestAnimDict(dict)
while not HasAnimDictLoaded(dict) do Wait(0) end
TaskPlayAnim(cache.ped, dict, anim, 8.0, 8.0, -1, 1, 1, false, false, false)
if shared.computers.questionnaire then
local questions = ShowInput({ title = locale('inputs.questions.header'), options = questionData })
if not questions then
activeComputer = true
ClearPedTasks(cache.ped)
return
end
if AreAnswersCorrect(questions) then
failedHack = 0
ClearPedTasks(cache.ped)
local generatedCode = math.random(1111, 9999)
if safePin then safePin = nil end
safePin = generatedCode
ShowAlert({
header = locale('alerts.hack.header'),
content = locale('alerts.hack.content', safePin),
icon = icons.received_pin,
centered = true,
cancel = false
})
activeSafe = true
else
ClearPedTasks(cache.ped)
activeComputer = true
failedHack = failedHack + 1
ShowNotification(locale('notify.failed-hack'), 'error')
end
else
local skillcheck = Minigame(shared.computers.minigame)
if not skillcheck then
ClearPedTasks(cache.ped)
activeComputer = true
failedHack = failedHack + 1
ShowNotification(locale('notify.failed-hack'), 'error')
return
end
failedHack = 0
ClearPedTasks(cache.ped)
local generatedCode = math.random(1111, 9999)
if safePin then safePin = nil end
safePin = generatedCode
ShowAlert({
header = locale('alerts.hack.header'),
content = locale('alerts.hack.content', safePin),
icon = icons.received_pin,
centered = true,
cancel = false
})
activeSafe = true
end
end
-- Function to handle the safe robbery
local function InitiateSafeRobbery()
activeSafe = false
if wrongPIN >= shared.safes.maxAttempts then
activeRegister = false
activeSafe = false
wrongPIN = 0
ShowNotification(locale('notify.failed-limit'), 'error')
TriggerServerEvent('lation_247robbery:FailedRobbery')
return
end
local inputCode = ShowInput({
title = locale('inputs.safe.header'),
options = {
{
type = 'input',
label = locale('inputs.safe.label'),
description = locale('inputs.safe.desc'),
placeholder = locale('inputs.safe.placeholder'),
icon = icons.safe_pin,
required = true
}
}
})
if not inputCode then activeSafe = true return end
local convertedCode = tonumber(inputCode[1])
if convertedCode ~= safePin then
wrongPIN = wrongPIN + 1
activeSafe = true
ShowNotification(locale('notify.wrong-pin'), 'error')
elseif convertedCode == safePin then
activeSafe = false
wrongPIN = 0
if ProgressBar(client.anims.safe) then
activeRegister = false
TriggerServerEvent('lation_247robbery:CompleteSafeRobbery')
safePin = nil
else
activeSafe = true
end
end
end
-- Create interactions
AddEventHandler('lation_247robbery:onPlayerLoaded', function()
local gabz = GetResourceState('cfx-gabz-247') == 'started'
local fm = GetResourceState('cfx-fm-supermarkets') == 'started'
local coords = gabz and require 'data.gabz' or fm and require 'data.fmshop' or require 'data.default'
for key, coord in pairs(coords.registers) do
local data = {
name = 'cash_register' ..key,
coords = coord,
radius = 0.35,
debug = shared.setup.debug,
options = {
{
label = locale('target.register'),
icon = icons.register,
iconColor = icons.register_color,
canInteract = function()
if not activeRegister then
return true
end
return false
end,
action = function()
activeRegister = true
InitiateRegisterRobbery()
end,
onSelect = function()
activeRegister = true
InitiateRegisterRobbery()
end,
distance = 2
}
}
}
AddCircleZone(data)
end
for key, coord in pairs(coords.computers) do
local data = {
name = 'computer' ..key,
coords = coord,
radius = 0.35,
debug = shared.setup.debug,
options = {
{
label = locale('target.computer'),
icon = icons.computer,
iconColor = icons.computer_color,
canInteract = function()
if activeComputer then
return true
end
return false
end,
action = InitiateComputerHack,
onSelect = InitiateComputerHack,
distance = 2
}
}
}
AddCircleZone(data)
end
for key, coord in pairs(coords.safes) do
local data = {
name = 'safe' ..key,
coords = coord,
radius = 0.45,
debug = shared.setup.debug,
options = {
{
label = locale('target.safe'),
icon = icons.safe,
iconColor = icons.safe_color,
canInteract = function()
if activeSafe then
return true
end
return false
end,
action = InitiateSafeRobbery,
onSelect = InitiateSafeRobbery,
distance = 2
}
}
}
AddCircleZone(data)
end
end)