72 Commits

Author SHA1 Message Date
Jim Shield
41bedcc6ca /polcharge for police billing + Optimize + Fixes 2022-07-05 19:52:33 +01:00
Jim Shield
a4413ea5c6 Stop asking me about gks-phone 2022-07-04 00:04:35 +01:00
Jim Shield
8adf3c3829 Stop giving the charged person tickets 2022-06-22 14:34:24 +01:00
Jim Shield
f5753df4b2 rollback notification changes 2022-06-22 14:20:36 +01:00
Jim Shield
ec9dc51ccf Quick fix for job tickets 2022-06-21 15:18:01 +01:00
Jim Shield
4b028d75b1 Gang Support in cash registers 2022-06-21 15:11:31 +01:00
Jim Shield
2302ff987b I hate github 2022-06-21 15:11:02 +01:00
Jim Shield
d29d2d6904 Gang support for cash regsiters 2022-06-21 15:10:35 +01:00
Jim Shield
f535df6b9c Rollback code to fix notification breaking 2022-06-16 00:03:10 +01:00
Jim Shield
170f680ef8 Update/Fix gks install support info 2022-06-15 20:24:38 +01:00
Jim Shield
2fc3b56e22 Rollback 2022-06-10 14:35:46 +01:00
Jim Shield
a18db3d6b9 Trying to fix inventory space checks 2022-06-10 14:32:05 +01:00
Jim Shield
da5e4c604f Tiny optimization 2022-06-08 22:15:39 +01:00
Jim Shield
284700bafb Fix for double phone payments 2022-06-06 20:42:02 +01:00
Jim Shield
ee532d5e3e Improved support of gks-phone 2022-05-23 17:19:49 +01:00
Jim Shield
c63fbc7144 Version Bump + small formatting changes 2022-05-21 11:36:51 +01:00
Jim Shield
c3d6425476 Better account loading + ps-progressbar support 2022-05-21 11:23:36 +01:00
Jim Shield
eb31c78bc6 qb-menu icon support 2022-05-21 11:01:47 +01:00
jimathy
d78fdf85df Add notify for phone payments being accepted 2022-05-18 11:18:07 +01:00
jimathy
05d4dfc984 /cashregister command now usable for outside payments
Jimathy patch 1
2022-05-05 21:42:17 +01:00
jimathy
100323927e Explanation of new duty variables 2022-05-05 21:39:09 +01:00
jimathy
35e166d049 don't need the variable here 2022-05-05 21:37:45 +01:00
jimathy
9a14e004e9 Attempting restricted payments outside of job 2022-05-05 21:34:34 +01:00
jimathy
dbd3f33099 Update README.md 2022-05-05 10:50:10 +01:00
jimathy
89b0549090 Fix Bossmeny support for banking 2022-05-04 20:44:57 +01:00
jimathy
0afbee61e0 Fix Invoices not going to society accounts 2022-05-04 10:17:43 +01:00
jimathy
d1ee4dbf8c Merge pull request #6 from jimathy/jimathy-patch-2
Debug Missing Jobs
2022-04-25 10:06:03 +01:00
jimathy
8af82e6d13 Don't break if job isn't found 2022-04-25 10:04:56 +01:00
jimathy
2e4fcff333 Debug for missing jobs in config 2022-04-25 10:01:51 +01:00
jimathy
a1fd2d5974 Config.Gabz default false 2022-04-24 11:27:10 +01:00
jimathy
a256b5e2f9 Banking Ped spawn location on the floor 2022-04-24 11:15:24 +01:00
jimathy
7a24a8836d Debug default 2022-04-24 11:08:22 +01:00
jimathy
d32b191689 Bug Fixes 2022-04-24 11:06:12 +01:00
jimathy
41c8e3698e Beta GKSPhone invoice support 2022-04-21 19:53:48 +01:00
jimathy
695b968ff7 Update README.md 2022-04-21 19:51:22 +01:00
jimathy
8acacd2cd1 vector4 2022-04-20 20:48:11 +01:00
jimathy
abe360bc6b Ped Support and better Gabz Support in config 2022-04-20 13:52:32 +01:00
jimathy
3c3fe054e0 Merge pull request #5 from jimathy/jimathy-patch-2
Debug mode + Custom Ticket Cashin + Gabz Locations
2022-04-19 21:32:35 +01:00
jimathy
4da8c039e7 Disable debug mode 2022-04-19 21:32:12 +01:00
jimathy
a9f7ac5663 Default setting to vanilla location 2022-04-19 21:30:08 +01:00
jimathy
712096887b Debug mode + Custom Ticket Cashin + Gabz Locations 2022-04-19 21:26:43 +01:00
jimathy
892acf1283 Add toggles for bossmenu/management + nearbylist 2022-04-15 18:25:27 +01:00
jimathy
13d83a066a Fix job label on payment popup 2022-04-12 21:10:48 +01:00
jimathy
88765357b3 Fix job label on payment popup 2022-04-12 21:09:44 +01:00
jimathy
f9029f0951 Commission update 2022-04-11 18:59:47 +01:00
jimathy
65f51520fb Update Readme with new phone event and info 2022-04-11 18:58:55 +01:00
jimathy
7e92b852cf fix bank popups and popup job tickets 2022-04-06 22:30:26 +01:00
jimathy
a63b40c11f fix pay popups for shops with no logo 2022-04-06 22:18:38 +01:00
jimathy
644294546e qb-management export update 2022-04-03 20:52:10 +01:00
jimathy
4dbe600680 qb-management export update 2022-04-03 20:51:34 +01:00
jimathy
9d5086e5d5 qb-management export update 2022-04-03 20:41:07 +01:00
jimathy
b06cb05266 Merge pull request #3 from stacheboi/main
Fix for Player Receiving Cash From Self
2022-03-26 17:50:06 +00:00
jimathy
f16a0b0d1f Removed loops, it was being too strict 2022-03-17 10:57:14 +00:00
jimathy
48003e09a6 Fix for everyone being able to access boss account 2022-03-17 10:43:04 +00:00
stacheboi
95459f63a8 Fix for Player Receiving Cash From Self
When you give someone cash it shows they received money from themself. This show show the sending players name instead.
2022-03-16 21:17:10 -04:00
jimathy
0065af7c9d Notify on accepted payment 2022-03-15 21:32:49 +00:00
jimathy
74990226a9 fix for fix. I need a rest 2022-03-13 13:15:57 +00:00
jimathy
2e5bcc4d86 Fix for bank popup payments 2022-03-13 13:03:09 +00:00
jimathy
185c641f60 fix for tickets with new popup 2022-03-12 12:56:30 +00:00
jimathy
3e036d6996 v2.1 - Add confirmation popups for payments 2022-03-11 00:30:49 +00:00
jimathy
a4a67da493 Move bank enabling varibles to Config.lua 2022-03-10 23:42:35 +00:00
jimathy
2dc29de368 Move bank enabling varibles to Config.lua 2022-03-10 23:41:49 +00:00
jimathy
8379179631 Update config.lua 2022-02-25 12:52:10 +00:00
jimathy
e3e8d71bea Fix for data being nil 2022-02-25 10:10:08 +00:00
jimathy
07c0195d26 Support for upcoming features 2022-02-23 20:35:50 +00:00
jimathy
0df97ac406 oops, gangmenu isn't bossmenu 2022-02-21 09:05:56 +00:00
jimathy
ad4f5dd203 Improve disabling certain bank features 2022-02-20 16:22:41 +00:00
jimathy
76ff8dcfec Remov /cashregister command, didn't work correctly 2022-02-20 15:32:42 +00:00
jimathy
61fc56d82d Add ability to disable receipts 2022-02-20 15:30:15 +00:00
jimathy
b4d185105d Pulling job names from wrong place
This caused errors while trying to access banks or ATMs if you had jobs in the config but not in your shared.

This was left in by mistake
2022-02-20 15:09:50 +00:00
jimathy
4e16ff4e04 Added banking images to readme 2022-02-19 12:18:23 +00:00
jimathy
7d059c27d0 Updated Readme 2022-02-19 11:57:01 +00:00
7 changed files with 789 additions and 341 deletions

View File

@@ -1,14 +1,16 @@
# jim-payments
QBCore based payment system
If you think I did a good job here, consider donating as it keeps by lights on and my cat fat:
https://ko-fi.com/jixelpatterns
--------------
If you use a different phone/invoice system let me know and I will add support for it as best I can!
--------------
Enchanced QB-Input payment system from my other scripts now free on its own
![General](https://i.imgur.com/37d2mE3.jpeg) ![General](https://i.imgur.com/ICbQyeQ.jpeg)
![General](https://i.imgur.com/37d2mE3.jpeg) ![General](https://i.imgur.com/AIdXzxX.jpeg)
![General](https://i.imgur.com/RYADcI2.jpeg) ![General](https://i.imgur.com/ICbQyeQ.jpeg)
# Installation
To make use of this payment system you need trigger the event
@@ -16,16 +18,18 @@ To make use of this payment system you need trigger the event
```jim-payments:client:Charge```
for example with qb-target
```
```lua
exports['qb-target']:AddBoxZone("Receipt", vector3(1589.14, 6458.26, 26.01), 0.6, 0.6, { name="Receipt", heading = 335.0, debugPoly=debugPoly, minZ = 26.01, maxZ = 26.81, },
{ options = { { event = "jim-payments:client:Charge", icon = "fas fa-credit-card", label = "Charge Customer", job = "popsdiner" } }, distance = 2.0 })
```
It currently requires you to be on duty to charge someone
This does not need to be added to **MY** job scripts, they already have built in support
--------------
To make use of the ticket reward system for workers you need to add the ticket item to your shared items lua:
```
```lua
["payticket"] = {["name"] = "payticket", ["label"] = "Receipt", ["weight"] = 150, ["type"] = "item", ["image"] = "ticket.png", ["unique"] = false, ["useable"] = false, ["shouldClose"] = false, ["combinable"] = nil, ["description"] = "Cash these in at the bank!"},
```
@@ -36,16 +40,50 @@ Add the ticket image to your inventory script
--------------
To get tickets from phone invoices you NEED to add it to the event when a payment is accepted:
For QB-Phone:
Go to [qb] > qb-phone > client > main.lua
- Around line 645 there should be the PayInvoice NUICallBack
- Directly under this line:
```TriggerServerEvent('qb-phone:server:BillingEmail', data, true)```
- Directly *above* this line:
```lua
TriggerServerEvent('qb-phone:server:BillingEmail', data, true)
```
- Add this line:
```lua
TriggerServerEvent('jim-payments:Tickets:Give', data)
```
```TriggerServerEvent('jim-payments:Tickets:Give', amount, society)```
For GKSPhone:
Go to gks-phone > server > serverapi.lua
- Search for the event: ```gksphone:faturapayBill```
- Under this line:
```lua
Ply.Functions.RemoveMoney('bank', amount, "paid-invoice")
```
- Add these lines:
```lua
TriggerEvent('jim-payments:Tickets:Give', { sender = Ply.PlayerData.charinfo.firstname, senderCitizenId = data[1].sendercitizenid, society = data[1].society, amount = data[1].amount })
```
--------------
NOTE: If you are converting from my older job scripts, I recommend removing the previous triggers from qb-phone
The latest banking systems are very simple to use and add,
simply look in the atms.lua and change the config options at the top
Choose wether to use atm's, choose wether to use banking locations
Choose wether to add bank blips (if you want to disable qb-banking)
Choose wether to add ATM blips (if you like $ signs)
--------------
New Commission system added
This brings more config options to find tune the script
Choose wether people get commission from every sale
Choose if EVERY worker gets Commission that is on duty
Choose if Commission is limited by MinAmountForTicket
Choose if the worker charging the customer gets double commission

336
atms.lua
View File

@@ -3,97 +3,12 @@ local QBCore = exports['qb-core']:GetCoreObject()
-- This script is a simple replacement for QB-Banking and QB-ATMs
-- It uses QB-Input and server callbacks to retreive info about accounts and cash
-- This requires QB-Target and has the location of every ATM, ATM prop and bank window
-- If Config.useATM = false, then none of this load
--Specific to ATM config options
Config.useATM = true
Config.useBanks = true
Config.BankBlips = true
Config.ATMBlips = false
Config.ATMModels = {"prop_atm_01", "prop_atm_02", "prop_atm_03", "prop_fleeca_atm" }
Config.ATMLocations = {
--PACIFIC BANK 10 ATMS
vector3(265.9, 213.86, 106.28),
vector3(265.56, 212.98, 106.28),
vector3(265.19, 211.91, 106.28),
vector3(264.86, 211.03, 106.28),
vector3(264.52, 210.06, 106.28),
vector3(236.64, 219.72, 106.29),
vector3(237.04, 218.72, 106.29),
vector3(237.5, 217.87, 106.29),
vector3(237.93, 216.94, 106.29),
vector3(238.36, 216.03, 106.29),
--WALL ATMS
vector3(-386.54, 6046.29, 31.5),
vector3(-282.82, 6226.24, 31.49),
vector3(-132.74, 6366.79, 31.48),
vector3(-95.76, 6457.41, 31.46),
vector3(-97.52, 6455.65, 31.47),
vector3(155.95, 6642.99, 31.6),
vector3(173.92, 6638.16, 31.57),
vector3(2558.65, 350.92, 108.62),
vector3(1077.78, -776.64, 58.35),
vector3(1138.14, -468.88, 66.73),
vector3(1166.93, -455.96, 66.81),
vector3(285.37, 143.07, 104.17),
vector3(-165.43, 234.81, 94.92),
vector3(-165.4, 232.73, 94.92),
vector3(-1410.41, -98.76, 52.43),
vector3(-1409.85, -100.51, 52.38),
vector3(-1206.0, -324.94, 37.86),
vector3(-1205.23, -326.55, 37.86),
vector3(-2072.28, -317.27, 13.32),
vector3(-2974.7, 380.15, 15.0),
vector3(-2959.01, 487.45, 15.46),
vector3(-2956.87, 487.36, 15.46),
vector3(-3043.98, 594.32, 7.74),
vector3(-3241.35, 997.74, 12.55),
vector3(-1305.59, -706.64, 25.32),
vector3(-537.85, -854.69, 29.28),
vector3(-709.98, -818.71, 23.73),
vector3(-712.87, -818.71, 23.73),
vector3(-526.71, -1223.18, 18.45),
vector3(-256.47, -715.94, 33.55),
vector3(-259.13, -723.29, 33.54),
vector3(-203.82, -861.3, 30.27),
vector3(111.38, -774.96, 31.44),
vector3(114.56, -776.13, 31.42),
vector3(112.46, -819.65, 31.34),
vector3(118.93, -883.68, 31.12),
vector3(-846.97, -340.29, 38.68),
vector3(-846.41, -341.41, 38.68),
vector3(-262.21, -2012.17, 30.15),
vector3(-273.23, -2024.32, 30.15),
vector3(24.46, -945.94, 29.36),
vector3(-254.48, -692.74, 33.61),
vector3(-1569.95, -546.94, 34.96),
vector3(-1570.91, -547.63, 34.96),
vector3(289.14, -1282.29, 29.6),
vector3(289.18, -1256.84, 29.44),
vector3(296.04, -896.22, 29.24),
vector3(296.74, -894.26, 29.24),
vector3(-301.63, -829.73, 32.43),
vector3(-303.23, -829.44, 32.43),
vector3(5.27, -919.87, 29.56),
vector3(-1200.61, -885.62, 13.26),
}
Config.BankLocations = {
vector3(149.9, -1040.46, 29.37),
vector3(314.23, -278.83, 54.17),
vector3(-350.8, -49.57, 49.04),
vector3(-1213.0, -330.39, 37.79),
vector3(-2962.71, 483.0, 15.7),
vector3(1175.07, 2706.41, 38.09),
vector3(247.44, 223.22, 106.29),
vector3(-113.22, 6470.03, 31.63),
vector3(242.25, 225.15, 106.29)
--vector3(252.41, 221.41, 106.29)
}
local Targets = {}
local Peds = {}
local BankLoc = Config.VanBankLocations
local ATMLoc = Config.VanATMLocations
local function cv(amount)
local formatted = amount
@@ -105,22 +20,26 @@ local function cv(amount)
end
return formatted
end
local function createBlips()
local function loadModel(model) if Config.Debug then print("Debug: Loading Model: '"..model.."'") end RequestModel(model) while not HasModelLoaded(model) do Wait(0) end end
local function unloadModel(model) if Config.Debug then print("Debug: Removing Model: '"..model.."'") end SetModelAsNoLongerNeeded(model) end
local bossroles = {}
local gangroles = {}
CreateThread(function()
if Config.useATM then
if Config.BankBlips then
for k, v in pairs(Config.BankLocations) do
if Config.ATMBlips then
for k, v in pairs(Config.WallATMLocations) do
blip = AddBlipForCoord(v)
SetBlipSprite(blip, 108)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.55)
SetBlipColour(blip, 2)
SetBlipColour(blip, 3)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("Bank")
AddTextComponentString("ATM")
EndTextCommandSetBlipName(blip)
end
end
if Config.ATMBlips then
for k, v in pairs(Config.ATMLocations) do
blip = AddBlipForCoord(v)
SetBlipSprite(blip, 108)
@@ -134,59 +53,91 @@ local function createBlips()
end
end
end
end
AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName() == resource then createBlips() end end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() createBlips() end)
Citizen.CreateThread(function()
local bossroles = {}
for k, v in pairs(Config.Jobs) do
for l, b in pairs(QBCore.Shared.Jobs[tostring(k)].grades) do
if QBCore.Shared.Jobs[tostring(k)].grades[l].isboss == true then
if bossroles[tostring(k)] ~= nil then
if bossroles[tostring(k)] > tonumber(l) then bossroles[tostring(k)] = tonumber(l) end
else bossroles[tostring(k)] = tonumber(l)
if Config.useBanks then
if Config.BankBlips then
for k,v in pairs(Config.BankLocations) do
for l, b in pairs(v) do
blip = AddBlipForCoord(b)
SetBlipSprite(blip, 108)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.55)
SetBlipColour(blip, 2)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("Bank")
EndTextCommandSetBlipName(blip)
break
end
end
end
end
if Config.useATM or Config.useBanks then
for k, v in pairs(QBCore.Shared.Jobs) do ---Grabs the list of jobs
if QBCore.Shared.Jobs[tostring(k)] then
for l, b in pairs(QBCore.Shared.Jobs[tostring(k)].grades) do -- Grabs the list of grades
if QBCore.Shared.Jobs[tostring(k)].grades[l].isboss == true then -- Checks the grade if is boss
if bossroles[tostring(k)] ~= nil then -- checks if the line exists
if bossroles[tostring(k)] > tonumber(l) then bossroles[tostring(k)] = tonumber(l) end -- the
else bossroles[tostring(k)] = tonumber(l)
end
end
end
end
end
local gangroles = {}
for k, v in pairs(QBCore.Shared.Gangs) do
for l, b in pairs(QBCore.Shared.Gangs[tostring(k)].grades) do
if tostring(k) ~= "none" then
if QBCore.Shared.Gangs[tostring(k)].grades[l].isboss == true then
if gangroles[tostring(k)] ~= nil then
if gangroles[tostring(k)] > tonumber(l) then gangroles[tostring(k)] = tonumber(l) end
else gangroles[tostring(k)] = tonumber(l)
for k, v in pairs(QBCore.Shared.Gangs) do
if QBCore.Shared.Gangs[tostring(k)] then
for l, b in pairs(QBCore.Shared.Gangs[tostring(k)].grades) do
if tostring(k) ~= "none" then
if QBCore.Shared.Gangs[tostring(k)].grades[l].isboss == true then
if gangroles[tostring(k)] ~= nil then
if gangroles[tostring(k)] > tonumber(l) then gangroles[tostring(k)] = tonumber(l) end
else gangroles[tostring(k)] = tonumber(l)
end
end
end
end
end
end
end
end
if Config.useATM then
exports['qb-target']:AddTargetModel(Config.ATMModels, { options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-alt", label = "Use ATM", id = "atm" },}, distance = 1.5, })
for k,v in pairs(Config.ATMLocations) do
exports['qb-target']:AddCircleZone("jimatm"..k, vector3(tonumber(v.x), tonumber(v.y), tonumber(v.z)+0.2), 0.5, { name="jimatm"..k, debugPoly=false, useZ=true, },
for k,v in pairs(Config.WallATMLocations) do
Targets["jimwallatm"..k] =
exports['qb-target']:AddCircleZone("jimwallatm"..k, vector3(tonumber(v.x), tonumber(v.y), tonumber(v.z)+0.2), 0.5, { name="jimwallatm"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-alt", label = "Use ATM", id = "atm" },
--[[{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Transfer Money", id = "transfer" },]] }, distance = 1.5 })
--{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Transfer Money", id = "transfer" },
}, distance = 1.5 })
end
for k,v in pairs(Config.ATMLocations) do
Targets["jimatm"..k] =
exports['qb-target']:AddCircleZone("jimatm"..k, vector3(tonumber(v.x), tonumber(v.y), tonumber(v.z)+0.2), 0.5, { name="jimatm"..k, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-alt", label = "Use ATM", id = "atm" },
--{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Transfer Money", id = "transfer" },
}, distance = 1.5 })
end
end
if Config.useBanks then
for k,v in pairs(Config.BankLocations) do
exports['qb-target']:AddCircleZone("jimbank"..k, vector3(tonumber(v.x), tonumber(v.y), tonumber(v.z)), 2.0, { name="jimbank"..k, debugPoly=false, useZ=true, },
{ options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-piggy-bank", label = "Use Bank", id = "bank" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Transfer Money", id = "transfer" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-dollar", label = "Access Savings", id = "savings" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-building", label = "Access Society Account", id = "society", job = bossroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Society Money Transfer", id = "societytransfer", job = bossroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-building", label = "Gang Society Account", id = "gang", gang = gangroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Gang Money Transfer", id = "gangtransfer", gang = gangroles }, }, distance = 2.5 })
for l, b in pairs(v) do
Targets["jimbank"..k..l] =
exports['qb-target']:AddCircleZone("jimbank"..k..l, vector3(tonumber(b.x), tonumber(b.y), tonumber(b.z)+0.2), 2.0, { name="jimbank"..k..l, debugPoly=Config.Debug, useZ=true, },
{ options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-piggy-bank", label = "Use Bank", id = "bank" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Transfer Money", id = "transfer" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-dollar", label = "Access Savings", id = "savings" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-building", label = "Access Society Account", id = "society", job = bossroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Society Money Transfer", id = "societytransfer", job = bossroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-building", label = "Gang Society Account", id = "gang", gang = gangroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = "Gang Money Transfer", id = "gangtransfer", gang = gangroles }, },
distance = 2.5 })
if Config.Peds then
local i = math.random(1, #Config.PedPool)
loadModel(Config.PedPool[i])
if Peds["jimbank"..k..l] == nil then Peds["jimbank"..k..l] = CreatePed(0, Config.PedPool[i], vector3(tonumber(b.x), tonumber(b.y), tonumber(b.z)-1.03), b[4], false, false) end
if Config.Debug then print("Ped Created - 'jimbank"..k..l.."'") end
end
end
end
end
end)
@@ -202,26 +153,33 @@ local function PlayATMAnimation(animation)
end
end
local function GrabAccount(type, job)
local p = promise.new()
QBCore.Functions.TriggerCallback('jim-payments:ManageWrapper', function(cb) p:resolve(cb) end, type, job)
return Citizen.Await(p)
end
RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
--this grabs all the info from names to savings account numbers in the databases
while name == nil do
QBCore.Functions.TriggerCallback('jim-payments:ATM:Find', function(cb1, cb2, cb3, cb4, cb5, cb6, cb7) name = cb1 cash = cb2 bank = cb3 account = cb4 cid = cb5 savbal = cb6 aid = cb7 end)
Citizen.Wait(100)
end
while society == nil do
QBCore.Functions.TriggerCallback('qb-bossmenu:server:GetAccount', function(cb) society = cb end, PlayerJob.name)
Citizen.Wait(100)
end
while gsociety == nil do
QBCore.Functions.TriggerCallback('qb-gangmenu:server:GetAccount', function(cb) gsociety = cb end, PlayerGang.name)
Citizen.Wait(100)
local p = promise.new()
QBCore.Functions.TriggerCallback('jim-payments:ATM:Find', function(cb) p:resolve(cb) end) local info = Citizen.Await(p)
local society local gsociety local cancelled = false
if Config.Manage then
society = GrabAccount("GetAccount", PlayerJob.name)
Wait(200)
gsociety = GrabAccount("GetGangAccount", PlayerGang.name)
else
local p = promise.new()
QBCore.Functions.TriggerCallback('qb-bossmenu:server:GetAccount', function(cb) p:resolve(cb) end, PlayerJob.name) society = Citizen.Await(p)
local p2 = promise.new()
QBCore.Functions.TriggerCallback('qb-gangmenu:server:GetAccount', function(cb) p2:resolve(cb) end, PlayerGang.name) gsociety = Citizen.Await(p2)
end
local atmbartime = 2500
local setoptions = {}
if data.id == "atm" then
setoptions = { { value = "withdraw", text = "Withdrawl" }, }
setview = "Welcome back, "..name.."<br><br>- Citizen ID -<br>"..cid.."<br><br>- Balances -<br>🏦Bank - $"..cv(bank).."<br>💵Cash - $"..cv(cash)..'<br><br>- Options -'
setview = "<center><img src=https://static.wikia.nocookie.net/gtawiki/images/b/bd/Fleeca-GTAV-Logo.png width=200px></center><br>Welcome back, "..info.name.."<br><br>- Citizen ID -<br>"..info.cid.."<br><br>- Balances -<br>🏦Bank - $"..cv(info.bank).."<br>💵Cash - $"..cv(info.cash)..'<br><br>- Options -'
setheader = "💵 ATM Banking 💵"
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = '💵 Amount to transfer' }, }
@@ -229,9 +187,9 @@ RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
local playerPed = PlayerPedId()
local playerCoords = GetEntityCoords(playerPed, true)
local hash = GetHashKey(v)
local atm = IsObjectNearPoint(hash, playerCoords.x, playerCoords.y, playerCoords.z, 1.5)
local atm = IsObjectNearPoint(hash, playerCoords.x, playerCoords.y, playerCoords.z, 1.6)
if atm then
local obj = GetClosestObjectOfType(playerCoords.x, playerCoords.y, playerCoords.z, 1.5, v, false, false, false)
local obj = GetClosestObjectOfType(playerCoords.x, playerCoords.y, playerCoords.z, 1.6, v, false, false, false)
local atmCoords = GetEntityCoords(obj, false)
TaskTurnPedToFaceEntity(playerPed, obj, 1000)
Wait(1000)
@@ -239,14 +197,14 @@ RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
QBCore.Functions.Progressbar("accessing_atm", "Accessing ATM", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
end
end
elseif data.id == "bank" then
setoptions = { { value = "withdraw", text = "Withdrawl" }, { value = "deposit", text = "Deposit" } }
setview = "Welcome back, "..name.."<br><br>- Account -<br>"..account.."<br>"..cid.."<br><br>- Balances -<br>🏦Bank - $"..cv(bank).."<br>💵Cash - $"..cv(cash).."<br><br>- Options -"
setview = "Welcome back, "..info.name.."<br><br>- Account -<br>"..info.account.."<br>"..info.cid.."<br><br>- Balances -<br>🏦Bank - $"..cv(info.bank).."<br>💵Cash - $"..cv(info.cash).."<br><br>- Options -"
setheader = "🏦 Banking 🏦"
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = '💵 Amount to transfer' }, }
@@ -254,12 +212,12 @@ RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
QBCore.Functions.Progressbar("accessing_atm", "Accessing Bank", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
elseif data.id == "transfer" then
setoptions = { { value = "transfer", text = "Transfer" } }
setview = "Welcome back, "..name.."<br><br>- Account -<br>"..account.."<br>"..cid.."<br><br>- Balances -<br>🏦Bank - $"..cv(bank).."<br><br>- Options -"
setview = "Welcome back, "..info.name.."<br><br>- Account -<br>"..info.account.."<br>"..info.cid.."<br><br>- Balances -<br>🏦Bank - $"..cv(info.bank).."<br><br>- Options -"
setheader = "🔀 Transfer Services 🔀"
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'text', isRequired = true, name = 'account', text = '🏦 Account no.' },
@@ -268,25 +226,25 @@ RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
QBCore.Functions.Progressbar("accessing_atm", "Accessing Transfers", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
elseif data.id == "savings" then
setoptions = { { value = "withdraw", text = "Withdrawl" }, { value = "deposit", text = "Deposit" } }
setview = "Welcome back, "..name.."<br><br>- Account Info -<br>Savings ID: "..aid.."<br>"..cid.."<br><br>- Balances -<br>💰Savings - $"..cv(savbal).."<br>🏦Bank - $"..cv(bank).."<br><br>- Options -"
setview = "Welcome back, "..info.name.."<br><br>- Account Info -<br>Savings ID: "..info.aid.."<br>"..info.cid.."<br><br>- Balances -<br>💰Savings - $"..cv(info.savbal).."<br>🏦Bank - $"..cv(info.bank).."<br><br>- Options -"
setheader = "💰 Savings 💰"
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = '💵 Amount to transfer' }, }
{ type = 'number', isRequired = true, name = 'amount', text = '💵 Amount to transfer' }, }
PlayATMAnimation('enter')
QBCore.Functions.Progressbar("accessing_atm", "Accessing Savings", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
elseif data.id == "society" then
setoptions = { { value = "withdraw", text = "Withdrawl" }, { value = "deposit", text = "Deposit" } }
setview = "Welcome back, "..name.."<br><br>- Society Account -<br>"..PlayerJob.label.."<br><br>- Balances -<br>🏢"..PlayerJob.label.." - $"..cv(society).."<br>🏦Bank - $"..cv(bank).."<br><br>- Options -"
setview = "Welcome back, "..info.name.."<br><br>- Society Account -<br>"..PlayerJob.label.."<br><br>- Balances -<br>🏢"..PlayerJob.label.." - $"..cv(society).."<br>🏦Bank - $"..cv(info.bank).."<br><br>- Options -"
setheader = "🏢 Society Banking 🏢"
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = '💵 Amount to transfer' }, }
@@ -294,12 +252,12 @@ RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
QBCore.Functions.Progressbar("accessing_atm", "Accessing Society Account", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
elseif data.id == "societytransfer" then
setoptions = { { value = "transfer", text = "Transfer" } }
setview = "Welcome back, "..name.."<br><br>- Society Account -<br>"..PlayerJob.label.."<br><br>- Balances -<br>🏢"..PlayerJob.label.." - $"..cv(society).."<br><br>- Options -"
setview = "Welcome back, "..info.name.."<br><br>- Society Account -<br>"..PlayerJob.label.."<br><br>- Balances -<br>🏢"..PlayerJob.label.." - $"..cv(society).."<br><br>- Options -"
setheader = "🔀 Transfer Services 🔀"
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'text', isRequired = true, name = 'account', text = '🏦 Account no.' },
@@ -308,12 +266,12 @@ RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
QBCore.Functions.Progressbar("accessing_atm", "Accessing Transfers", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
elseif data.id == "gang" then
setheader = "🏢 Society Banking 🏢"
setview = "Welcome back, "..name.."<br><br>- Society Account -<br>"..PlayerGang.label.."<br><br>- Balances -<br>🏢"..PlayerGang.label.." - $"..cv(gsociety).."<br>🏦Bank - $"..cv(bank).."<br><br>- Options -"
setview = "Welcome back, "..info.name.."<br><br>- Society Account -<br>"..PlayerGang.label.."<br><br>- Balances -<br>🏢"..PlayerGang.label.." - $"..cv(gsociety).."<br>🏦Bank - $"..cv(info.bank).."<br><br>- Options -"
setoptions = { { value = "withdraw", text = "Withdrawl" }, { value = "deposit", text = "Deposit" } }
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = '💵 Amount to transfer' }, }
@@ -321,32 +279,35 @@ RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
QBCore.Functions.Progressbar("accessing_atm", "Accessing Society Account", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
elseif data.id == "gangtransfer" then
setoptions = { { value = "transfer", text = "Transfer" } }
setview = "Welcome back, "..name.."<br><br>- Society Account -<br>"..PlayerGang.label.."<br><br>- Balances -<br>🏢"..PlayerGang.label.." - $"..cv(gsociety).."<br><br>- Options -"
setview = "Welcome back, "..info.name.."<br><br>- Society Account -<br>"..PlayerGang.label.."<br><br>- Balances -<br>🏢"..PlayerGang.label.." - $"..cv(gsociety).."<br><br>- Options -"
setheader = "🔀 Transfer Services 🔀"
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'text', isRequired = true, name = 'account', text = '🏦 Account no.' },
{ type = 'number', isRequired = true, name = 'amount', text = '💸 Amount to transfer' }, }
PlayATMAnimation('enter')
QBCore.Functions.Progressbar("accessing_atm", "Accessing Transfers", atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function() -- Done
end, function()
TriggerEvent("QBCore:Notify", "Cancelled!", "error")
return
end)
cancelled = true
end, data.icon)
end
Wait(atmbartime+500)
local dialog = exports['qb-input']:ShowInput({ header = setheader, txt = "test", submitText = "Transfer", inputs = setinputs })
if dialog then
if not dialog.amount then return end
PlayATMAnimation('exit') Citizen.Wait(1000)
TriggerServerEvent('jim-payments:server:ATM:use', dialog.amount, dialog.billtype, dialog.account, data.id, society, gsociety)
if not cancelled then
cancelled = false
local dialog = exports['qb-input']:ShowInput({ header = setheader, txt = "test", submitText = "Transfer", inputs = setinputs })
if dialog then
if not dialog.amount then return end
PlayATMAnimation('exit') Citizen.Wait(1000)
TriggerServerEvent('jim-payments:server:ATM:use', dialog.amount, dialog.billtype, dialog.account, data.id, society, gsociety)
end
end
gsociety, society, name = nil
end)
@@ -368,7 +329,7 @@ RegisterNetEvent('jim-payments:client:ATM:give', function()
if nearbyList[#nearbyList] == nil then TriggerEvent("QBCore:Notify", "No one near by to charge", "error") return end
local dialog = exports['qb-input']:ShowInput({ header = "Give someone cash", submitText = "Give",
inputs = {
{ text = " ", name = "citizen", type = "select", options = nearbyList },
{ text = " ", name = "citizen", type = "select", options = nearbyList },
{ type = 'number', isRequired = true, name = 'price', text = '💵 Amount to Pay' }, }
})
if dialog then
@@ -376,4 +337,9 @@ RegisterNetEvent('jim-payments:client:ATM:give', function()
TriggerServerEvent('jim-payments:server:ATM:give', dialog.citizen, dialog.price)
end
end)
end)
AddEventHandler('onResourceStop', function(resource) if resource ~= GetCurrentResourceName() then return end
for k in pairs(Targets) do exports['qb-target']:RemoveZone(k) end
for k in pairs(Peds) do unloadModel(GetEntityModel(Peds[k])) DeletePed(Peds[k]) end
end)

View File

@@ -11,15 +11,20 @@ local function cv(amount)
return formatted
end
---- BANK STUFF
QBCore.Functions.CreateCallback('jim-payments:ManageWrapper', function(source, cb, type, account)
local result = nil
if type == "GetAccount" then result = exports["qb-management"]:GetAccount(account) end
if type == "GetGangAccount" then result = exports["qb-management"]:GetGangAccount(account) end
cb(result)
end)
RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, baccount, account, society, gsociety)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local cashB = Player.Functions.GetMoney("cash")
local bankB = Player.Functions.GetMoney("bank")
local amount = tonumber(amount)
--TriggerClientEvent("QBCore:Notify", src, tostring(account), "error")
--Simple transfers from bank to wallet --
if account == "bank" or account == "atm" then
@@ -72,17 +77,19 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
elseif tonumber(society) >= amount then
TriggerClientEvent("QBCore:Notify", src, "Withdrew $"..cv(amount).." from the "..Player.PlayerData.job.label.." account", "success")
Player.Functions.AddMoney('bank', amount)
TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.job.name), amount)
if Config.Manage then exports["qb-management"]:RemoveMoney(tostring(Player.PlayerData.job.name), amount)
else TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.job.name), amount) end
end
elseif billtype == "deposit" then
if bankB < amount then TriggerClientEvent("QBCore:Notify", src, "Not enough money in your bank", "error")
elseif bankB >= amount then
TriggerEvent("qb-bossmenu:server:addAccountMoney", tostring(Player.PlayerData.job.name), amount)
if Config.Manage then exports["qb-management"]:AddMoney(tostring(Player.PlayerData.job.name), amount)
else TriggerEvent("qb-bossmenu:server:addAccountMoney", tostring(Player.PlayerData.job.name), amount) end
Player.Functions.RemoveMoney('bank', amount) Wait(1500)
TriggerClientEvent("QBCore:Notify", src, "Deposited $"..cv(amount).." into the "..Player.PlayerData.job.label.." account", "success")
end
end
-- Transfers between players --
-- Transfer from boss account to players --
elseif account == "societytransfer" then
local bannedCharacters = {'%','$',';'}
local newAmount = tostring(amount)
@@ -97,10 +104,11 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
local Player = QBCore.Functions.GetPlayer(src)
if (society - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%'
local result = exports.oxmysql:executeSync('SELECT * FROM players WHERE charinfo LIKE ?', {query})
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
TriggerEvent("qb-gangmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount)
if Config.Manage then exports["qb-management"]:RemoveMoney(tostring(Player.PlayerData.job.name), amount)
else TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.job.name), amount) end
if Reciever ~= nil then
Reciever.Functions.AddMoney('bank', amount)
TriggerClientEvent("QBCore:Notify", src, "Sent $"..amount.." to "..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success")
@@ -108,31 +116,32 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
else
local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank = (RecieverMoney.bank + amount)
exports.oxmysql:execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end
elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error")
end
end
--Simple transfers from society account to bank --
--Simple transfers from gang society account to bank --
elseif account == "gang" then
if billtype == "withdraw" then
if tonumber(gsociety) < amount then TriggerClientEvent("QBCore:Notify", src, "Society balance too low", "error")
elseif tonumber(gsociety) >= amount then
TriggerClientEvent("QBCore:Notify", src, "Withdrew $"..cv(amount).." from the "..Player.PlayerData.gang.label.." account", "success")
Player.Functions.AddMoney('bank', amount)
TriggerEvent("qb-gangmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount)
if Config.Manage then exports["qb-management"]:RemoveGangMoney(tostring(Player.PlayerData.gang.name), amount)
else TriggerEvent("qb-gangmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount) end
end
elseif billtype == "deposit" then
if bankB < amount then TriggerClientEvent("QBCore:Notify", src, "Not enough money in your bank", "error")
elseif bankB >= amount then
TriggerEvent("qb-gangmenu:server:addAccountMoney", tostring(Player.PlayerData.gang.name), amount)
if Config.Manage then exports["qb-management"]:AddGangMoney(tostring(Player.PlayerData.gang.name), amount)
else TriggerEvent("qb-gangmenu:server:addAccountMoney", tostring(Player.PlayerData.gang.name), amount) end
Player.Functions.RemoveMoney('bank', amount) Wait(1500)
TriggerClientEvent("QBCore:Notify", src, "Deposited $"..cv(amount).." into the "..Player.PlayerData.gang.label.." account", "success")
end
end
-- Transfers between players --
-- Transfer from gang account to players --
elseif account == "gangtransfer" then
local bannedCharacters = {'%','$',';'}
local newAmount = tostring(amount)
@@ -147,10 +156,11 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
local Player = QBCore.Functions.GetPlayer(src)
if (gsociety - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%'
local result = exports.oxmysql:executeSync('SELECT * FROM players WHERE charinfo LIKE ?', {query})
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount)
if Config.Manage then exports["qb-management"]:RemoveGangMoney(tostring(Player.PlayerData.gang.name), amount)
else TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount) end
if Reciever ~= nil then
Reciever.Functions.AddMoney('bank', amount)
TriggerClientEvent("QBCore:Notify", src, "Sent $"..amount.." to "..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success")
@@ -158,7 +168,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
else
local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank = (RecieverMoney.bank + amount)
exports.oxmysql:execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end
elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error")
@@ -180,7 +190,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
local Player = QBCore.Functions.GetPlayer(src)
if (Player.PlayerData.money.bank - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%'
local result = exports.oxmysql:executeSync('SELECT * FROM players WHERE charinfo LIKE ?', {query})
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
Player.Functions.RemoveMoney('bank', amount)
@@ -191,7 +201,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
else
local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank = (RecieverMoney.bank + amount)
exports.oxmysql:execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end
elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error")
@@ -214,11 +224,19 @@ QBCore.Functions.CreateCallback('jim-payments:ATM:Find', function(source, cb)
savbal = getSavingsAccount[1].amount
else
MySQL.Async.insert('INSERT INTO bank_accounts (citizenid, amount, account_type) VALUES (?, ?, ?)', { Player.PlayerData.citizenid, 0, 'Savings' }, function() completed = true end) repeat Wait(0) until completed == true
local getSavingsAccount = MySQL.Sync.fetchAll('SELECT * FROM bank_accounts WHERE citizenid = ? AND account_type = ?', { Player.PlayerData.citizenid, 'Savings' })
aid = getSavingsAccount[1].record_id
savbal = getSavingsAccount[1].amount
end
cb(name, cash, bank, account, cid, savbal, aid)
local data = {
name = name,
cash = cash,
bank = bank,
account = account,
cid = cid,
savbal = savbal,
aid = aid }
cb(data)
end)
QBCore.Commands.Add("cashgive", "Pay a user nearby", {}, false, function(source) TriggerClientEvent("jim-payments:client:ATM:give", source) end)
@@ -234,7 +252,7 @@ RegisterServerEvent("jim-payments:server:ATM:give", function(citizen, price)
Player.Functions.RemoveMoney('cash', amount)
TriggerClientEvent("QBCore:Notify", source, "You gave "..Reciever.PlayerData.charinfo.firstname.." $"..cv(amount), "success")
Reciever.Functions.AddMoney('cash', amount)
TriggerClientEvent("QBCore:Notify", tonumber(citizen), "You got $"..cv(amount).." from "..Reciever.PlayerData.charinfo.firstname, "success")
TriggerClientEvent("QBCore:Notify", tonumber(citizen), "You got $"..cv(amount).." from "..Player.PlayerData.charinfo.firstname, "success")
elseif balance < amount then
TriggerClientEvent("QBCore:Notify", source, "You don't have enough cash to give", "error")
end

View File

@@ -1,88 +1,174 @@
local QBCore = exports['qb-core']:GetCoreObject()
PlayerJob = {}
PlayerGang = {}
local onDuty = false
local BankPed = nil
RegisterNetEvent('QBCore:Client:OnPlayerLoaded')
AddEventHandler('QBCore:Client:OnPlayerLoaded', function()
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
PlayerGang = PlayerData.gang
end)
end)
RegisterNetEvent('QBCore:Client:OnJobUpdate')
AddEventHandler('QBCore:Client:OnJobUpdate', function(JobInfo)
PlayerJob = JobInfo
onDuty = PlayerJob.onduty
end)
RegisterNetEvent('QBCore:Client:SetDuty')
AddEventHandler('QBCore:Client:SetDuty', function(duty)
onDuty = duty
end)
RegisterNetEvent('QBCore:Client:OnGangUpdate')
AddEventHandler('QBCore:Client:OnGangUpdate', function(GangInfo)
PlayerGang = GangInfo
end)
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job PlayerGang = PlayerData.gang end) end)
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo) PlayerJob = JobInfo onDuty = PlayerJob.onduty end)
RegisterNetEvent('QBCore:Client:SetDuty', function(duty) onDuty = duty end)
RegisterNetEvent('QBCore:Client:OnGangUpdate', function(GangInfo) PlayerGang = GangInfo end)
--Keeps track of duty on script restarts
AddEventHandler('onResourceStart', function(resource)
if GetCurrentResourceName() == resource then QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job PlayerGang = PlayerData.gang onDuty = PlayerJob.onduty end) end end)
Citizen.CreateThread(function()
local jobroles = {}
for k, v in pairs(Config.Jobs) do jobroles[tostring(k)] = 0 end
exports['qb-target']:AddBoxZone("JimBank", vector3(251.75, 222.17, 106.2), 0.6, 2.0, { name="JimBank", heading = 340.0, debugPoly=false, minZ = 105.75, maxZ = 107.29, },
{ options = { { event = "jim-payments:Tickets:Menu", icon = "fas fa-receipt", label = "Cash in Receipts", job = jobroles } }, distance = 2.0 })
end)
RegisterNetEvent('jim-payments:client:Charge', function()
if not onDuty then TriggerEvent("QBCore:Notify", "Not Clocked in!", "error") return end -- Require to be on duty when making a payment
local onlineList = {}
local nearbyList = {}
QBCore.Functions.TriggerCallback('jim-payments:MakePlayerList', function(cb) onlineList = cb if onlineList[1] == nil then Wait(200) end
for k, v in pairs(QBCore.Functions.GetPlayersFromCoords(GetEntityCoords(PlayerPedId()), Config.PaymentRadius)) do
local dist = #(GetEntityCoords(GetPlayerPed(v)) - GetEntityCoords(PlayerPedId()))
for i = 1, #onlineList do
if onlineList[i].value == GetPlayerServerId(v) then
if v ~= PlayerId() then
nearbyList[#nearbyList+1] = onlineList[i]
nearbyList[#nearbyList].text = nearbyList[#nearbyList].text..' ('..math.floor(dist+0.05)..'m)'
end
end
end
dist = nil
end
if nearbyList[#nearbyList] == nil then TriggerEvent("QBCore:Notify", "No one near by to charge", "error") return end
local dialog = exports['qb-input']:ShowInput({ header = PlayerJob.label.." Cash Register", submitText = "Send",
inputs = {
{ text = " ", name = "citizen", type = "select", options = nearbyList },
{ type = 'radio', name = 'billtype', text = 'Payment Type', options = { { value = "cash", text = "Cash" }, { value = "card", text = "Card" } } },
{ type = 'number', isRequired = true, name = 'price', text = '💵 Amount to Charge' },}
})
if dialog then
if not dialog.citizen or not dialog.price then return end
TriggerServerEvent('jim-payments:server:Charge', dialog.citizen, dialog.price, dialog.billtype)
end
AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName() ~= resource then return end
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
PlayerGang = PlayerData.gang
onDuty = PlayerJob.onduty
end)
end)
RegisterNetEvent('jim-payments:Tickets:Menu', function()
local amount = nil
while amount == nil do QBCore.Functions.TriggerCallback('jim-payments:Ticket:Count', function(cb) amount = cb end) Citizen.Wait(1) end
for k, v in pairs(Config.Jobs) do if k ~= PlayerJob.name then
else exports['qb-menu']:openMenu({
{ isMenuHeader = true, header = "🧾 "..PlayerJob.label.." Receipts 🧾", txt = "Do you want trade your receipts for payment?" },
{ isMenuHeader = true, header = "", txt = "Amount of Tickets: "..amount.."<br>Total Payment: $"..(Config.Jobs[PlayerJob.name].PayPerTicket * amount) },
{ header = "Yes", txt = "", params = { event = "jim-payments:Tickets:Sell:yes" } },
{ header = "No", txt = "", params = { event = "jim-payments:Tickets:Sell:no" } }, })
local function loadModel(model) if Config.Debug then print("Debug: Loading Model: '"..model.."'") end RequestModel(model) while not HasModelLoaded(model) do Wait(0) end end
local function unloadModel(model) if Config.Debug then print("Debug: Removing Model: '"..model.."'") end SetModelAsNoLongerNeeded(model) end
CreateThread(function()
local jobroles = {} local gangroles = {}
--Build Job/Gang Checks for cashin location
for k, v in pairs(Config.Jobs) do if v.gang then gangroles[tostring(k)] = 0 else jobroles[tostring(k)] = 0 end end
--Create Target at location
exports['qb-target']:AddCircleZone("JimBank", vector3(Config.CashInLocation.x, Config.CashInLocation.y, Config.CashInLocation.z), 2.0, { name="JimBank", debugPoly=Config.Debug, useZ=true, },
{ options = {
{ event = "jim-payments:Tickets:Menu", icon = "fas fa-receipt", label = "Cash in Job Receipts", job = jobroles, },
{ event = "jim-payments:Tickets:Menu", icon = "fas fa-receipt", label = "Cash in Gang Receipts", gang = gangroles, } },
distance = 2.0 })
--Crete Ped at the location
if Config.Peds then
local i = math.random(1, #Config.PedPool)
loadModel(Config.PedPool[i])
if not BankPed then BankPed = CreatePed(0, Config.PedPool[i], vector3(Config.CashInLocation.x, Config.CashInLocation.y, Config.CashInLocation.z-1), Config.CashInLocation[4], false, false) end
if Config.Debug then print("Ped Created for Ticket Trade") end
end
end)
RegisterNetEvent('jim-payments:client:Charge', function(data, outside)
--Check if player is using /cashregister command
if not outside and not onDuty and data.gang == nil then TriggerEvent("QBCore:Notify", "Not Clocked in!", "error") return end
local newinputs = {} -- Begin qb-input creation here.
if Config.List then -- If nearby player list is wanted:
--Retrieve a list of nearby players from server
local p = promise.new() QBCore.Functions.TriggerCallback('jim-payments:MakePlayerList', function(cb) p:resolve(cb) end)
local onlineList = Citizen.Await(p)
local nearbyList = {}
--Convert list of players nearby into one qb-input understands + add distance info
for _, v in pairs(QBCore.Functions.GetPlayersFromCoords(GetEntityCoords(PlayerPedId()), Config.PaymentRadius)) do
local dist = #(GetEntityCoords(GetPlayerPed(v)) - GetEntityCoords(PlayerPedId()))
for i = 1, #onlineList do
if onlineList[i].value == GetPlayerServerId(v) then
if v ~= PlayerId() or Config.Debug then
nearbyList[#nearbyList+1] = { value = onlineList[i].value, text = onlineList[i].text..' ('..math.floor(dist+0.05)..'m)' }
end
end
end
end
--If list is empty(no one nearby) show error and stop
if not nearbyList[#nearbyList] then TriggerEvent("QBCore:Notify", "No one near by to charge", "error") return end
newinputs[#newinputs+1] = { text = " ", name = "citizen", type = "select", options = nearbyList }
else -- If Config.List is false, create input text box for ID's
newinputs[#newinputs+1] = { type = 'text', isRequired = true, name = 'citizen', text = '# Customer ID #' }
end
--Check if image was given when opening the regsiter
local img = data.img or ""
--Continue adding payment options to qb-input
newinputs[#newinputs+1] = { type = 'radio', name = 'billtype', text = 'Payment Type', options = { { value = "cash", text = "Cash" }, { value = "bank", text = "Card" } } }
newinputs[#newinputs+1] = { type = 'number', isRequired = true, name = 'price', text = '💵 Amount to Charge' }
--Grab Player Job name or Gang Name if needed
local label = PlayerJob.label
local gang = false
if data.gang then label = PlayerGang.label gang = true end
local dialog = exports['qb-input']:ShowInput({ header = img..label.." Cash Register", submitText = "Send", inputs = newinputs})
if dialog then
if not dialog.citizen or not dialog.price then return end
TriggerServerEvent('jim-payments:server:Charge', dialog.citizen, dialog.price, dialog.billtype, data.img, outside, gang)
end
end)
RegisterNetEvent('jim-payments:client:PolCharge', function()
--Check if player is allowed to use /cashregister command
local allowed = false
for k in pairs(Config.FineJobs) do if k == PlayerJob.name then allowed = true end end
if not allowed then TriggerEvent("QBCore:Notify", "You don't have the required job", "error") return end
local newinputs = {} -- Begin qb-input creation here.
if Config.FineJobList then -- If nearby player list is wanted:
--Retrieve a list of nearby players from server
local p = promise.new() QBCore.Functions.TriggerCallback('jim-payments:MakePlayerList', function(cb) p:resolve(cb) end)
local onlineList = Citizen.Await(p)
local nearbyList = {}
--Convert list of players nearby into one qb-input understands + add distance info
for _, v in pairs(QBCore.Functions.GetPlayersFromCoords(GetEntityCoords(PlayerPedId()), Config.PaymentRadius)) do
local dist = #(GetEntityCoords(GetPlayerPed(v)) - GetEntityCoords(PlayerPedId()))
for i = 1, #onlineList do
if onlineList[i].value == GetPlayerServerId(v) then
if v ~= PlayerId() or Config.Debug then
nearbyList[#nearbyList+1] = { value = onlineList[i].value, text = onlineList[i].text..' ('..math.floor(dist+0.05)..'m)' }
end
end
end
end
--If list is empty(no one nearby) show error and stop
if not nearbyList[#nearbyList] then TriggerEvent("QBCore:Notify", "No one near by to charge", "error") return end
newinputs[#newinputs+1] = { text = " ", name = "citizen", type = "select", options = nearbyList }
else -- If Config.List is false, create input text box for ID's
newinputs[#newinputs+1] = { type = 'text', isRequired = true, name = 'citizen', text = "# Person's ID #" }
end
--Continue adding payment options to qb-input
newinputs[#newinputs+1] = { type = 'number', isRequired = true, name = 'price', text = '💵 Amount to Charge' }
--Grab Player Job name or Gang Name if needed
local label = PlayerJob.label
local gang = false
local dialog = exports['qb-input']:ShowInput({ header = label.." Charge", submitText = "Send", inputs = newinputs})
if dialog then
if not dialog.citizen or not dialog.price then return end
TriggerServerEvent('jim-payments:server:PolCharge', dialog.citizen, dialog.price)
end
end)
RegisterNetEvent('jim-payments:Tickets:Menu', function(data)
--Get ticket info
local p = promise.new() QBCore.Functions.TriggerCallback('jim-payments:Ticket:Count', function(cb) p:resolve(cb) end)
local amount = Citizen.Await(p)
if amount == 0 then TriggerEvent("QBCore:Notify", "You don't have any tickets to trade", "error") return end
local sellable = false
local name = "" local label = ""
--Check/adjust for job/gang names
for k, v in pairs(Config.Jobs) do
if data.gang then if v.gang and k == PlayerGang.name then name = k label = PlayerGang.label sellable = true end
else if not v.gang and k == PlayerJob.name then name = k label = PlayerJob.label sellable = true end
end
if sellable then -- if info is found then:
exports['qb-menu']:openMenu({
{ isMenuHeader = true, header = "🧾 "..label.." Receipts 🧾", txt = "Do you want trade your receipts for payment?" },
{ isMenuHeader = true, header = "", txt = "Amount of Tickets: "..amount.."<br>Total Payment: $"..(Config.Jobs[name].PayPerTicket * amount) },
{ icon = "fas fa-circle-check", header = "Yes", txt = "", params = { event = "jim-payments:Tickets:Sell:yes" } },
{ icon = "fas fa-circle-xmark", header = "No", txt = "", params = { event = "jim-payments:Tickets:Sell:no" } },
})
end
end
end)
RegisterNetEvent("jim-payments:client:PayPopup", function(amount, biller, billtype, img, billerjob, gang, outside)
local img = img or ""
exports['qb-menu']:openMenu({
{ isMenuHeader = true, header = img.."🧾 "..billerjob.." Payment 🧾", txt = "Do you want accept the payment?" },
{ isMenuHeader = true, header = "", txt = billtype:gsub("^%l", string.upper).." Payment: $"..amount },
{ icon = "fas fa-circle-check", header = "Yes", txt = "", params = { isServer = true, event = "jim-payments:server:PayPopup", args = { accept = true, amount = amount, biller = biller, billtype = billtype, gang = gang, outside = outside } } },
{ icon = "fas fa-circle-xmark", header = "No", txt = "", params = { isServer = true, event = "jim-payments:server:PayPopup", args = { accept = false, amount = amount, biller = biller, billtype = billtype, outside = outside } } }, })
end)
RegisterNetEvent("jim-payments:client:PolPopup", function(amount, biller, billerjob)
exports['qb-menu']:openMenu({
{ isMenuHeader = true, header = "🧾 "..billerjob.." Payment 🧾", txt = "Do you want accept the charge?" },
{ isMenuHeader = true, header = "", txt = "Bank Charge: $"..amount },
{ icon = "fas fa-circle-check", header = "Yes", txt = "", params = { isServer = true, event = "jim-payments:server:PolPopup", args = { accept = true, amount = amount, biller = biller } } },
{ icon = "fas fa-circle-xmark", header = "No", txt = "", params = { isServer = true, event = "jim-payments:server:PolPopup", args = { accept = false, amount = amount, biller = biller } } }, })
end)
RegisterNetEvent('jim-payments:Tickets:Sell:yes', function() TriggerServerEvent('jim-payments:Tickets:Sell') end)
RegisterNetEvent('jim-payments:Tickets:Sell:no', function() exports['qb-menu']:closeMenu() end)
AddEventHandler('onResourceStop', function(resource) if resource ~= GetCurrentResourceName() then return end
exports['qb-target']:RemoveZone("JimBank") unloadModel(GetEntityModel(BankPed)) DeletePed(BankPed)
end)

View File

@@ -1,22 +1,227 @@
print("Jim-Payments v2 - Payments Script by Jimathy")
print("Jim-Payments v2.7 - Payments Script by Jimathy")
-- If you need support I now have a discord available, it helps me keep track of issues and give better support.
-- https://discord.gg/xKgQZ6wZvS
Config = {}
Config = {
Debug = true,
Manage = true, -- "true" if using qb-management
-- "false" if using qb-bossmenu
TicketSystem = true, -- Enable this if you want to use the ticket system false
Config.PaymentRadius = 30 -- This is how far the player list will check
List = true, -- "true" to use nearby player list feature in the cash registers, "false" for manual id entry
PaymentRadius = 30, -- This is how far the playerlist will check for nearby players (based on the person charging)
-- MinAmountforTicket should be your cheapest item
-- PayPerTicket should never be higher than MinAmountforTicket
Config.Jobs = {
['popsdiner'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['henhouse'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['pizzathis'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['burgershot'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['catcafe'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['tequilala'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['vanilla'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['mechanic'] = { MinAmountforTicket = 1000, PayPerTicket = 500 },
Peds = true, -- "true" to enable peds spawning in banks
PedPool = {
`IG_Bankman`,
`U_M_M_BankMan`,
`S_F_M_Shop_HIGH`,
`S_M_M_HighSec_02`,
`S_M_M_HighSec_03`,
`S_M_M_HighSec_04`,
`A_F_Y_Business_01`,
`A_F_Y_Business_02`,
`A_F_Y_Business_03`,
`A_F_Y_Business_04`,
`A_M_M_Business_01`,
`A_M_Y_Business_02`,
`A_M_Y_Business_03`,
`U_F_M_CasinoShop_01`,
},
useATM = true, -- Enable this to use the scripts ATM's and controls
useBanks = true, -- Enable this to use my banking stuff
BankBlips = true, -- Enable this if you disabled qb-banking and need bank locations
ATMBlips = false, -- Enable this if you are a pyscho and need every ATM to be on the map too
PhoneBank = false, -- Set this to false to use the popup payment system FOR CARD/BANK PAYMENTS instead of using phone invoices
-- This doesn't affect Cash payments as they by default use confirmation now
-- This is helpful for phones that don't support invoices well
PhoneType = "qb", -- Change this setting to make invoices work with your phone script [still testing this currently]
-- "qb" for qb-phone
-- "gks"" for GKSPhone
CashInLocation = vector4(252.23, 223.11, 106.29, 159.2), -- Default Third Window along in Pacific Bank
Commission = true, -- Set this to true to enable Commissions and give the person charging a percentage of the total
CommissionAll = false, -- Set this to true to give commission to workers clocked in
CommissionDouble = false, -- Set this to true if you want the person charging to get double Commission
CommissionLimit = false, -- If true, this limits the Commission to only be given if over the "MinAmountForTicket".
-- If false, Commission will be given for any amount
Gabz = true, -- "true" to enable Gabz Bank locations
-- MinAmountforTicket should be your cheapest item
-- PayPerTicket should never be higher than MinAmountforTicket
-- Commission is a percentage eg "0.10" becomes 10%
Jobs = {
['beanmachine'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['burgershot'] = { MinAmountforTicket = 50, PayPerTicket = 50 , Commission = 0.10, },
['catcafe'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['henhouse'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['pizzathis'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['popsdiner'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['tequilala'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['vanilla'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['mechanic'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
['lostmc'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, gang = true, },
},
-- The /polcharge command requires specific jobs to be set
-- No tickets for these, it's just commission
FineJobs = {
['police'] = { Commission = 0.25, },
['ambulance'] = { Commission = 0.25, },
},
FineJobConfirmation = true, --"true" makes it so fines need confirmation, "false" skips this ands just removes the money
FineJobList = true, -- "true" to use nearby player list feature in the cash registers, "false" for manual id entry
ATMModels = { "prop_atm_01", "prop_atm_02", "prop_atm_03", "prop_fleeca_atm" },
ATMLocations = {
--PACIFIC BANK 10 ATMS
vector3(265.9, 213.86, 106.28),
vector3(265.56, 212.98, 106.28),
vector3(265.19, 211.91, 106.28),
vector3(264.86, 211.03, 106.28),
vector3(264.52, 210.06, 106.28),
vector3(236.64, 219.72, 106.29),
vector3(237.04, 218.72, 106.29),
vector3(237.5, 217.87, 106.29),
vector3(237.93, 216.94, 106.29),
vector3(238.36, 216.03, 106.29),
},
--QB-Target doesn't seem to like ALL ATM Props so need to manually add locations
WallATMLocations = {
vector3(-386.54, 6046.29, 31.5),
vector3(-282.82, 6226.24, 31.49),
vector3(-132.74, 6366.79, 31.48),
vector3(-95.76, 6457.41, 31.46),
vector3(-97.52, 6455.65, 31.47),
vector3(155.95, 6642.99, 31.6),
vector3(173.92, 6638.16, 31.57),
vector3(2558.65, 350.92, 108.62),
vector3(1077.78, -776.64, 58.35),
vector3(1138.14, -468.88, 66.73),
vector3(1166.93, -455.96, 66.81),
vector3(285.37, 143.07, 104.17),
vector3(-165.43, 234.81, 94.92),
vector3(-165.4, 232.73, 94.92),
vector3(-1410.41, -98.76, 52.43),
vector3(-1409.85, -100.51, 52.38),
vector3(-1206.0, -324.94, 37.86),
vector3(-1205.23, -326.55, 37.86),
vector3(-2072.28, -317.27, 13.32),
vector3(-2974.7, 380.15, 15.0),
vector3(-2959.01, 487.45, 15.46),
vector3(-2956.87, 487.36, 15.46),
vector3(-3043.98, 594.32, 7.74),
vector3(-3241.35, 997.74, 12.55),
vector3(-1305.59, -706.64, 25.32),
vector3(-537.85, -854.69, 29.28),
vector3(-709.98, -818.71, 23.73),
vector3(-712.87, -818.71, 23.73),
vector3(-526.71, -1223.18, 18.45),
vector3(-256.47, -715.94, 33.55),
vector3(-259.13, -723.29, 33.54),
vector3(-203.82, -861.3, 30.27),
vector3(111.38, -774.96, 31.44),
vector3(114.56, -776.13, 31.42),
vector3(112.46, -819.65, 31.34),
vector3(118.93, -883.68, 31.12),
vector3(-846.97, -340.29, 38.68),
vector3(-846.41, -341.41, 38.68),
vector3(-262.21, -2012.17, 30.15),
vector3(-273.23, -2024.32, 30.15),
vector3(24.46, -945.94, 29.36),
vector3(-254.48, -692.74, 33.61),
vector3(-1569.95, -546.94, 34.96),
vector3(-1570.91, -547.63, 34.96),
vector3(289.14, -1282.29, 29.6),
vector3(289.18, -1256.84, 29.44),
vector3(296.04, -896.22, 29.24),
vector3(296.74, -894.26, 29.24),
vector3(-301.63, -829.73, 32.43),
vector3(-303.23, -829.44, 32.43),
vector3(5.27, -919.87, 29.56),
vector3(-1200.61, -885.62, 13.26),
},
BankLocations = {
["legion"] = {
vector4(149.5, -1042.08, 29.37, 342.74), -- Legion Fleeca
},
["hawick"] = {
vector4(313.81, -280.43, 54.16, 342.29), -- Hawick Fleeca
},
["vinewood"] = {
vector4(-351.4, -51.24, 49.04, 338.4), -- Vinewood Fleeca
},
["delperro"] = {
vector4(-1212.11, -332.01, 37.78, 25.33), -- Del Perro Fleeca
},
["route1"] = {
vector4(-2961.17, 482.9, 15.7, 84.68), -- Route 1 Fleeca
},
["route68"] = {
vector4(1175.03, 2708.2, 38.09, 180.0), -- Route 68 Fleeca
},
["paleto"] = {
vector4(-111.22, 6470.03, 31.63, 133.86), -- Paleto Bank
},
["pacific"] = {
vector4(243.58, 226.25, 106.29, 169.06), -- Pacific Bank Window 1
vector4(247.08, 224.98, 106.29, 157.75), -- Pacific Bank Window 2
},
},
}
if Config.Gabz then -- If Gabz banks enabled, load these locations instead
Config.CashInLocation = vector4(269.28, 217.24, 106.28, 69.0)
Config.BankLocations = {
["legion"] = {
vector4(149.5, -1042.08, 29.37, 342.74), -- Legion Fleeca
},
["hawick"] = {
vector4(313.81, -280.43, 54.16, 342.29), -- Hawick Fleeca
},
["vinewood"] = {
vector4(-351.4, -51.24, 49.04, 338.4), -- Vinewood Fleeca
},
["delperro"] = {
vector4(-1212.11, -332.01, 37.78, 25.33), -- Del Perro Fleeca
},
["route1"] = {
vector4(-2961.17, 482.9, 15.7, 84.68), -- Route 1 Fleeca
},
["route68"] = {
vector4(1175.03, 2708.2, 38.09, 180.0), -- Route 68 Fleeca
},
["paleto"] = {
vector4(-110.72, 6469.82, 31.63, 222.94), -- Paleto Bank (GABZ) - 1
vector4(-108.98, 6471.56, 31.63, 222.92), -- Paleto Bank (GABZ) - 2
},
["pacific"] = {
vector4(258.55, 227.63, 106.28, 160.96), -- Pacficic Gabz 1+2
vector4(263.21, 225.93, 106.28, 158.25), -- Pacficic Gabz 3+4
vector4(267.95, 224.24, 106.28, 158.5), -- Pacficic Gabz 5+6
vector4(263.71, 212.63, 106.28, 337.53), -- Pacficic Gabz 7+8
vector4(259.02, 214.32, 106.28, 337.82), -- Pacficic Gabz 9+10
vector4(254.27, 216.06, 106.28, 336.37), -- Pacficic Gabz 11+12
},
}
Config.ATMLocations = {
vector3(239.02, 212.37, 106.28),
vector3(239.46, 213.6, 106.28),
vector3(239.9, 214.82, 106.28),
vector3(240.35, 216.03, 106.28),
vector3(241.42, 218.96, 106.28),
vector3(241.86, 220.16, 106.28),
vector3(242.3, 221.41, 106.28),
vector3(242.76, 222.63, 106.28),
vector3(263.46, 203.86, 106.28),
vector3(263.96, 205.03, 106.28),
vector3(264.37, 206.28, 106.28),
vector3(264.77, 207.51, 106.28),
}
end

View File

@@ -1,13 +1,13 @@
name "Jim-Payments"
author "Jimathy"
version "v2"
version "v2.7"
description "Payment Script By Jimathy"
fx_version "cerulean"
game "gta5"
dependencies {
'qb-input',
'qb-target'
'qb-target',
}
client_scripts {

View File

@@ -1,21 +1,91 @@
local QBCore = exports['qb-core']:GetCoreObject()
RegisterServerEvent('jim-payments:Tickets:Give')
AddEventHandler('jim-payments:Tickets:Give', function(amount, job)
for k, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player ~= nil then
if Player.PlayerData.job.name == job and Player.PlayerData.job.onduty then
if amount >= Config.Jobs[job].MinAmountforTicket then
Player.Functions.AddItem('payticket', 1, false, {["quality"] = nil})
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, 'Receipt received', 'success')
TriggerClientEvent('inventory:client:ItemBox', Player.PlayerData.source, QBCore.Shared.Items['payticket'], "add", 1)
elseif amount < Config.Jobs[job].MinAmountforTicket then
TriggerClientEvent("QBCore:Notify", Player.PlayerData.source, "Amount too low, didn't receive a receipt", "error")
local function cv(amount)
local formatted = amount
while true do formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') if (k==0) then break end Wait(0) end
return formatted
end
AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName() ~= resource then return end
for k in pairs(Config.Jobs) do
if not QBCore.Shared.Jobs[k] and not QBCore.Shared.Gangs[k] then
print("Jim-Payments: Config.Jobs searched for job/gang '"..k.."' and couldn't find it in the Shared")
end
end
end)
QBCore.Commands.Add("cashregister", "Use mobile cash register", {}, false, function(source) TriggerClientEvent("jim-payments:client:Charge", source, {}, true) end)
QBCore.Commands.Add("polcharge", "Charge another person", {}, false, function(source) TriggerClientEvent("jim-payments:client:PolCharge", source) end)
RegisterServerEvent('jim-payments:Tickets:Give', function(data, biller, gang)
local billed = QBCore.Functions.GetPlayer(source) -- This should always be from the person who accepted the payment
if biller then -- If this is found, it ISN'T a phone payment, so add money to society here
if gang then
if Config.Manage then exports["qb-management"]:AddGangMoney(tostring(biller.PlayerData.gang.name), data.amount)
if Config.Debug then print("QB-Management(Gang): Adding $"..data.amount.." to account '"..tostring(biller.PlayerData.gang.name).."'") end
else TriggerEvent("qb-gangmenu:server:addAccountMoney", tostring(biller.PlayerData.gang.name), data.amount)
if Config.Debug then print("QB-GangMenu: Adding $"..data.amount.." to account '"..tostring(biller.PlayerData.gang.name).."'") end
end
elseif not gang then
if Config.Manage then exports["qb-management"]:AddMoney(tostring(biller.PlayerData.job.name), data.amount)
if Config.Debug then print("QB-Management(Job): Adding $"..data.amount.." to account '"..tostring(biller.PlayerData.job.name).."'") end
else TriggerEvent("qb-bossmenu:server:addAccountMoney", tostring(biller.PlayerData.job.name), data.amount)
if Config.Debug then print("QB-BossMenu: Adding $"..data.amount.." to account '"..tostring(biller.PlayerData.job.name).."'") end
end
end
elseif not biller then --Find the biller from their citizenid
for _, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player.PlayerData.citizenid == data.senderCitizenId then biller = Player end
end
TriggerClientEvent('QBCore:Notify', biller.PlayerData.source, data.sender.." Paid their $"..data.amount.." invoice", "success")
end
local duty = true
if not biller.PlayerData.job.onduty or gang == nil then duty = false end
-- If ticket system enabled, do this
if duty and Config.TicketSystem then
if data.amount >= Config.Jobs[data.society].MinAmountforTicket then
for _, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player ~= nil or Player ~= billed then
if Player.PlayerData.job.name == data.society and Player.PlayerData.job.onduty then
Player.Functions.AddItem('payticket', 1, false, {["quality"] = nil})
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, 'Receipt received', 'success')
TriggerClientEvent('inventory:client:ItemBox', Player.PlayerData.source, QBCore.Shared.Items['payticket'], "add", 1)
end
end
if gang then
biller.Functions.AddItem('payticket', 1, false, {["quality"] = nil})
TriggerClientEvent('QBCore:Notify', biller.PlayerData.source, 'Receipt received', 'success')
TriggerClientEvent('inventory:client:ItemBox', biller.PlayerData.source, QBCore.Shared.Items['payticket'], "add", 1)
end
end
end
end
end
end
-- Commission section, does each config option separately
local comm = tonumber(Config.Jobs[data.society].Commission)
if Config.Commission and comm ~= 0 then
if Config.CommissionLimit and data.amount < Config.Jobs[data.society].MinAmountforTicket then return end
if Config.CommissionDouble then
biller.Functions.AddMoney("bank", math.floor(tonumber(data.amount) * (comm *2)))
TriggerClientEvent("QBCore:Notify", biller.PlayerData.source, "Recieved $"..math.floor(tonumber(data.amount) * (comm *2)).." in Commission", "success")
else biller.Functions.AddMoney("bank", math.floor(tonumber(data.amount) *comm))
TriggerClientEvent("QBCore:Notify", biller.PlayerData.source, "Recieved $"..math.floor(tonumber(data.amount) * comm).." in Commission", "success")
end
if Config.CommissionAll then
for _, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player ~= nil and Player ~= biller then
if Player.PlayerData.job.name == data.society and Player.PlayerData.job.onduty then
Player.Functions.AddMoney("bank", math.floor(tonumber(data.amount) * comm))
TriggerClientEvent("QBCore:Notify", Player.PlayerData.source, "Recieved $"..math.floor(tonumber(data.amount) * comm).." in Commission", "success")
end
end
end
end
end
end)
RegisterServerEvent('jim-payments:Tickets:Sell', function()
@@ -27,48 +97,113 @@ RegisterServerEvent('jim-payments:Tickets:Sell', function()
pay = (tickets * Config.Jobs[Player.PlayerData.job.name].PayPerTicket)
Player.Functions.AddMoney('bank', pay, 'ticket-payment')
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['payticket'], "remove", tickets)
TriggerClientEvent('QBCore:Notify', source, "Tickets traded: "..tickets.." Total: $"..pay, 'success')
TriggerClientEvent('QBCore:Notify', source, "Tickets traded: "..tickets.." Total: $"..cv(pay), 'success')
end
end)
QBCore.Functions.CreateCallback('jim-payments:Ticket:Count', function(source, cb)
QBCore.Functions.CreateCallback('jim-payments:Ticket:Count', function(source, cb)
if QBCore.Functions.GetPlayer(source).Functions.GetItemByName('payticket') == nil then amount = 0
else amount = QBCore.Functions.GetPlayer(source).Functions.GetItemByName('payticket').amount end
cb(amount)
else amount = QBCore.Functions.GetPlayer(source).Functions.GetItemByName('payticket').amount end
cb(amount)
end)
RegisterServerEvent("jim-payments:server:Charge", function(citizen, price, billtype)
local biller = QBCore.Functions.GetPlayer(source)
RegisterServerEvent("jim-payments:server:Charge", function(citizen, price, billtype, img, outside, gang)
local src = source
local biller = QBCore.Functions.GetPlayer(src)
local billed = QBCore.Functions.GetPlayer(tonumber(citizen))
local amount = tonumber(price)
local billtype = string.lower(tostring(billtype))
local balance = billed.Functions.GetMoney(billtype)
if amount and amount > 0 then
if billtype == "cash" then balance = billed.Functions.GetMoney(billtype)
if balance >= amount then
billed.Functions.RemoveMoney('cash', amount) TriggerEvent("qb-bossmenu:server:addAccountMoney", tostring(biller.PlayerData.job.name), amount)
TriggerEvent('jim-payments:Tickets:Give', amount, tostring(biller.PlayerData.job.name))
elseif balance < amount then
TriggerClientEvent("QBCore:Notify", source, "Customer doesn't have enough cash to pay", "error")
TriggerClientEvent("QBCore:Notify", tonumber(citizen), "You don't have enough cash to pay", "error")
if balance < amount then
TriggerClientEvent("QBCore:Notify", src, "Customer doesn't have enough cash to pay", "error")
TriggerClientEvent("QBCore:Notify", tonumber(citizen), "You don't have enough cash to pay", "error")
return
end
local label = biller.PlayerData.job.label
if gang == true then label = biller.PlayerData.gang.label end
if Config.PhoneBank == false or gang == true or billtype == "cash" then
TriggerClientEvent("jim-payments:client:PayPopup", billed.PlayerData.source, amount, src, billtype, img, label, gang, outside)
else
if Config.PhoneType == "qb" then
MySQL.Async.insert(
'INSERT INTO phone_invoices (citizenid, amount, society, sender, sendercitizenid) VALUES (?, ?, ?, ?, ?)',
{billed.PlayerData.citizenid, amount, biller.PlayerData.job.name, biller.PlayerData.charinfo.firstname, biller.PlayerData.citizenid})
TriggerClientEvent('qb-phone:RefreshPhone', billed.PlayerData.source)
elseif Config.PhoneType == "gks" then
MySQL.Async.execute('INSERT INTO gksphone_invoices (citizenid, amount, society, sender, sendercitizenid, label) VALUES (@citizenid, @amount, @society, @sender, @sendercitizenid, @label)', {
['@citizenid'] = billed.PlayerData.citizenid,
['@amount'] = amount,
['@society'] = biller.PlayerData.job.name,
['@sender'] = biller.PlayerData.charinfo.firstname,
['@sendercitizenid'] = biller.PlayerData.citizenid,
['@label'] = biller.PlayerData.job.label,
})
TriggerClientEvent('gksphone:notifi', src, {title = 'Billing', message = 'Invoice Successfully Sent', img= '/html/static/img/icons/logo.png' })
TriggerClientEvent('gksphone:notifi', billed.PlayerData.source, {title = 'Billing', message = 'New Invoice Recieved', img= '/html/static/img/icons/logo.png' })
end
elseif billtype == "card" then
MySQL.Async.insert(
'INSERT INTO phone_invoices (citizenid, amount, society, sender, sendercitizenid) VALUES (?, ?, ?, ?, ?)',
{billed.PlayerData.citizenid, amount, biller.PlayerData.job.name,
biller.PlayerData.charinfo.firstname, biller.PlayerData.citizenid})
TriggerClientEvent('qb-phone:RefreshPhone', billed.PlayerData.source)
TriggerClientEvent('QBCore:Notify', source, 'Invoice Successfully Sent', 'success')
TriggerClientEvent('QBCore:Notify', src, 'Invoice Successfully Sent', 'success')
TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, 'New Invoice Received')
end
else TriggerClientEvent('QBCore:Notify', source, "You can't charge $0", 'error') return end
end)
RegisterServerEvent("jim-payments:server:PayPopup", function(data)
local src = source
local billed = QBCore.Functions.GetPlayer(src)
local biller = QBCore.Functions.GetPlayer(tonumber(data.biller))
local newdata = { senderCitizenId = biller.PlayerData.citizenid, society = biller.PlayerData.job.name, amount = data.amount }
if data.gang == true then newdata.society = biller.PlayerData.gang.name end
if data.accept == true then
billed.Functions.RemoveMoney(tostring(data.billtype), data.amount)
TriggerEvent('jim-payments:Tickets:Give', newdata, biller, data.gang)
TriggerClientEvent("QBCore:Notify", data.biller, billed.PlayerData.charinfo.firstname.." accepted the $"..data.amount.." payment", "success")
elseif data.accept == false then
TriggerClientEvent("QBCore:Notify", src, "You declined the payment")
TriggerClientEvent("QBCore:Notify", data.biller, billed.PlayerData.charinfo.firstname.." declined the $"..data.amount.." payment", "error")
end
end)
RegisterServerEvent("jim-payments:server:PolCharge", function(citizen, price)
local src = source
local biller = QBCore.Functions.GetPlayer(src)
local billed = QBCore.Functions.GetPlayer(tonumber(citizen))
if tonumber(price) and tonumber(price) > 0 then
if not Config.FineJobConfirmation then
billed.Functions.RemoveMoney("bank", math.floor(tonumber(price)))
local commission = (tonumber(price) * Config.FineJobs[biller.PlayerData.job.name].Commission)
biller.Functions.AddMoney("bank", math.floor(commission))
if Config.Manage then
if Config.Manage then exports["qb-management"]:AddMoney(tostring(biller.PlayerData.job.name), price)
if Config.Debug then print("QB-Management(Job): Adding $"..price.." to account '"..tostring(biller.PlayerData.job.name).."'") end
else TriggerEvent("qb-bossmenu:server:addAccountMoney", tostring(biller.PlayerData.job.name), price)
if Config.Debug then print("QB-BossMenu: Adding $"..price.." to account '"..tostring(biller.PlayerData.job.name).."'") end
end
end
TriggerClientEvent('QBCore:Notify', src, billed.PlayerData.charinfo.firstname.." was charged for $"..tonumber(price), "success")
TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, 'You were charged for $'..tonumber(price))
else
TriggerClientEvent("jim-payments:client:PolPopup", billed.PlayerData.source, tonumber(price), src, biller.PlayerData.job.label)
end
else TriggerClientEvent('QBCore:Notify', source, "You can't charge $0", 'error') return end
end)
RegisterServerEvent("jim-payments:server:PolPopup", function(data)
local src = source
local billed = QBCore.Functions.GetPlayer(src)
local biller = QBCore.Functions.GetPlayer(tonumber(data.biller))
if data.accept == true then
billed.Functions.RemoveMoney("bank", data.amount)
TriggerClientEvent("QBCore:Notify", data.biller, billed.PlayerData.charinfo.firstname.." accepted the $"..data.amount.." charge", "success")
else
TriggerClientEvent("QBCore:Notify", src, "You declined the payment")
TriggerClientEvent("QBCore:Notify", data.biller, billed.PlayerData.charinfo.firstname.." declined the $"..data.amount.." charge", "error")
end
end)
QBCore.Functions.CreateCallback('jim-payments:MakePlayerList', function(source, cb)
local onlineList = {}
for k, v in pairs(QBCore.Functions.GetPlayers()) do
local P = QBCore.Functions.GetPlayer(v)
onlineList[#onlineList+1] = { value = tonumber(v), text = "["..v.."] - "..P.PlayerData.charinfo.firstname..' '..P.PlayerData.charinfo.lastname }
end
cb(onlineList)
cb(onlineList)
end)