262 lines
8.2 KiB
Lua
262 lines
8.2 KiB
Lua
local BANK = {
|
|
Data = {}
|
|
}
|
|
|
|
local activeBlips, bankPoints, atmPoints, markerPoints = {}, {}, {}, {}
|
|
local playerLoaded, uiActive, inMenu = false, false, false
|
|
|
|
--Functions
|
|
-- General data collecting thread
|
|
function BANK:Thread()
|
|
self:CreateBlips()
|
|
local data = self.Data
|
|
data.ped = PlayerPedId()
|
|
data.coord = GetEntityCoords(data.Ped)
|
|
playerLoaded = true
|
|
|
|
CreateThread(function ()
|
|
while playerLoaded do
|
|
data.coord = GetEntityCoords(data.ped)
|
|
data.ped = PlayerPedId()
|
|
bankPoints, atmPoints, markerPoints = {}, {}, {}
|
|
|
|
if (IsPedOnFoot(data.ped) and not ESX.PlayerData.dead) and not inMenu then
|
|
for i = 1, #Config.AtmModels do
|
|
local atm = GetClosestObjectOfType(data.coord.x, data.coord.y, data.coord.z, 0.7, Config.AtmModels[i], false, false, false)
|
|
if atm ~= 0 then
|
|
atmPoints[#atmPoints+1] = GetEntityCoords(atm)
|
|
end
|
|
end
|
|
|
|
for i = 1, #Config.Banks do
|
|
local bankDistance = #(data.coord - Config.Banks[i].Position.xyz)
|
|
if bankDistance <= 0.7 then
|
|
bankPoints[#bankPoints+1] = Config.Banks[i].Position.xyz
|
|
end
|
|
if Config.ShowMarker and bankDistance <= (Config.DrawMarker or 10) then
|
|
markerPoints[#markerPoints+1] = Config.Banks[i].Position.xyz
|
|
end
|
|
end
|
|
end
|
|
|
|
if next(bankPoints) and not uiActive then
|
|
self:TextUi(true)
|
|
end
|
|
|
|
if next(atmPoints) and not uiActive then
|
|
self:TextUi(true, true)
|
|
end
|
|
|
|
if not next(bankPoints) and not next(atmPoints) and uiActive then
|
|
self:TextUi(false)
|
|
end
|
|
|
|
Wait(1000)
|
|
end
|
|
end)
|
|
|
|
if not Config.ShowMarker then return end
|
|
|
|
CreateThread(function()
|
|
local wait = 1000
|
|
while playerLoaded do
|
|
if next(markerPoints) then
|
|
for i = 1, #markerPoints do
|
|
DrawMarker(20, markerPoints[i].x, markerPoints[i].y, markerPoints[i].z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.3, 0.2, 0.2, 187, 255, 0, 255, false, true, 2, false, nil, nil, false)
|
|
end
|
|
wait = 0
|
|
end
|
|
Wait(wait)
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- Handle text ui / Keypress
|
|
function BANK:TextUi(state, atm)
|
|
uiActive = state
|
|
if not state then
|
|
return ESX.HideUI()
|
|
end
|
|
ESX.TextUI(TranslateCap('press_e_banking'))
|
|
CreateThread(function()
|
|
while uiActive do
|
|
if IsControlJustReleased(0, 38) then
|
|
self:HandleUi(true, atm)
|
|
self:TextUi(false)
|
|
end
|
|
Wait(0)
|
|
end
|
|
end)
|
|
end
|
|
|
|
-- Create Blips
|
|
function BANK:CreateBlips()
|
|
local tmpActiveBlips = {}
|
|
for i = 1, #Config.Banks do
|
|
if type(Config.Banks[i].Blip) == 'table' and Config.Banks[i].Blip.Enabled then
|
|
local position = Config.Banks[i].Position
|
|
local bInfo = Config.Banks[i].Blip
|
|
local blip = AddBlipForCoord(position.x, position.y, position.z)
|
|
SetBlipSprite(blip, bInfo.Sprite)
|
|
SetBlipScale(blip, bInfo.Scale)
|
|
SetBlipColour(blip, bInfo.Color)
|
|
SetBlipAsShortRange(blip, true)
|
|
BeginTextCommandSetBlipName('STRING')
|
|
AddTextComponentSubstringPlayerName(bInfo.Label)
|
|
EndTextCommandSetBlipName(blip)
|
|
tmpActiveBlips[#tmpActiveBlips + 1] = blip
|
|
end
|
|
end
|
|
|
|
activeBlips = tmpActiveBlips
|
|
end
|
|
|
|
-- Remove blips
|
|
function BANK:RemoveBlips()
|
|
for i = 1, #activeBlips do
|
|
if DoesBlipExist(activeBlips[i]) then
|
|
RemoveBlip(activeBlips[i])
|
|
end
|
|
end
|
|
activeBlips = {}
|
|
end
|
|
|
|
-- Open / Close ui
|
|
function BANK:HandleUi(state, atm)
|
|
atm = atm or false
|
|
SetNuiFocus(state, state)
|
|
inMenu = state
|
|
ClearPedTasks(PlayerPedId())
|
|
if not state then
|
|
SendNUIMessage({
|
|
showMenu = false
|
|
})
|
|
return
|
|
end
|
|
ESX.TriggerServerCallback('esx_banking:getPlayerData', function(data)
|
|
SendNUIMessage({
|
|
showMenu = true,
|
|
openATM = atm,
|
|
datas = {
|
|
your_money_panel = {
|
|
accountsData = {{
|
|
name = "cash",
|
|
amount = data.money
|
|
}, {
|
|
name = "bank",
|
|
amount = data.bankMoney
|
|
}}
|
|
},
|
|
bankCardData = {
|
|
bankName = TranslateCap('bank_name'),
|
|
cardNumber = "2232 2222 2222 2222",
|
|
createdDate = "08/08",
|
|
name = data.playerName
|
|
},
|
|
transactionsData = data.transactionHistory
|
|
}
|
|
})
|
|
end)
|
|
end
|
|
|
|
function BANK:LoadNpc(index, netID)
|
|
CreateThread(function()
|
|
while not NetworkDoesEntityExistWithNetworkId(netID) do
|
|
Wait(200)
|
|
end
|
|
local npc = NetworkGetEntityFromNetworkId(netID)
|
|
TaskStartScenarioInPlace(npc, Config.Peds[index].Scenario, 0, true)
|
|
SetEntityProofs(npc, true, true, true, true, true, true, true, true)
|
|
SetBlockingOfNonTemporaryEvents(npc, true)
|
|
FreezeEntityPosition(npc, true)
|
|
SetPedCanRagdollFromPlayerImpact(npc, false)
|
|
SetPedCanRagdoll(npc, false)
|
|
SetEntityAsMissionEntity(npc, true, true)
|
|
SetEntityDynamic(npc, false)
|
|
end)
|
|
end
|
|
|
|
-- Events
|
|
RegisterNetEvent('esx_banking:closebanking', function()
|
|
BANK:HandleUi(false)
|
|
end)
|
|
|
|
RegisterNetEvent('esx_banking:pedHandler', function(netIdTable)
|
|
for i = 1, #netIdTable do
|
|
BANK:LoadNpc(i, netIdTable[i])
|
|
end
|
|
end)
|
|
|
|
RegisterNetEvent('esx_banking:updateMoneyInUI', function(doingType, bankMoney, money)
|
|
SendNUIMessage({
|
|
updateData = true,
|
|
data = {
|
|
type = doingType,
|
|
bankMoney = bankMoney,
|
|
money = money
|
|
}
|
|
})
|
|
end)
|
|
|
|
-- Handlers
|
|
-- Resource starting
|
|
AddEventHandler('onResourceStart', function(resource)
|
|
if resource ~= GetCurrentResourceName() then return end
|
|
BANK:Thread()
|
|
end)
|
|
|
|
-- Enable the script on player loaded
|
|
RegisterNetEvent('esx:playerLoaded', function()
|
|
BANK:Thread()
|
|
end)
|
|
|
|
-- Disable the script on player logout
|
|
RegisterNetEvent('esx:onPlayerLogout', function()
|
|
playerLoaded = false
|
|
end)
|
|
|
|
-- Resource stopping
|
|
AddEventHandler('onResourceStop', function(resource)
|
|
if resource ~= GetCurrentResourceName() then return end
|
|
BANK:RemoveBlips()
|
|
if uiActive then BANK:TextUi(false) end
|
|
end)
|
|
|
|
RegisterNetEvent('esx:onPlayerDeath', function() BANK:TextUi(false) end)
|
|
|
|
-- Nui Callbacks
|
|
RegisterNUICallback('close', function(data, cb)
|
|
BANK:HandleUi(false)
|
|
cb('ok')
|
|
end)
|
|
|
|
RegisterNUICallback('clickButton', function(data, cb)
|
|
if not data or not inMenu then
|
|
return cb('ok')
|
|
end
|
|
|
|
TriggerServerEvent("esx_banking:doingType", data)
|
|
cb('ok')
|
|
end)
|
|
|
|
RegisterNUICallback('checkPincode', function(data, cb)
|
|
if not data or not inMenu then
|
|
return cb('ok')
|
|
end
|
|
|
|
ESX.TriggerServerCallback("esx_banking:checkPincode", function(pincode)
|
|
if pincode then
|
|
cb({
|
|
success = true
|
|
})
|
|
ESX.ShowNotification(TranslateCap('pincode_found'), "success")
|
|
|
|
else
|
|
cb({
|
|
error = true
|
|
})
|
|
ESX.ShowNotification(TranslateCap('pincode_not_found'), "error")
|
|
end
|
|
end, data)
|
|
end)
|