216 lines
8.5 KiB
Lua
216 lines
8.5 KiB
Lua
local config = require 'config.client'
|
|
local sharedConfig = require 'config.shared'
|
|
CurrentThermiteGate = 0
|
|
CurrentCops = 0
|
|
local closestBank = 0
|
|
local inElectronickitZone = false
|
|
local copsCalled = false
|
|
local refreshed = false
|
|
local currentLocker = 0
|
|
|
|
--- This is triggered once the hack at a small bank is done
|
|
--- @param success boolean
|
|
--- @return nil
|
|
local function onHackDone(success)
|
|
TriggerEvent('mhacking:hide')
|
|
if not success then return end
|
|
TriggerServerEvent('qbx_bankrobbery:server:setBankState', closestBank)
|
|
end
|
|
|
|
RegisterNetEvent('police:SetCopCount', function(amount)
|
|
CurrentCops = amount
|
|
end)
|
|
|
|
RegisterNetEvent('electronickit:UseElectronickit', function()
|
|
DropFingerprint()
|
|
|
|
if closestBank == 0 or not inElectronickitZone then return end
|
|
|
|
local isBusy = lib.callback.await('qbx_bankrobbery:server:isRobberyActive', false)
|
|
if isBusy then return exports.qbx_core:Notify(locale('error.security_lock_active'), 'error', 5500) end
|
|
|
|
if CurrentCops < config.minFleecaPolice then return exports.qbx_core:Notify(locale('error.minimum_police_required', {police = config.minFleecaPolice}), 'error') end
|
|
if sharedConfig.smallBanks[closestBank].isOpened then return exports.qbx_core:Notify(locale('error.bank_already_open'), 'error') end
|
|
|
|
local hasItems = (exports.ox_inventory:Search('count', 'trojan_usb') > 0) and (exports.ox_inventory:Search('count', 'electronickit') > 0)
|
|
if not hasItems then return exports.qbx_core:Notify(locale('error.missing_item'), 'error') end
|
|
|
|
if lib.progressBar({
|
|
duration = 7500,
|
|
label = locale('general.connecting_hacking_device'),
|
|
canCancel = true,
|
|
useWhileDead = false,
|
|
disable = {
|
|
move = true,
|
|
car = true,
|
|
mouse = false,
|
|
combat = true
|
|
},
|
|
anim = {
|
|
dict = 'anim@gangops@facility@servers@',
|
|
clip = 'hotwire',
|
|
flag = 1
|
|
}
|
|
}) then
|
|
TriggerServerEvent('qbx_bankrobbery:server:removeElectronicKit')
|
|
TriggerEvent('mhacking:show')
|
|
TriggerEvent('mhacking:start', math.random(6, 7), math.random(15, 30), onHackDone)
|
|
if copsCalled or not sharedConfig.smallBanks[closestBank].alarm then return end
|
|
TriggerServerEvent('qbx_bankrobbery:server:callCops', 'small', closestBank, sharedConfig.smallBanks[closestBank].coords)
|
|
copsCalled = true
|
|
SetTimeout(60000 * config.outlawCooldown, function() copsCalled = false end)
|
|
else
|
|
exports.qbx_core:Notify(locale('error.cancel_message'), 'error')
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('qbx_bankrobbery:client:enableAllBankSecurity', function()
|
|
for k in pairs(sharedConfig.smallBanks) do
|
|
sharedConfig.smallBanks[k].alarm = true
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('qbx_bankrobbery:client:disableAllBankSecurity', function()
|
|
for k in pairs(sharedConfig.smallBanks) do
|
|
sharedConfig.smallBanks[k].alarm = false
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('qbx_bankrobbery:client:BankSecurity', function(key, status)
|
|
if type(key) == 'table' and table.type(key) == 'array' then
|
|
for _, v in pairs(key) do
|
|
sharedConfig.smallBanks[v].alarm = status
|
|
end
|
|
elseif type(key) == 'number' then
|
|
sharedConfig.smallBanks[key].alarm = status
|
|
else
|
|
error(locale('error.wrong_type', 'qbx_bankrobbery:client:BankSecurity', 'key', type(key), key, 'table/array'))
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('qbx_bankrobbery:client:ResetFleecaLockers', function(BankId)
|
|
sharedConfig.smallBanks[BankId].isOpened = false
|
|
for k in pairs(sharedConfig.smallBanks[BankId].lockers) do
|
|
sharedConfig.smallBanks[BankId].lockers[k].isOpened = false
|
|
sharedConfig.smallBanks[BankId].lockers[k].isBusy = false
|
|
end
|
|
end)
|
|
|
|
CreateThread(function()
|
|
while true do
|
|
if closestBank ~= 0 then
|
|
if not refreshed then
|
|
ResetBankDoors()
|
|
refreshed = true
|
|
end
|
|
else
|
|
refreshed = false
|
|
end
|
|
Wait(1000)
|
|
end
|
|
end)
|
|
|
|
CreateThread(function()
|
|
while true do -- This is kept for the ResetBankDoors function to be executed outside of the polyzone
|
|
local pos = GetEntityCoords(cache.ped)
|
|
local inRange = false
|
|
if isLoggedIn then
|
|
for k, v in pairs(sharedConfig.smallBanks) do
|
|
local dist = #(pos - v.coords)
|
|
if dist < 15 then
|
|
closestBank = k
|
|
inRange = true
|
|
end
|
|
end
|
|
if not inRange then closestBank = 0 end
|
|
end
|
|
Wait(1000)
|
|
end
|
|
end)
|
|
|
|
CreateThread(function()
|
|
for i = 1, #sharedConfig.smallBanks do
|
|
lib.zones.box({
|
|
name = 'fleeca_'..i..'_coords_electronickit',
|
|
coords = sharedConfig.smallBanks[i].coords,
|
|
size = vec3(1, 1, 2),
|
|
rotation = sharedConfig.smallBanks[i].coords.closed,
|
|
debug = config.debugPoly,
|
|
onEnter = function()
|
|
inElectronickitZone = true
|
|
end,
|
|
onExit = function()
|
|
inElectronickitZone = false
|
|
end,
|
|
})
|
|
for k in pairs(sharedConfig.smallBanks[i].lockers) do
|
|
if config.useTarget then
|
|
exports.ox_target:addBoxZone({
|
|
coords = sharedConfig.smallBanks[i].lockers[k].coords,
|
|
size = vec3(1, 1, 2),
|
|
rotation = sharedConfig.smallBanks[i].heading.closed,
|
|
debug = config.debugPoly,
|
|
drawSprite = true,
|
|
options = {
|
|
{
|
|
label = locale('general.break_safe_open_option_target'),
|
|
name = 'fleeca_'..i..'_coords_locker_'..k,
|
|
icon = 'fa-solid fa-vault',
|
|
distance = 1.5,
|
|
canInteract = function()
|
|
return closestBank ~= 0 and not isDrilling and sharedConfig.smallBanks[i].isOpened and not sharedConfig.smallBanks[i].lockers[k].isOpened and not sharedConfig.smallBanks[i].lockers[k].isBusy
|
|
end,
|
|
onSelect = function()
|
|
OpenLocker(closestBank, k)
|
|
end,
|
|
},
|
|
},
|
|
})
|
|
else
|
|
lib.zones.box({
|
|
name = 'fleeca_'..i..'_coords_locker_'..k,
|
|
coords = sharedConfig.smallBanks[i].lockers[k].coords,
|
|
size = vec3(1, 1, 2),
|
|
rotation = sharedConfig.smallBanks[i].heading.closed,
|
|
debug = config.debugPoly,
|
|
onEnter = function()
|
|
if closestBank ~= 0 and not isDrilling and sharedConfig.smallBanks[i].isOpened and not sharedConfig.smallBanks[i].lockers[k].isOpened and not sharedConfig.smallBanks[i].lockers[k].isBusy then
|
|
lib.showTextUI(locale('general.break_safe_open_option_drawtext'), {position = 'right-center'})
|
|
currentLocker = k
|
|
end
|
|
end,
|
|
onExit = function()
|
|
if currentLocker == k then
|
|
currentLocker = 0
|
|
lib.hideTextUI()
|
|
end
|
|
end,
|
|
})
|
|
end
|
|
end
|
|
end
|
|
if not config.useTarget then
|
|
while true do
|
|
local sleep = 1000
|
|
if isLoggedIn then
|
|
for i = 1, #sharedConfig.smallBanks do
|
|
if currentLocker ~= 0 and not isDrilling and sharedConfig.smallBanks[i].isOpened and not sharedConfig.smallBanks[i].lockers[currentLocker].isOpened and not sharedConfig.smallBanks[i].lockers[currentLocker].isBusy then
|
|
sleep = 0
|
|
if IsControlJustPressed(0, 38) then
|
|
lib.hideTextUI()
|
|
Wait(500)
|
|
if CurrentCops >= config.minFleecaPolice then
|
|
OpenLocker(closestBank, currentLocker)
|
|
else
|
|
exports.qbx_core:Notify(locale('error.minimum_police_required', {police = config.minFleecaPolice}), 'error')
|
|
end
|
|
sleep = 1000
|
|
end
|
|
end
|
|
end
|
|
end
|
|
Wait(sleep)
|
|
end
|
|
end
|
|
end)
|