forked from Simnation/Main
920 lines
30 KiB
Lua
920 lines
30 KiB
Lua
![]() |
local QBCore = exports["qb-core"]:GetCoreObject()
|
||
|
local PlayerData = {}
|
||
|
local trans = {}
|
||
|
local societyTrans = {}
|
||
|
local societyIdent, societyDays
|
||
|
local didAction = false
|
||
|
local isBankOpened = false
|
||
|
local canAccessSociety = false
|
||
|
local society = ''
|
||
|
local societyInfo
|
||
|
local closestATM, atmPos
|
||
|
local playerName, playerBankMoney, playerIBAN, trsIdentifier, allDaysValues, walletMoney
|
||
|
local targetOptionsNames = { atm = 'okokBanking:ATM', bank = 'okokBanking:Bank'}
|
||
|
local BankZonesId, AtmModels = {}, {}
|
||
|
|
||
|
function GenerateIBAN()
|
||
|
math.randomseed(GetGameTimer())
|
||
|
local stringFormat = "%0"..Config.IBANNumbers.."d"
|
||
|
local number = math.random(0, 10^Config.IBANNumbers-1)
|
||
|
number = string.format(stringFormat, number)
|
||
|
local iban = Config.IBANPrefix..number:upper()
|
||
|
local isIBanUsed = true
|
||
|
local hasChecked = false
|
||
|
|
||
|
while true do
|
||
|
Wait(10)
|
||
|
if isIBanUsed and not hasChecked then
|
||
|
isIBanUsed = false
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed)
|
||
|
if isUsed ~= nil then
|
||
|
isIBanUsed = true
|
||
|
number = math.random(0, 10^Config.IBANNumbers-1)
|
||
|
number = string.format("%03d", number)
|
||
|
iban = Config.IBANPrefix..number:upper()
|
||
|
elseif isUsed == nil then
|
||
|
hasChecked = true
|
||
|
isIBanUsed = false
|
||
|
end
|
||
|
canLoop = true
|
||
|
end, iban)
|
||
|
elseif not isIBanUsed and hasChecked then
|
||
|
break
|
||
|
end
|
||
|
end
|
||
|
TriggerServerEvent('okokBanking:SetIBAN', iban)
|
||
|
end
|
||
|
|
||
|
function string.starts(string, start)
|
||
|
return string.sub(string, 1, string.len(start)) == start
|
||
|
end
|
||
|
|
||
|
function openBank()
|
||
|
local isCreatingSociety = false
|
||
|
local hasJob = false
|
||
|
local playeJob = QBCore.Functions.GetPlayerData().job
|
||
|
local playerGang = QBCore.Functions.GetPlayerData().gang
|
||
|
local playerJobName = ''
|
||
|
local playerGangName = ''
|
||
|
local jobLabel = ''
|
||
|
isBankOpened = true
|
||
|
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
|
||
|
|
||
|
canAccessSociety = false
|
||
|
|
||
|
if playeJob ~= nil or playerGang ~= nil then
|
||
|
hasJob = true
|
||
|
playerJobName = playeJob.name
|
||
|
jobLabel = playeJob.name
|
||
|
society = playerJobName
|
||
|
playerGangName = playerGang.name
|
||
|
end
|
||
|
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetPlayerInfo", function(data)
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cb, identifier, allDays)
|
||
|
for k,v in pairs(Config.Societies) do
|
||
|
if playerJobName == v then
|
||
|
if data.isBoss == true then
|
||
|
canAccessSociety = true
|
||
|
end
|
||
|
elseif playerGangName == v then
|
||
|
if data.isBossGang == true then
|
||
|
jobLabel = playerGangName
|
||
|
society = playerGangName
|
||
|
canAccessSociety = true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if canAccessSociety then
|
||
|
isCreatingSociety = true
|
||
|
local societyIban = Config.IBANPrefix..jobLabel
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:SocietyInfo", function(cb)
|
||
|
if cb ~= nil then
|
||
|
societyInfo = cb
|
||
|
isCreatingSociety = false
|
||
|
else
|
||
|
TriggerServerEvent("okokBanking:CreateSocietyAccount", society, jobLabel, 0, societyIban)
|
||
|
Wait(200)
|
||
|
while isCreatingSociety do
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:SocietyInfo", function(cb)
|
||
|
if cb ~= nil then
|
||
|
societyInfo = cb
|
||
|
isCreatingSociety = false
|
||
|
end
|
||
|
end, society)
|
||
|
Wait(200)
|
||
|
end
|
||
|
end
|
||
|
end, society, societyIban)
|
||
|
end
|
||
|
|
||
|
while isCreatingSociety do
|
||
|
Wait(100)
|
||
|
end
|
||
|
|
||
|
isBankOpened = true
|
||
|
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
|
||
|
trans = cb
|
||
|
playerName, playerBankMoney, playerIBAN, trsIdentifier, allDaysValues, walletMoney = data.playerName, data.playerBankMoney, data.playerIBAN, identifier, allDays, data.walletMoney
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetSocietyTransactions", function(societyTranscb, societyID, societyAllDays)
|
||
|
societyIdent = societyID
|
||
|
societyDays = societyAllDays
|
||
|
societyTrans = societyTranscb
|
||
|
if data.playerIBAN ~= nil then
|
||
|
if string.starts(data.playerIBAN, Config.IBANPrefix) then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'bankmenu',
|
||
|
playerName = data.playerName,
|
||
|
playerSex = data.sex,
|
||
|
playerBankMoney = data.playerBankMoney,
|
||
|
walletMoney = walletMoney,
|
||
|
playerIBAN = data.playerIBAN,
|
||
|
db = trans,
|
||
|
identifier = trsIdentifier,
|
||
|
graphDays = allDaysValues,
|
||
|
isInSociety = canAccessSociety,
|
||
|
RequireCC = Config.RequireCreditCardForATM,
|
||
|
UseSound = Config.UseOkOkBankingSounds,
|
||
|
})
|
||
|
else
|
||
|
GenerateIBAN()
|
||
|
Wait(1000)
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetPlayerInfo", function(data)
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'bankmenu',
|
||
|
playerName = data.playerName,
|
||
|
playerSex = data.sex,
|
||
|
playerBankMoney = data.playerBankMoney,
|
||
|
walletMoney = walletMoney,
|
||
|
playerIBAN = data.playerIBAN,
|
||
|
db = trans,
|
||
|
identifier = trsIdentifier,
|
||
|
graphDays = allDaysValues,
|
||
|
isInSociety = canAccessSociety,
|
||
|
RequireCC = Config.RequireCreditCardForATM,
|
||
|
})
|
||
|
end)
|
||
|
end
|
||
|
end
|
||
|
end, society)
|
||
|
end)
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
CreateThread(function()
|
||
|
while QBCore.Functions.GetPlayerData().job == nil do
|
||
|
Wait(10)
|
||
|
end
|
||
|
PlayerData = QBCore.Functions.GetPlayerData()
|
||
|
end)
|
||
|
|
||
|
CreateThread(function()
|
||
|
if Config.ShowBankBlips then
|
||
|
Wait(2000)
|
||
|
for k,v in ipairs(Config.BankLocations)do
|
||
|
local blip = AddBlipForCoord(v.x, v.y, v.z)
|
||
|
SetBlipSprite(blip, v.blip)
|
||
|
SetBlipDisplay(blip, 4)
|
||
|
SetBlipScale(blip, v.blipScale)
|
||
|
SetBlipColour(blip, v.blipColor)
|
||
|
SetBlipAsShortRange(blip, true)
|
||
|
BeginTextCommandSetBlipName("STRING")
|
||
|
AddTextComponentString(v.blipText)
|
||
|
EndTextCommandSetBlipName(blip)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
if Config.UseTargetOnBank then
|
||
|
RegisterNetEvent("okokBanking:OpenBank")
|
||
|
AddEventHandler("okokBanking:OpenBank", function()
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'loading_data'
|
||
|
})
|
||
|
Wait(500)
|
||
|
openBank()
|
||
|
end)
|
||
|
|
||
|
for k, v in ipairs(Config.BankLocations) do
|
||
|
local boxName = targetOptionsNames.bank .. k
|
||
|
if v.boxZone then
|
||
|
if Config.TargetSystem == 'qb-target' then
|
||
|
local zoneId = exports['qb-target']:AddBoxZone(boxName, v.boxZone.pos, v.boxZone.size.x, v.boxZone.size.y, {
|
||
|
name = boxName,
|
||
|
heading = v.boxZone.rotation,
|
||
|
debugPoly = Config.DebugTargetZones,
|
||
|
minZ = v.boxZone.pos.z ,
|
||
|
maxZ = v.boxZone.maxZ,
|
||
|
useZ = false,
|
||
|
}, {
|
||
|
options = {{
|
||
|
icon = 'fas fa-piggy-bank',
|
||
|
label = _L('open_banking_target').text,
|
||
|
canInteract = function(entity) return not isDead and not IsPedInAnyVehicle(PlayerPedId()) end,
|
||
|
action = function(entity) TriggerEvent('okokBanking:OpenBank') end
|
||
|
}},
|
||
|
distance = Config.TargetBankDistance,
|
||
|
})
|
||
|
elseif Config.TargetSystem == 'ox-target' then
|
||
|
local zoneId = exports.ox_target:addBoxZone({
|
||
|
coords = v.boxZone.pos,
|
||
|
size = vec3(v.boxZone.size.x, v.boxZone.size.y, v.boxZone.maxZ - v.boxZone.pos.z),
|
||
|
rotation = v.boxZone.rotation,
|
||
|
debug = Config.DebugTargetZones,
|
||
|
options = {
|
||
|
{
|
||
|
icon = 'fas fa-piggy-bank',
|
||
|
label = _L('open_banking_target').text,
|
||
|
canInteract = function(entity, distance, coords, name) return not isDead and not IsPedInAnyVehicle(PlayerPedId()) end,
|
||
|
onSelect = function(data) TriggerEvent('okokBanking:OpenBank') end
|
||
|
}
|
||
|
},
|
||
|
distance = Config.TargetBankDistance
|
||
|
})
|
||
|
end
|
||
|
table.insert(BankZonesId, zoneId)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
|
||
|
local function NearBank()
|
||
|
local pos = GetEntityCoords(PlayerPedId())
|
||
|
for k, v in pairs(Config.BankLocations) do
|
||
|
local dist = #(vector3(v.x, v.y, v.z) - pos)
|
||
|
if dist <= v.BankDistance then
|
||
|
return true
|
||
|
elseif dist <= v.BankDistance + 5 then
|
||
|
return "update"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
CreateThread(function()
|
||
|
local inRange = false
|
||
|
local shown = false
|
||
|
local notified = false
|
||
|
|
||
|
while true do
|
||
|
local playerped = PlayerPedId()
|
||
|
inRange = false
|
||
|
Wait(0)
|
||
|
if NearBank() and not isBankOpened and NearBank() ~= "update" then
|
||
|
|
||
|
inRange = true
|
||
|
|
||
|
if IsControlJustReleased(0, 38) then
|
||
|
|
||
|
if not isDead and not IsPedInAnyVehicle(playerped) then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'loading_data'
|
||
|
})
|
||
|
Wait(500)
|
||
|
openBank()
|
||
|
else
|
||
|
if not notified then
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('not_use_bank').title, _L('not_use_bank').text, _L('not_use_bank').time, _L('not_use_bank').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('not_use_bank').text, _L('not_use_bank').type, _L('not_use_bank').time)
|
||
|
end
|
||
|
notified = true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
elseif NearBank() == "update" then
|
||
|
Wait(300)
|
||
|
else
|
||
|
Wait(1000)
|
||
|
end
|
||
|
|
||
|
if inRange and not shown then
|
||
|
shown = true
|
||
|
if Config.okokTextUI then
|
||
|
exports['okokTextUI']:Open(_L('open_banking').text, _L('open_banking').color, _L('open_banking').side)
|
||
|
else
|
||
|
exports['qb-core']:DrawText(_L('open_banking').text, _L('open_banking').side)
|
||
|
end
|
||
|
elseif not inRange and shown then
|
||
|
shown = false
|
||
|
if Config.okokTextUI then
|
||
|
exports['okokTextUI']:Close()
|
||
|
else
|
||
|
exports['qb-core']:HideText()
|
||
|
end
|
||
|
end
|
||
|
notified = false
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
if Config.UseTargetOnAtm then
|
||
|
|
||
|
for k, v in ipairs(Config.ATM) do AtmModels[#AtmModels + 1] = v.model end
|
||
|
|
||
|
RegisterNetEvent('okokBanking:TargetATM')
|
||
|
AddEventHandler('okokBanking:TargetATM', function()
|
||
|
local ped = PlayerPedId()
|
||
|
local dict = 'anim@amb@prop_human_atm@interior@male@enter'
|
||
|
local anim = 'enter'
|
||
|
|
||
|
if Config.RequireCreditCardForATM then
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:HasCreditCard", function(hasItem)
|
||
|
if not hasItem then
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('no_creditcard').title, _L('no_creditcard').text, _L('no_creditcard').time, _L('no_creditcard').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('no_creditcard').text, _L('no_creditcard').type, _L('no_creditcard').time)
|
||
|
end
|
||
|
return
|
||
|
else
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
|
||
|
if pin then
|
||
|
if not isBankOpened then
|
||
|
isBankOpened = true
|
||
|
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
|
||
|
RequestAnimDict(dict)
|
||
|
|
||
|
while not HasAnimDictLoaded(dict) do
|
||
|
Wait(7)
|
||
|
end
|
||
|
|
||
|
TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
|
||
|
Wait(Config.AnimTime * 1000)
|
||
|
ClearPedTasks(ped)
|
||
|
|
||
|
TriggerEvent("okokBanking:OpenATM", pin)
|
||
|
Wait(3000)
|
||
|
RemoveAnimDict(dict)
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
end)
|
||
|
else
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
|
||
|
if pin then
|
||
|
if not isBankOpened then
|
||
|
isBankOpened = true
|
||
|
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
|
||
|
RequestAnimDict(dict)
|
||
|
|
||
|
while not HasAnimDictLoaded(dict) do
|
||
|
Wait(7)
|
||
|
end
|
||
|
|
||
|
TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
|
||
|
Wait(Config.AnimTime * 1000)
|
||
|
ClearPedTasks(ped)
|
||
|
|
||
|
TriggerEvent("okokBanking:OpenATM", pin)
|
||
|
Wait(3000)
|
||
|
RemoveAnimDict(dict)
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
local options= {{
|
||
|
name = targetOptionsNames.atm,
|
||
|
event = 'okokBanking:TargetATM',
|
||
|
icon = 'fas fa-piggy-bank',
|
||
|
label = _L('open_atm_target').text,
|
||
|
canInteract = function(entity)
|
||
|
return not isDead and not IsPedInAnyVehicle(PlayerPedId())
|
||
|
end
|
||
|
}}
|
||
|
|
||
|
if Config.TargetSystem == 'qb-target' then
|
||
|
exports['qb-target']:AddTargetModel(AtmModels, {
|
||
|
options = options,
|
||
|
distance = Config.ATMDistance
|
||
|
})
|
||
|
elseif Config.TargetSystem == 'ox-target' then
|
||
|
exports.ox_target:addModel(AtmModels, {
|
||
|
name = targetOptionsNames.atm,
|
||
|
event = 'okokBanking:TargetATM',
|
||
|
icon = 'fas fa-piggy-bank',
|
||
|
label = _L('open_atm_target').text,
|
||
|
distance = Config.ATMDistance,
|
||
|
canInteract = function(entity) return not isDead and not IsPedInAnyVehicle(PlayerPedId()) end
|
||
|
})
|
||
|
end
|
||
|
else
|
||
|
|
||
|
function NearATM()
|
||
|
local ped = PlayerPedId()
|
||
|
local pos = GetEntityCoords(ped)
|
||
|
|
||
|
for i = 1, #Config.ATM do
|
||
|
local atm = GetClosestObjectOfType(pos.x, pos.y, pos.z, Config.ATMDistance + 5, Config.ATM[i].model, false, false, false)
|
||
|
if DoesEntityExist(atm) then
|
||
|
if atm ~= closestATM then
|
||
|
closestATM = atm
|
||
|
atmPos = GetEntityCoords(atm)
|
||
|
end
|
||
|
local dist = #(pos - atmPos)
|
||
|
|
||
|
if dist <= Config.ATMDistance then
|
||
|
return true
|
||
|
elseif dist <= Config.ATMDistance + 5 then
|
||
|
return "update"
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
CreateThread(function()
|
||
|
local inRange = false
|
||
|
local shown = false
|
||
|
local notified = false
|
||
|
|
||
|
local dict = 'anim@amb@prop_human_atm@interior@male@enter'
|
||
|
local anim = 'enter'
|
||
|
|
||
|
while true do
|
||
|
local ped = PlayerPedId()
|
||
|
inRange = false
|
||
|
Wait(0)
|
||
|
if NearATM() and not isBankOpened and NearATM() ~= "update" then
|
||
|
|
||
|
inRange = true
|
||
|
|
||
|
if IsControlJustReleased(0, 38) then
|
||
|
if not isDead and not IsPedInAnyVehicle(ped) then
|
||
|
if Config.RequireCreditCardForATM then
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:HasCreditCard", function(hasItem)
|
||
|
if not hasItem then
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('no_creditcard').title, _L('no_creditcard').text, _L('no_creditcard').time, _L('no_creditcard').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('no_creditcard').text, _L('no_creditcard').type, _L('no_creditcard').time)
|
||
|
end
|
||
|
return
|
||
|
else
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
|
||
|
if pin then
|
||
|
if not isBankOpened then
|
||
|
isBankOpened = true
|
||
|
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
|
||
|
RequestAnimDict(dict)
|
||
|
|
||
|
while not HasAnimDictLoaded(dict) do
|
||
|
Wait(7)
|
||
|
end
|
||
|
|
||
|
TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
|
||
|
Wait(Config.AnimTime * 1000)
|
||
|
ClearPedTasks(ped)
|
||
|
|
||
|
TriggerEvent("okokBanking:OpenATM", pin)
|
||
|
Wait(3000)
|
||
|
RemoveAnimDict(dict)
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
end)
|
||
|
else
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
|
||
|
if pin then
|
||
|
if not isBankOpened then
|
||
|
isBankOpened = true
|
||
|
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
|
||
|
RequestAnimDict(dict)
|
||
|
|
||
|
while not HasAnimDictLoaded(dict) do
|
||
|
Wait(7)
|
||
|
end
|
||
|
|
||
|
TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
|
||
|
Wait(Config.AnimTime * 1000)
|
||
|
ClearPedTasks(ped)
|
||
|
|
||
|
TriggerEvent("okokBanking:OpenATM", pin)
|
||
|
Wait(3000)
|
||
|
RemoveAnimDict(dict)
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
|
||
|
end
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
else
|
||
|
if not notified then
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('not_use_bank').title, _L('not_use_bank').text, _L('not_use_bank').time, _L('not_use_bank').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('not_use_bank').text, _L('not_use_bank').type, _L('not_use_bank').time)
|
||
|
end
|
||
|
notified = true
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
elseif NearATM() == "update" then
|
||
|
Wait(100)
|
||
|
else
|
||
|
Wait(1000)
|
||
|
end
|
||
|
|
||
|
if inRange and not shown then
|
||
|
shown = true
|
||
|
if Config.okokTextUI then
|
||
|
exports['okokTextUI']:Open(_L('open_atm').text, _L('open_atm').color, _L('open_atm').side)
|
||
|
else
|
||
|
exports['qb-core']:DrawText(_L('open_atm').text, _L('open_atm').side)
|
||
|
end
|
||
|
elseif not inRange and shown then
|
||
|
shown = false
|
||
|
if Config.okokTextUI then
|
||
|
exports['okokTextUI']:Close()
|
||
|
else
|
||
|
exports['qb-core']:HideText()
|
||
|
end
|
||
|
end
|
||
|
notified = false
|
||
|
end
|
||
|
end)
|
||
|
end
|
||
|
|
||
|
RegisterNetEvent("okokBanking:OpenATM")
|
||
|
AddEventHandler("okokBanking:OpenATM", function(pin)
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'atm',
|
||
|
pin = pin,
|
||
|
UseSound = Config.UseOkOkBankingSounds,
|
||
|
})
|
||
|
end)
|
||
|
|
||
|
|
||
|
|
||
|
RegisterNUICallback("action", function(data, cb)
|
||
|
if data.action == "close" then
|
||
|
isBankOpened = false
|
||
|
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
|
||
|
SetNuiFocus(false, false)
|
||
|
elseif data.action == "deposit" then
|
||
|
if tonumber(data.value) ~= nil then
|
||
|
if tonumber(data.value) > 0 then
|
||
|
if data.window == 'bankmenu' then
|
||
|
TriggerServerEvent('okokBanking:DepositMoney', tonumber(data.value))
|
||
|
elseif data.window == 'societies' then
|
||
|
TriggerServerEvent('okokBanking:DepositMoneyToSociety', tonumber(data.value), societyInfo.society, societyInfo.society_name)
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
|
||
|
end
|
||
|
end
|
||
|
elseif data.action == "withdraw" then
|
||
|
if tonumber(data.value) ~= nil then
|
||
|
if tonumber(data.value) > 0 then
|
||
|
if data.window == 'bankmenu' then
|
||
|
TriggerServerEvent('okokBanking:WithdrawMoney', tonumber(data.value))
|
||
|
elseif data.window == 'societies' then
|
||
|
TriggerServerEvent('okokBanking:WithdrawMoneyToSociety', tonumber(data.value), societyInfo.society, societyInfo.society_name, societyInfo.value)
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('invalid_input').title, _L('invalid_input').text, _L('invalid_input').time, _L('invalid_input').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('invalid_input').text, _L('invalid_input').type, _L('invalid_input').time)
|
||
|
end
|
||
|
end
|
||
|
elseif data.action == "transfer" then
|
||
|
if tonumber(data.value) ~= nil then
|
||
|
if tonumber(data.value) > 0 then
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed, isPlayer)
|
||
|
if isUsed ~= nil then
|
||
|
if isUsed.charinfo ~= nil then
|
||
|
if type(isUsed.charinfo) ~= "table" then
|
||
|
isUsed.charinfo = json.decode(isUsed.charinfo)
|
||
|
end
|
||
|
end
|
||
|
if data.window == 'bankmenu' then
|
||
|
if isPlayer then
|
||
|
TriggerServerEvent('okokBanking:TransferMoney', tonumber(data.value), data.iban:upper(), isUsed.citizenid, isUsed.money, isUsed.charinfo.firstname..' '..isUsed.charinfo.lastname)
|
||
|
elseif not isPlayer then
|
||
|
TriggerServerEvent('okokBanking:TransferMoneyToSociety', tonumber(data.value), isUsed.iban:upper(), isUsed.society_name, isUsed.society)
|
||
|
end
|
||
|
elseif data.window == 'societies' then
|
||
|
local toMyself = false
|
||
|
if data.iban:upper() == playerIBAN then
|
||
|
toMyself = true
|
||
|
end
|
||
|
|
||
|
if isPlayer then
|
||
|
TriggerServerEvent('okokBanking:TransferMoneyToPlayerFromSociety', tonumber(data.value), data.iban:upper(), isUsed.citizenid, isUsed.money, isUsed.charinfo.firstname..' '..isUsed.charinfo.lastname, societyInfo.society, societyInfo.society_name, societyInfo.value, toMyself)
|
||
|
elseif not isPlayer then
|
||
|
TriggerServerEvent('okokBanking:TransferMoneyToSocietyFromSociety', tonumber(data.value), isUsed.iban:upper(), isUsed.society_name, isUsed.society, societyInfo.society, societyInfo.society_name, societyInfo.value)
|
||
|
end
|
||
|
end
|
||
|
elseif isUsed == nil then
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('iban_not_exist').title, _L('iban_not_exist').text, _L('iban_not_exist').time, _L('iban_not_exist').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('iban_not_exist').text, _L('iban_not_exist').type, _L('iban_not_exist').time)
|
||
|
end
|
||
|
end
|
||
|
end, data.iban:upper())
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('invalid_input').title, _L('invalid_input').text, _L('invalid_input').time, _L('invalid_input').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('invalid_input').text, _L('invalid_input').type, _L('invalid_input').time)
|
||
|
end
|
||
|
end
|
||
|
elseif data.action == "overview_page" then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'overview_page',
|
||
|
playerBankMoney = playerBankMoney,
|
||
|
walletMoney = walletMoney,
|
||
|
playerIBAN = playerIBAN,
|
||
|
db = trans,
|
||
|
identifier = trsIdentifier,
|
||
|
graphDays = allDaysValues,
|
||
|
isInSociety = canAccessSociety,
|
||
|
RequireCC = Config.RequireCreditCardForATM,
|
||
|
})
|
||
|
elseif data.action == "transactions_page" then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'transactions_page',
|
||
|
db = trans,
|
||
|
identifier = trsIdentifier,
|
||
|
graph_values = allDaysValues,
|
||
|
isInSociety = canAccessSociety,
|
||
|
})
|
||
|
elseif data.action == "society_transactions" then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'society_transactions',
|
||
|
db = societyTrans,
|
||
|
identifier = societyIdent,
|
||
|
graph_values = societyDays,
|
||
|
isInSociety = canAccessSociety,
|
||
|
societyInfo = societyInfo,
|
||
|
})
|
||
|
elseif data.action == "society_page" then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'society_page',
|
||
|
playerBankMoney = playerBankMoney,
|
||
|
walletMoney = walletMoney,
|
||
|
playerIBAN = playerIBAN,
|
||
|
db = societyTrans,
|
||
|
identifier = societyIdent,
|
||
|
graphDays = societyDays,
|
||
|
isInSociety = canAccessSociety,
|
||
|
societyInfo = societyInfo,
|
||
|
})
|
||
|
elseif data.action == "settings_page" then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'settings_page',
|
||
|
isInSociety = canAccessSociety,
|
||
|
ibanCost = Config.IBANChangeCost,
|
||
|
ibanPrefix = Config.IBANPrefix,
|
||
|
ibanCharNum = Config.CustomIBANMaxChars,
|
||
|
pinCost = Config.PINChangeCost,
|
||
|
pinCharNum = 4,
|
||
|
})
|
||
|
elseif data.action == "atm" then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'loading_data',
|
||
|
})
|
||
|
Wait(500)
|
||
|
openBank()
|
||
|
elseif data.action == "change_iban" then
|
||
|
if Config.CustomIBANAllowLetters then
|
||
|
local iban = Config.IBANPrefix..data.iban:upper()
|
||
|
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed, isPlayer)
|
||
|
|
||
|
if isUsed == nil then
|
||
|
TriggerServerEvent('okokBanking:UpdateIbanDB', iban, Config.IBANChangeCost)
|
||
|
elseif isUsed ~= nil then
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('iban_in_use').title, _L('iban_in_use').text, _L('iban_in_use').time, _L('iban_in_use').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('iban_in_use').text, _L('iban_in_use').type, _L('iban_in_use').time)
|
||
|
end
|
||
|
end
|
||
|
end, iban)
|
||
|
elseif not Config.CustomIBANAllowLetters then
|
||
|
if tonumber(data.iban) ~= nil then
|
||
|
local iban = Config.IBANPrefix..data.iban:upper()
|
||
|
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed, isPlayer)
|
||
|
|
||
|
if isUsed == nil then
|
||
|
TriggerServerEvent('okokBanking:UpdateIbanDB', iban, Config.IBANChangeCost)
|
||
|
elseif isUsed ~= nil then
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('iban_in_use').title, _L('iban_in_use').text, _L('iban_in_use').time, _L('iban_in_use').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('iban_in_use').text, _L('iban_in_use').type, _L('iban_in_use').time)
|
||
|
end
|
||
|
end
|
||
|
end, iban)
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('iban_only_numbers').title, _L('iban_only_numbers').text, _L('iban_only_numbers').time, _L('iban_only_numbers').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('iban_only_numbers').text, _L('iban_only_numbers').type, _L('iban_only_numbers').time)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
elseif data.action == "change_pin" then
|
||
|
if tonumber(data.pin) ~= nil then
|
||
|
if string.len(data.pin) == 4 then
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
|
||
|
if pin then
|
||
|
TriggerServerEvent('okokBanking:UpdatePINDB', data.pin, Config.PINChangeCost)
|
||
|
else
|
||
|
TriggerServerEvent('okokBanking:UpdatePINDB', data.pin, 0)
|
||
|
end
|
||
|
end)
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('pin_digits').title, _L('pin_digits').text, _L('pin_digits').time, _L('pin_digits').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('pin_digits').text, _L('pin_digits').type, _L('pin_digits').time)
|
||
|
end
|
||
|
end
|
||
|
else
|
||
|
if Config.okokNotify then
|
||
|
exports['okokNotify']:Alert(_L('pin_only_numbers').title, _L('pin_only_numbers').text, _L('pin_only_numbers').time, _L('pin_only_numbers').type)
|
||
|
else
|
||
|
QBCore.Functions.Notify(_L('pin_only_numbers').text, _L('pin_only_numbers').type, _L('pin_only_numbers').time)
|
||
|
end
|
||
|
end
|
||
|
elseif data.action == "buy_new_cc" then
|
||
|
TriggerServerEvent('okokBanking:GiveCC')
|
||
|
end
|
||
|
cb('ok')
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("okokBanking:updateTransactions")
|
||
|
AddEventHandler("okokBanking:updateTransactions", function(money, wallet)
|
||
|
Wait(100)
|
||
|
if isBankOpened then
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cb, id, allDays)
|
||
|
trans = cb
|
||
|
allDaysValues = allDays
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'overview_page',
|
||
|
playerBankMoney = playerBankMoney,
|
||
|
walletMoney = walletMoney,
|
||
|
playerIBAN = playerIBAN,
|
||
|
db = trans,
|
||
|
identifier = trsIdentifier,
|
||
|
graphDays = allDaysValues,
|
||
|
isInSociety = canAccessSociety,
|
||
|
isUpdate = true,
|
||
|
RequireCC = Config.RequireCreditCardForATM,
|
||
|
})
|
||
|
TriggerEvent('okokBanking:updateMoney', money, wallet)
|
||
|
end)
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("okokBanking:updateMoney")
|
||
|
AddEventHandler("okokBanking:updateMoney", function(money, wallet)
|
||
|
if isBankOpened then
|
||
|
playerBankMoney = money
|
||
|
walletMoney = wallet
|
||
|
SendNUIMessage({
|
||
|
action = 'updatevalue',
|
||
|
playerBankMoney = money,
|
||
|
walletMoney = wallet,
|
||
|
})
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("okokBanking:updateIban")
|
||
|
AddEventHandler("okokBanking:updateIban", function(iban)
|
||
|
playerIBAN = iban
|
||
|
SendNUIMessage({
|
||
|
action = 'updateiban',
|
||
|
iban = playerIBAN,
|
||
|
})
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("okokBanking:updateIbanPinChange")
|
||
|
AddEventHandler("okokBanking:updateIbanPinChange", function()
|
||
|
Wait(100)
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cbs, ids, allDays)
|
||
|
trans = cbs
|
||
|
end)
|
||
|
end)
|
||
|
|
||
|
RegisterNetEvent("okokBanking:updateTransactionsSociety")
|
||
|
AddEventHandler("okokBanking:updateTransactionsSociety", function(wallet)
|
||
|
Wait(100)
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:SocietyInfo", function(cb)
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetSocietyTransactions", function(societyTranscb, societyID, societyAllDays)
|
||
|
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cbs, ids, allDays)
|
||
|
trans = cbs
|
||
|
walletMoney = wallet
|
||
|
societyDays = societyAllDays
|
||
|
societyIdent = societyID
|
||
|
societyTrans = societyTranscb
|
||
|
societyInfo = cb
|
||
|
if cb ~= nil then
|
||
|
if isBankOpened then
|
||
|
SetNuiFocus(true, true)
|
||
|
end
|
||
|
SendNUIMessage({
|
||
|
action = 'society_page',
|
||
|
walletMoney = wallet,
|
||
|
db = societyTrans,
|
||
|
graphDays = societyDays,
|
||
|
isInSociety = canAccessSociety,
|
||
|
societyInfo = societyInfo,
|
||
|
identifier = societyIdent,
|
||
|
isUpdate = true
|
||
|
})
|
||
|
end
|
||
|
end)
|
||
|
end, society)
|
||
|
end, society)
|
||
|
end)
|