diff --git a/client/main.lua b/client/main.lua index 9b6fe351..eb624e21 100644 --- a/client/main.lua +++ b/client/main.lua @@ -1,4 +1,4 @@ -ESX = nil +ESX = nil local isDead = false Citizen.CreateThread(function() @@ -9,20 +9,18 @@ Citizen.CreateThread(function() end) function ShowBillsMenu() - ESX.TriggerServerCallback('esx_billing:getBills', function(bills) ESX.UI.Menu.CloseAll() local elements = {} - for i=1, #bills, 1 do + for k,v in ipairs(bills) do table.insert(elements, { - label = ('%s - %s'):format(bills[i].label, _U('invoices_item', ESX.Math.GroupDigits(bills[i].amount))), - billID = bills[i].id + label = ('%s - %s'):format(v.label, _U('invoices_item', ESX.Math.GroupDigits(v.amount))), + billId = v.id }) end - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'billing', - { + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'billing', { title = _U('invoices'), align = 'bottom-right', elements = elements @@ -31,28 +29,20 @@ function ShowBillsMenu() ESX.TriggerServerCallback('esx_billing:payBill', function() ShowBillsMenu() - end, data.current.billID) + end, data.current.billId) end, function(data, menu) menu.close() end) end) - end --- Key controls -Citizen.CreateThread(function() - while true do - Citizen.Wait(0) - if IsControlJustReleased(0, 168) and not isDead and not ESX.UI.Menu.IsOpen('default', GetCurrentResourceName(), 'billing') then - ShowBillsMenu() - end +RegisterCommand('showbills', function() + if not isDead and not ESX.UI.Menu.IsOpen('default', GetCurrentResourceName(), 'billing') then + ShowBillsMenu() end -end) +end, false) -AddEventHandler('esx:onPlayerDeath', function(data) - isDead = true -end) +RegisterKeyMapping('showbills', _U('keymap_showbills'), 'keyboard', 'F7') -AddEventHandler('playerSpawned', function(spawn) - isDead = false -end) +AddEventHandler('esx:onPlayerDeath', function() isDead = true end) +AddEventHandler('playerSpawned', function(spawn) isDead = false end) diff --git a/locales/br.lua b/locales/br.lua index bee997ed..c0b129c1 100644 --- a/locales/br.lua +++ b/locales/br.lua @@ -7,4 +7,5 @@ Locales['br'] = { ['player_not_online'] = 'o jogador não está na cidade', ['no_money'] = 'você não tem dinheiro suficiente para pagar esta fatura', ['target_no_money'] = 'o cidadão ~r~não tem~s~ dinheiro suficiente para pagar a conta!', + ['keymap_showbills'] = 'open bills menu', } diff --git a/locales/de.lua b/locales/de.lua index d705bb66..3e4eaef1 100644 --- a/locales/de.lua +++ b/locales/de.lua @@ -7,4 +7,5 @@ Locales['de'] = { ['player_not_online'] = 'der Spieler ist nicht online', ['no_money'] = 'you do not have enough money to pay this bill', ['target_no_money'] = 'the player ~r~does not~s~ have enough money to pay the bill!', + ['keymap_showbills'] = 'open bills menu', } diff --git a/locales/en.lua b/locales/en.lua index 3973ba13..2d03ba00 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -7,4 +7,5 @@ Locales['en'] = { ['player_not_online'] = 'the player is not logged in', ['no_money'] = 'you do not have enough money to pay this bill', ['target_no_money'] = 'the player ~r~does not~s~ have enough money to pay the bill!', + ['keymap_showbills'] = 'open bills menu', } diff --git a/locales/es.lua b/locales/es.lua index 50f1ad23..10788119 100644 --- a/locales/es.lua +++ b/locales/es.lua @@ -7,4 +7,5 @@ Locales['es'] = { ['player_not_online'] = 'el jugador no está conectado', ['no_money'] = 'you do not have enough money to pay this bill', ['target_no_money'] = 'the player ~r~does not~s~ have enough money to pay the bill!', + ['keymap_showbills'] = 'open bills menu', } diff --git a/locales/fi.lua b/locales/fi.lua index 6c6327a9..34a45010 100644 --- a/locales/fi.lua +++ b/locales/fi.lua @@ -7,4 +7,5 @@ Locales['fi'] = { ['player_not_online'] = 'pelaaja ei ole sisäänkirjautuneena', ['no_money'] = 'sinulla ei ole tarpeeksi rahaa maksaaksesi tätä laskua.', ['target_no_money'] = 'pelaajalla ~r~ei ole~s~ tarpeeksi rahaa maksaakseentätä laskua', + ['keymap_showbills'] = 'open bills menu', } diff --git a/locales/fr.lua b/locales/fr.lua index a372d0e6..d8e23916 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -7,4 +7,5 @@ Locales['fr'] = { ['player_not_online'] = 'le joueur n\'est pas connecté', ['no_money'] = 'you do not have enough money to pay this bill', ['target_no_money'] = 'the player ~r~does not~s~ have enough money to pay the bill!', + ['keymap_showbills'] = 'open bills menu', } diff --git a/locales/pl.lua b/locales/pl.lua index e2cac017..59cebbff 100644 --- a/locales/pl.lua +++ b/locales/pl.lua @@ -7,4 +7,5 @@ Locales['pl'] = { ['player_not_online'] = 'gracz nie jest zalogowany', ['no_money'] = 'nie masz wystarczająco pieniędzy aby zapłacić tą fakture', ['target_no_money'] = 'gracz ~r~nie posiada~s~ wystarczająco pieniędzy aby zapłacić tą fakture!', + ['keymap_showbills'] = 'open bills menu', } diff --git a/locales/sv.lua b/locales/sv.lua index 496cc6d2..600246c0 100644 --- a/locales/sv.lua +++ b/locales/sv.lua @@ -7,4 +7,5 @@ Locales['sv'] = { ['player_not_online'] = 'personen är inte online', ['no_money'] = 'du har ~r~inte råd~s~ för att kunna betala räkningen', ['target_no_money'] = 'personen har ~r~inte råd~s~ för att betala räkningen', + ['keymap_showbills'] = 'open bills menu', } diff --git a/server/main.lua b/server/main.lua index ca96824a..c4e71ad5 100644 --- a/server/main.lua +++ b/server/main.lua @@ -4,205 +4,156 @@ TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) RegisterServerEvent('esx_billing:sendBill') AddEventHandler('esx_billing:sendBill', function(playerId, sharedAccountName, label, amount) - local _source = source - local xPlayer = ESX.GetPlayerFromId(_source) + local xPlayer = ESX.GetPlayerFromId(source) local xTarget = ESX.GetPlayerFromId(playerId) - amount = ESX.Math.Round(amount) + amount = ESX.Math.Round(amount) - TriggerEvent('esx_addonaccount:getSharedAccount', sharedAccountName, function(account) - - if amount < 0 then - print(('esx_billing: %s attempted to send a negative bill!'):format(xPlayer.identifier)) - elseif account == nil then - - if xTarget ~= nil then - MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)', - { - ['@identifier'] = xTarget.identifier, - ['@sender'] = xPlayer.identifier, - ['@target_type'] = 'player', - ['@target'] = xPlayer.identifier, - ['@label'] = label, - ['@amount'] = amount - }, function(rowsChanged) - TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_invoice')) - end) - end - - else - - if xTarget ~= nil then - MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)', - { - ['@identifier'] = xTarget.identifier, - ['@sender'] = xPlayer.identifier, + if amount > 0 and xTarget then + TriggerEvent('esx_addonaccount:getSharedAccount', sharedAccountName, function(account) + if account then + MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)', { + ['@identifier'] = xTarget.identifier, + ['@sender'] = xPlayer.identifier, ['@target_type'] = 'society', - ['@target'] = sharedAccountName, - ['@label'] = label, - ['@amount'] = amount + ['@target'] = sharedAccountName, + ['@label'] = label, + ['@amount'] = amount }, function(rowsChanged) - TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_invoice')) + xTarget.showNotification(_U('received_invoice')) + end) + else + MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)', { + ['@identifier'] = xTarget.identifier, + ['@sender'] = xPlayer.identifier, + ['@target_type'] = 'player', + ['@target'] = xPlayer.identifier, + ['@label'] = label, + ['@amount'] = amount + }, function(rowsChanged) + xTarget.showNotification(_U('received_invoice')) end) end - - end - end) - + end) + end end) ESX.RegisterServerCallback('esx_billing:getBills', function(source, cb) local xPlayer = ESX.GetPlayerFromId(source) - MySQL.Async.fetchAll('SELECT * FROM billing WHERE identifier = @identifier', { + MySQL.Async.fetchAll('SELECT amount, id, label FROM billing WHERE identifier = @identifier', { ['@identifier'] = xPlayer.identifier }, function(result) - local bills = {} - for i=1, #result, 1 do - table.insert(bills, { - id = result[i].id, - identifier = result[i].identifier, - sender = result[i].sender, - targetType = result[i].target_type, - target = result[i].target, - label = result[i].label, - amount = result[i].amount - }) - end - - cb(bills) + cb(result) end) end) ESX.RegisterServerCallback('esx_billing:getTargetBills', function(source, cb, target) local xPlayer = ESX.GetPlayerFromId(target) - MySQL.Async.fetchAll('SELECT * FROM billing WHERE identifier = @identifier', { - ['@identifier'] = xPlayer.identifier - }, function(result) - local bills = {} - for i=1, #result, 1 do - table.insert(bills, { - id = result[i].id, - identifier = result[i].identifier, - sender = result[i].sender, - targetType = result[i].target_type, - target = result[i].target, - label = result[i].label, - amount = result[i].amount - }) - end - - cb(bills) - end) + if xPlayer then + MySQL.Async.fetchAll('SELECT amount, id, label FROM billing WHERE identifier = @identifier', { + ['@identifier'] = xPlayer.identifier + }, function(result) + cb(result) + end) + else + cb({}) + end end) - -ESX.RegisterServerCallback('esx_billing:payBill', function(source, cb, id) +ESX.RegisterServerCallback('esx_billing:payBill', function(source, cb, billId) local xPlayer = ESX.GetPlayerFromId(source) - MySQL.Async.fetchAll('SELECT * FROM billing WHERE id = @id', { - ['@id'] = id + MySQL.Async.fetchAll('SELECT sender, target_type, target, amount FROM billing WHERE id = @id', { + ['@id'] = billId }, function(result) + if result[1] then + local amount = result[1].amount + local xTarget = ESX.GetPlayerFromIdentifier(result[1].sender) - local sender = result[1].sender - local targetType = result[1].target_type - local target = result[1].target - local amount = result[1].amount + if result[1].target_type == 'player' then + if xTarget then + if xPlayer.getMoney() >= amount then + MySQL.Async.execute('DELETE FROM billing WHERE id = @id', { + ['@id'] = billId + }, function(rowsChanged) + if rowsChanged == 1 then + xPlayer.removeMoney(amount) + xTarget.addMoney(amount) - local xTarget = ESX.GetPlayerFromIdentifier(sender) + xPlayer.showNotification(_U('paid_invoice', ESX.Math.GroupDigits(amount))) + xTarget.showNotification(_U('received_payment', ESX.Math.GroupDigits(amount))) + end - if targetType == 'player' then + cb() + end) + elseif xPlayer.getAccount('bank').money >= amount then + MySQL.Async.execute('DELETE FROM billing WHERE id = @id', { + ['@id'] = billId + }, function(rowsChanged) + if rowsChanged == 1 then + xPlayer.removeAccountMoney('bank', amount) + xTarget.addAccountMoney('bank', amount) - if xTarget ~= nil then - - if xPlayer.getMoney() >= amount then - - MySQL.Async.execute('DELETE from billing WHERE id = @id', { - ['@id'] = id - }, function(rowsChanged) - xPlayer.removeMoney(amount) - xTarget.addMoney(amount) - - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount))) - TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount))) + xPlayer.showNotification(_U('paid_invoice', ESX.Math.GroupDigits(amount))) + xTarget.showNotification(_U('received_payment', ESX.Math.GroupDigits(amount))) + end + cb() + end) + else + xTarget.showNotification(_U('target_no_money')) + xPlayer.showNotification(_U('no_money')) cb() - end) - - elseif xPlayer.getBank() >= amount then - - MySQL.Async.execute('DELETE from billing WHERE id = @id', { - ['@id'] = id - }, function(rowsChanged) - xPlayer.removeAccountMoney('bank', amount) - xTarget.addAccountMoney('bank', amount) - - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount))) - TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount))) - - cb() - end) - - else - TriggerClientEvent('esx:showNotification', xTarget.source, _U('target_no_money')) - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('no_money')) - - cb() - end - - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('player_not_online')) - cb() - end - - else - - TriggerEvent('esx_addonaccount:getSharedAccount', target, function(account) - - if xPlayer.getMoney() >= amount then - - MySQL.Async.execute('DELETE from billing WHERE id = @id', { - ['@id'] = id - }, function(rowsChanged) - xPlayer.removeMoney(amount) - account.addMoney(amount) - - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount))) - if xTarget ~= nil then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount))) - end - - cb() - end) - - elseif xPlayer.getBank() >= amount then - - MySQL.Async.execute('DELETE from billing WHERE id = @id', { - ['@id'] = id - }, function(rowsChanged) - xPlayer.removeAccountMoney('bank', amount) - account.addMoney(amount) - - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount))) - if xTarget ~= nil then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount))) - end - - cb() - end) - - else - TriggerClientEvent('esx:showNotification', xPlayer.source, _U('no_money')) - - if xTarget ~= nil then - TriggerClientEvent('esx:showNotification', xTarget.source, _U('target_no_money')) end - + else + xPlayer.showNotification(_U('player_not_online')) cb() end - end) + else + TriggerEvent('esx_addonaccount:getSharedAccount', result[1].target, function(account) + if xPlayer.getMoney() >= amount then + MySQL.Async.execute('DELETE FROM billing WHERE id = @id', { + ['@id'] = billId + }, function(rowsChanged) + if rowsChanged == 1 then + xPlayer.removeMoney(amount) + account.addMoney(amount) + xPlayer.showNotification(_U('paid_invoice', ESX.Math.GroupDigits(amount))) + if xTarget then + xTarget.showNotification(_U('received_payment', ESX.Math.GroupDigits(amount))) + end + end + + cb() + end) + elseif xPlayer.getAccount('bank').money >= amount then + MySQL.Async.execute('DELETE FROM billing WHERE id = @id', { + ['@id'] = billId + }, function(rowsChanged) + if rowsChanged == 1 then + xPlayer.removeAccountMoney('bank', amount) + account.addMoney(amount) + xPlayer.showNotification(_U('paid_invoice', ESX.Math.GroupDigits(amount))) + + if xTarget then + xTarget.showNotification(_U('received_payment', ESX.Math.GroupDigits(amount))) + end + end + + cb() + end) + else + if xTarget then + xTarget.showNotification(_U('target_no_money')) + end + + xPlayer.showNotification(_U('no_money')) + cb() + end + end) + end end - end) -end) \ No newline at end of file +end)