43 Commits

Author SHA1 Message Date
Jim Shield
2eff1996c2 Version bump
`3.0` - `3.0.01`
2025-05-07 23:33:10 +01:00
Jim Shield
29b3b2ffb9 Hopefully fix the error when charging
I think if you had alot of players, it would overload itself and slip in a nil value when checking for player info

This checks if it is a real source number being sent and also adds a slightly delay to help load easier
2025-05-07 15:58:03 +01:00
Jim Shield
5cc7b60a1f fix discord bot yml 2025-05-01 13:37:46 +01:00
Jim Shield
41e146e35a add gitbot yml 2025-05-01 00:19:37 +01:00
Jim Shield
70fefa2a74 Merge pull request #47 from jimathy/v3.0 2025-04-28 18:20:00 +01:00
Jim Shield
f2b82e0b8c Create FUNDING.yml 2025-04-13 13:23:37 +01:00
Jim Shield
cbc202f101 Create FUNDING.yml + delay loading 2025-04-13 13:14:20 +01:00
Jim Shield
ecebdc801e adjust what can and cant be done on other frameworks for now 2025-03-08 21:05:07 +00:00
Jim Shield
10f477982d make use of jim_bridge new banking functions 2025-03-07 13:36:24 +00:00
Jim Shield
62e8242d9e (Beta) Fixes for multiframework features 2025-03-01 12:57:11 +00:00
Jim Shield
ef6b664890 Add files via upload 2025-02-22 13:23:43 +00:00
Jim Shield
2ebfeff554 Update 3.0 beta 2025-02-21 13:54:49 +00:00
Jim Shield
38f360fc26 Check for job commission info 2024-01-28 12:29:14 +00:00
Jim Shield
a21ea9f1db Add /polcharge support 2024-01-28 12:27:47 +00:00
Jim Shield
0905c7489c v3.0 Beta Push 2024-01-27 21:57:05 +00:00
Jim Shield
84a7f0611e Fix notification error in client.lua 2024-01-17 17:19:10 +00:00
Jim Shield
7b275735f6 Merge pull request #43 from County-Line-Roleplay-server/main 2024-01-10 02:00:16 +00:00
Chris McWilliams
00698be6c0 Update atmserver.lua
Corrected a SQL Duplication for account_name column on insertion into DB. Instead of Savings for account_name Savings_CitizenID will be used this is fully tested.
2024-01-09 20:57:23 -05:00
Jim Shield
e27f5eef3a Merge pull request #42 from RazerGhost/main 2024-01-10 00:50:35 +00:00
RazerGhost
0a953bc5db Added missing comma 2024-01-10 01:42:26 +01:00
Jim Shield
01f9d1a255 Merge pull request #41 from County-Line-Roleplay-server/main
Corrects Error QB-Banking
2024-01-09 23:58:26 +00:00
Jim Shield
0656afd7f1 Merge pull request #40 from taylorrenee1/main
added ox lib compat to input - may have ended up breaking some things sorry jim :^)
2024-01-09 23:58:10 +00:00
Jim Shield
813c25ad93 Merge pull request #37 from MystrGee/main
Add okokBanking support
2024-01-09 23:57:57 +00:00
Chris McWilliams
278c72193e Update client.lua 2024-01-07 02:40:56 -05:00
Chris McWilliams
ae738606d2 Update atms.lua 2024-01-07 02:39:42 -05:00
Chris McWilliams
f973050dfd Update server.lua 2024-01-07 02:38:59 -05:00
Chris McWilliams
53a65bd4a3 Update atmserver.lua 2024-01-07 02:37:55 -05:00
taylorrenee1
d8ab207dc7 Update client.lua 2024-01-06 22:14:08 -08:00
taylorrenee1
e1870b92b9 Update fxmanifest.lua 2024-01-06 21:36:38 -08:00
taylorrenee1
4a28bea810 Update config.lua 2024-01-06 21:36:23 -08:00
taylorrenee1
72ecfea64b Update client.lua 2024-01-06 21:36:09 -08:00
taylorrenee1
1b3878596e Update client.lua 2024-01-06 21:28:23 -08:00
Gaines
4ce9a753aa readme update 2023-12-23 02:51:42 -08:00
Gaines
79c357aa65 Revert config options to default 2023-12-23 02:47:42 -08:00
Gaines
0acfc606b7 add okokBanking support
Added support for okokBanking
2023-12-23 02:45:35 -08:00
Jim Shield
ac309a6a07 Merge pull request #36 from McKlean/main
v2.8.7 - QB-Banking support
2023-12-20 01:35:08 +00:00
Phantom
d55d809b64 v2.8.7
- Added da.lua locales
- Updated Script for qb-banking changes
- Fixed Config.Usebzzz issue
- Updated config to include Jim and Taylors newer Jobs
  - Added example of CustomCashRegister to config
  - Added Banking examples
2023-12-20 00:45:28 +00:00
Phantom
5425082cb2 Update to qb-banking v2.0.0
replaced qb-management exports to the new qb-banking exports
2023-12-06 22:27:14 +00:00
Jim Shield
eb8a17c5c3 Merge pull request #32 from UwUway/main
finish teh push
2023-11-08 21:43:57 +00:00
Stitch
1236f549d9 my brain 2023-11-08 13:37:45 -08:00
Stitch
bf476c9ca3 finish push 2023-11-08 13:36:15 -08:00
Stitch
a90129b4c6 Merge remote-tracking branch 'origin/main' into main 2023-11-08 13:32:55 -08:00
Jim Shield
065ad75dbd Merge pull request #31 from UwUway/main
add bzz terminal support and command disabling
2023-11-08 21:31:14 +00:00
22 changed files with 2135 additions and 1689 deletions

12
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: jixelpatterns
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: ['https://jimathy666.tebex.io/']

17
.github/workflows/notify-discord.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: Discord Commit Notifier
on:
push:
branches:
- '*' # triggers on all branches
jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Discord Commits
uses: Sniddl/discord-commits@v1.6
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
template: "avatar-with-link"
include-extras: true

415
README.md
View File

@@ -1,209 +1,208 @@
# jim-payments
- QBCore based payment system
- Enchanced QB-Input payment system from my other scripts now free on its own
### If you need support I have a discord server available, it helps me keep track of issues and give better support.
## https://discord.gg/xKgQZ6wZvS
### If you think I did a good job here, consider donating as it keeps by lights on and my cat fat/floofy:
## 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!
- Currently supported are:
- qb-phone
- gks-phone
- qs-smartphone - Leave the setting as "qb"
---
# Installation
---
- I always recommend starting my scripts AFTER `[qb]` not inside it as it can mess with any dependancies on server load
- I have a separate folder called `[jim]` (that is also in the resources folder) that starts WAY after everything else.
- This ensure's it has everything it requires before trying to load
- Example of my load order:
```CSS
# QBCore & Extra stuff
ensure qb-core
ensure [qb]
ensure [standalone]
ensure [voice]
ensure [defaultmaps]
ensure [vehicles]
#Extra Jim Stuff
ensure [jim]
```
---
## BZZ Terminal Instructions
Free Package https://bzzz.tebex.io/package/5551076
Stream the prop and add the emote that is provided to rpemotes or dpemotes
```lua
['terminal'] = {['name'] = 'terminal', ['label'] = 'Wireless Terminal', ['weight'] = 5000, ["type"] = "item", ["image"] = 'terminal.png', ['unique'] = true, ['useable'] = true, ["shouldClose"] = true, ["combinable"] = nil, ['description'] = ''},
```
---
## Item installation
- To make use of the ticket reward system for workers you need to add the ticket item to your shared items lua
- Naviage to `[qb] > qb-core / shared / items.lua` and add this line
```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!"},
```
- Add the ticket image to your inventory script:
- Naviage to `[qb] > qb-inventory > html > images` and add this line
![](https://github.com/jimathy/jim-payments/blob/main/images/ticket.png?raw=true)
---
## Phone Setup
- There are two modes in the script, one that uses the phone for invoices/bank charges
- The script supports many features like pay tickets, commission payments etc.
- If you want to use phone systems for these then you need to add the event for when a payment is accepted:
- REMINDER: IF using phone invoices, the money being added to the society accounts is handled `BY THE PHONE`, not by my script. If money isn't going to the account its the phone system or bossmenu script.
#### QB-Phone:
- Go to `[qb] > qb-phone > client > main.lua`
- Search for the event `RegisterNUICallback('PayInvoice', function(data, cb)` and look for the line:
```lua
TriggerServerEvent('qb-phone:server:BillingEmail', data, true)
```
- Directly *above* this line add:
```lua
TriggerServerEvent('jim-payments:Tickets:Give', data)
```
- The phone should now be integrated with jim-payments
#### GKS-Phone:
- Go to `gks-phone > server > serverapi.lua`
- Search for the event: `gksphone:faturapayBill` and search for this line:
```lua
Ply.Functions.RemoveMoney('bank', data[1].amount, "paid-invoice")
```
- Directly under this line add this event:
```lua
TriggerEvent('jim-payments:Tickets:Give', { sender = Ply.PlayerData.charinfo.firstname, senderCitizenId = data[1].sendercitizenid, society = data[1].society, amount = data[1].amount })
```
- The phone should now be integrated with jim-payments
#### Renewed QB-Phone:
- Go to `qb-phone > server > invoices.lua`
- Search for the event: `qb-phone:server:PayMyInvoice` and search for this line:
```lua
TriggerEvent("qb-phone:server:InvoiceHandler", true, amount, src, resource)
```
- Directly under this line add this event:
```lua
TriggerEvent('jim-payments:Tickets:Give', { amount = amount, senderCitizenId = sendercitizenid, sender = SenderPly.PlayerData.charinfo.firstname, society = society }, SenderPly)
```
- When invoices are paid, they should now be integrated with jim-payments
# Setup/Config
## Custom Locations
- You can make of this payment system for a job script that wasn't created by me
- All you need to do is add the job, grab a `vector4` (vector3 + heading) and set if you need a to spawn prop or not
- For example:
```lua
CustomCashRegisters = { -- Located in the config.lua
["burgershot"] = { -- Player job role restriction
{ coords = vector4(-1185.5, -878.54, 13.91, 305.53), prop = true, }, -- vector4 to place the till and the way it faces
{ coords = vector4(-1184.34, -880.51, 13.93, 302.04), prop = true, }, -- "prop = true" spawns a prop at the coords
},
},
```
### This does not need to be done for MY job scripts, they already have built in support
---
## PayTickets
![](https://i.imgur.com/ICbQyeQ.jpeg)
- This script has a built in ticket reward system
- On successful sale, the employees will be handed a ticket if they are clocked in
- This can then be handed in to the bank to receive payment
- Works as a reward and incentive for turning up to do work
- The values are set per job in `Config.Jobs`
- `TicketSystem` Enable this if you want to use the ticket system false
- `TicketSystemAll` Enable this to give tickets to all workers clocked in
---
## Commission System
- Support for commission to be paid as a reward for each successful payment
- Very customisable with the config.lua
- `Commission` Choose wether people get commission from every sale
- `CommissionAll` Choose if **EVERY** worker gets Commission that is on duty
- `CommissionDouble` Choose if Commission is limited by `MinAmountForTicket`
- `CommissionLimit` Choose if the worker charging the customer gets double commission
---
## Multiple Job and Gang Role support
- The script supports adding job roles to the config so they can get rewards for successful payments
- This includes Gang roles for stores/bars owned by a gang allowing them to get ticket rewards and commission
- Examples of adding jobs / gangs to config.lua:
```lua
Jobs = {
['mechanic'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
['lostmc'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, gang = true, },
},
```
- `MinAmountforTicket` is the amount required in a charge before they can get a ticket
- `PayPerTicket` is the amount paid per ticket at the bank for the job role
- I personally recommend this being lower than `MinAmountforTicket`, being too high makes it exploitable
- `Commission` is the amount of commission given to players on successful payments (0.10 = 10%)
- `gang = true` add this if the added role is a gang role
---
## /cashgive
![](https://i.imgur.com/AIdXzxX.jpeg)
- Alternative to /givecash
- A simple command built in to send cash to a `nearby player`
- Shows a list of names and id's of people nearby to select from rather
- Better experience than trying to figure out their ID and entering it manually
---
## /cashregister
![](https://i.imgur.com/37d2mE3.jpeg)
- This command is mean't as a portable cash register alternative
- For example:
- When a person is devliering food they can do `/cashregister` and the payment will still be sent to the society account
- Doesn't utilize the ticket reward system unfortunately
---
## /polcharge
- This script supports a customisable "police billing"
- This is the ability for selected jobroles to charge a nearby player
- Depending on how you've set it up, this can take money directly from the players bank to the job's society account
- This is by default enabled for `police` and `ambulance`
- This also supports giving the player a cut of the payment as `commission`
- Default Config:
```lua
FineJobs = {
['police'] = { Commission = 0.25, },
['ambulance'] = { Commission = 0.25, },
},
FineJobConfirmation = false, -- "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
```
---
## Banking
![](https://i.imgur.com/RYADcI2.jpeg)
- This script has simple banking systems built in
- Works as a basic replacement for qb-banking and qb-atms
- Adjust the options in config.lua:
- `useATM` Choose wether to make atm's usable
- `useBanks` Choose wether to make bank desks/teller's usable
- `BankBlips` Enable this if you disabled qb-banking and need bank locations
- `ATMBlips` Enable this if you are a pyscho and need every ATM to be on the map too
- `Gabz` Enable to change to Gabz Bank locations, this corrects the ATM/Bank Cashier + Ticket Cash in
---
## Support for other scripts
### Renewed-Banking
- Support for renewed banking added
- Toggle `RenewedBanking` in the config.lua to enable this
### Renewed's qb-phone
- Simply leave the Config.PhoneType as `"qb"`
### AP-Goverment
- Support for AP-Goverment Tax on payments
# jim-payments
- QBCore based payment system
- Enchanced QB-Input payment system from my other scripts now free on its own
### If you need support I have a discord server available, it helps me keep track of issues and give better support.
## https://discord.gg/xKgQZ6wZvS
### We also have Documentation over on Gitbook, feel free to check it out
## https://jixelpatterns.gitbook.io/jixelpatterns-script-guide/overview/who-we-are
### If you think I did a good job here, consider donating as it keeps by lights on and my cat fat/floofy:
## 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!
- Currently supported are:
- qb-phone
- gks-phone
- qs-smartphone - Leave the setting as "qb"
---
# Installation
---
- I always recommend starting my scripts AFTER `[qb]` not inside it as it can mess with any dependancies on server load
- I have a separate folder called `[jim]` (that is also in the resources folder) that starts WAY after everything else.
- This ensure's it has everything it requires before trying to load
- Example of my load order:
```CSS
# QBCore & Extra stuff
ensure qb-core
ensure [qb]
ensure [standalone]
ensure [voice]
ensure [defaultmaps]
ensure [vehicles]
#Extra Jim Stuff
ensure [jim]
```
---
## BZZ Terminal Instructions
Free Package https://bzzz.tebex.io/package/5551076
Stream the prop and add the emote that is provided to rpemotes or dpemotes
```lua
['terminal'] = {['name'] = 'terminal', ['label'] = 'Wireless Terminal', ['weight'] = 5000, ["type"] = "item", ["image"] = 'terminal.png', ['unique'] = true, ['useable'] = true, ["shouldClose"] = true, ["combinable"] = nil, ['description'] = ''},
```
---
## Item installation
- To make use of the ticket reward system for workers you need to add the ticket item to your shared items lua
- Naviage to `[qb] > qb-core / shared / items.lua` and add this line
```lua
payticket = { name = "payticket", label = "Receipt", weight = 10, type = "item", image = "ticket.png", unique = false, useable = false, shouldClose = false, description = "Cash these in at the bank!" },
```
- Add the ticket image to your inventory script:
- Naviage to `[qb] > qb-inventory > html > images` and add this line
![](https://github.com/jimathy/jim-payments/blob/main/images/ticket.png?raw=true)
---
## Phone Setup
- There are two modes in the script, one that uses the phone for invoices/bank charges
- The script supports many features like pay tickets, commission payments etc.
- If you want to use phone systems for these then you need to add the event for when a payment is accepted:
- REMINDER: IF using phone invoices, the money being added to the society accounts is handled `BY THE PHONE`, not by my script. If money isn't going to the account its the phone system or bossmenu script.
#### QB-Phone:
- Go to `[qb] > qb-phone > client > main.lua`
- Search for the event `RegisterNUICallback('PayInvoice', function(data, cb)` and look for the line:
```lua
TriggerServerEvent('qb-phone:server:BillingEmail', data, true)
```
- Directly *above* this line add:
```lua
TriggerServerEvent('jim-payments:Tickets:Give', data)
```
- The phone should now be integrated with jim-payments
#### GKS-Phone:
- Go to `gks-phone > server > serverapi.lua`
- Search for the event: `gksphone:faturapayBill` and search for this line:
```lua
Ply.Functions.RemoveMoney('bank', data[1].amount, "paid-invoice")
```
- Directly under this line add this event:
```lua
TriggerEvent('jim-payments:Tickets:Give', { sender = Ply.PlayerData.charinfo.firstname, senderCitizenId = data[1].sendercitizenid, society = data[1].society, amount = data[1].amount })
```
- The phone should now be integrated with jim-payments
#### Renewed QB-Phone:
- Go to `qb-phone > server > invoices.lua`
- Search for the event: `qb-phone:server:PayMyInvoice` and search for this line:
```lua
TriggerEvent("qb-phone:server:InvoiceHandler", true, amount, src, resource)
```
- Directly under this line add this event:
```lua
TriggerEvent('jim-payments:Tickets:Give', { amount = amount, senderCitizenId = sendercitizenid, sender = SenderPly.PlayerData.charinfo.firstname, society = society }, SenderPly)
```
- When invoices are paid, they should now be integrated with jim-payments
# Setup/Config
## Custom Locations
- You can make of this payment system for a job script that wasn't created by me
- All you need to do is add the job, grab a `vector4` (vector3 + heading) and set if you need a to spawn prop or not
- For example:
```lua
CustomCashRegisters = { -- Located in the config.lua
["burgershot"] = { -- Player job role restriction
{ coords = vector4(-1185.5, -878.54, 13.91, 305.53), prop = true, }, -- vector4 to place the till and the way it faces
{ coords = vector4(-1184.34, -880.51, 13.93, 302.04), prop = true, }, -- "prop = true" spawns a prop at the coords
},
},
```
### This does not need to be done for MY job scripts, they already have built in support
---
## PayTickets
![](https://i.imgur.com/ICbQyeQ.jpeg)
- This script has a built in ticket reward system
- On successful sale, the employees will be handed a ticket if they are clocked in
- This can then be handed in to the bank to receive payment
- Works as a reward and incentive for turning up to do work
- The values are set per job in `Config.Jobs`
- `TicketSystem` Enable this if you want to use the ticket system false
- `TicketSystemAll` Enable this to give tickets to all workers clocked in
---
## Commission System
- Support for commission to be paid as a reward for each successful payment
- Very customisable with the config.lua
- `Commission` Choose wether people get commission from every sale
- `CommissionAll` Choose if **EVERY** worker gets Commission that is on duty
- `CommissionDouble` Choose if Commission is limited by `MinAmountForTicket`
- `CommissionLimit` Choose if the worker charging the customer gets double commission
---
## Multiple Job and Gang Role support
- The script supports adding job roles to the config so they can get rewards for successful payments
- This includes Gang roles for stores/bars owned by a gang allowing them to get ticket rewards and commission
- Examples of adding jobs / gangs to config.lua:
```lua
Jobs = {
['mechanic'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
['lostmc'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, gang = true, },
},
```
- `MinAmountforTicket` is the amount required in a charge before they can get a ticket
- `PayPerTicket` is the amount paid per ticket at the bank for the job role
- I personally recommend this being lower than `MinAmountforTicket`, being too high makes it exploitable
- `Commission` is the amount of commission given to players on successful payments (0.10 = 10%)
- `gang = true` add this if the added role is a gang role
---
## /cashgive
![](https://i.imgur.com/AIdXzxX.jpeg)
- Alternative to /givecash
- A simple command built in to send cash to a `nearby player`
- Shows a list of names and id's of people nearby to select from rather
- Better experience than trying to figure out their ID and entering it manually
---
## /cashregister
![](https://i.imgur.com/37d2mE3.jpeg)
- This command is mean't as a portable cash register alternative
- For example:
- When a person is devliering food they can do `/cashregister` and the payment will still be sent to the society account
- Doesn't utilize the ticket reward system unfortunately
---
## /polcharge
- This script supports a customisable "police billing"
- This is the ability for selected jobroles to charge a nearby player
- Depending on how you've set it up, this can take money directly from the players bank to the job's society account
- This is by default enabled for `police` and `ambulance`
- This also supports giving the player a cut of the payment as `commission`
- Default Config:
```lua
FineJobs = {
['police'] = { Commission = 0.25, },
['ambulance'] = { Commission = 0.25, },
},
FineJobConfirmation = false, -- "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
```
---
## Banking
![](https://i.imgur.com/RYADcI2.jpeg)
- This script has simple banking systems built in
- Works as a basic replacement for qb-banking and qb-atms
- Adjust the options in config.lua:
- `useATM` Choose wether to make atm's usable
- `useBanks` Choose wether to make bank desks/teller's usable
- `BankBlips` Enable this if you disabled qb-banking and need bank locations
- `ATMBlips` Enable this if you are a pyscho and need every ATM to be on the map too
- `Gabz` Enable to change to Gabz Bank locations, this corrects the ATM/Bank Cashier + Ticket Cash in
---
### Renewed's qb-phone
- Simply leave the Config.PhoneType as `"qb"`
### AP-Goverment
- Support for AP-Goverment Tax on payments
- Toggle `ApGov` in the config.lua to enable this

View File

@@ -1,246 +1,171 @@
-- 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
local Targets = {}
local Peds = {}
local BankLoc = Config.VanBankLocations
local ATMLoc = Config.VanATMLocations
if Config.ATMs.enable then
onPlayerLoaded(function() -- Automatic detection of models and make targets and blips
Wait(2000)
while true do
local pedCoords = GetEntityCoords(PlayerPedId())
for _, v in pairs(GetGamePool('CObject')) do
for _, model in pairs(Config.ATMs.ATMModels) do
if GetEntityModel(v) == model then
local name, entCoords = getScript()..":ATMLocation:"..v, GetEntityCoords(v)
if #(pedCoords - entCoords) <= 150 then
if not Targets[name] then
Targets[name] =
createCircleTarget({name, vec3(entCoords.x, entCoords.y, entCoords.z+1.03), 0.5, { name=name, debugPoly = debugMode, useZ=true, },},
{ { action = function() lookEnt(v) TriggerEvent(getScript()..":Client:ATM") end,
icon = "fas fa-money-check-alt", label = locale("target", "atm"),
}, }, 1.5)
end
if Config.ATMs.showBlips then
if not DoesBlipExist(GetBlipFromEntity(v)) then
makeEntityBlip({entity = v, sprite = 434, col = 3, name = "ATM" })
end
end
else
removeZoneTarget(name)
Targets[name] = nil
if DoesBlipExist(GetBlipFromEntity(v)) then RemoveBlip(GetBlipFromEntity(v)) end
end
end
end
end
Wait(5000)
end
end, true)
end
local bossroles = {}
local gangroles = {}
CreateThread(function()
if Config.useATM then
if Config.ATMBlips then
for _, v in pairs(Config.WallATMLocations) do
makeBlip({coords = v, sprite = 108, col = 3, scale = 0.55, disp = 6, name = Loc[Config.Lan].blip["blip_atm"] })
end
for _, v in pairs(Config.ATMLocations) do
makeBlip({coords = v, sprite = 108, col = 3, scale = 0.55, disp = 6, name = Loc[Config.Lan].blip["blip_atm"] })
end
end
end
if Config.useBanks then
if Config.BankBlips then
for _, v in pairs(Config.BankLocations) do
for _, b in pairs(v) do
makeBlip({coords = b, sprite = 108, col = 2, scale = 0.55, disp = 6, name = Loc[Config.Lan].blip["blip_bank"] })
break
end
end
end
end
if Config.useATM or Config.useBanks then
for k in pairs(QBCore.Shared.Jobs) do ---Grabs the list of jobs
if QBCore.Shared.Jobs[tostring(k)] then
for l 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)] 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
for k in pairs(QBCore.Shared.Gangs) do
if QBCore.Shared.Gangs[tostring(k)] then
for l 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)] 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
if Config.useATM then
exports['qb-target']:AddTargetModel(Config.ATMModels, { options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-alt", label = Loc[Config.Lan].target["atm"], id = "atm" },}, distance = 1.5, })
for k,v in pairs(Config.WallATMLocations) do
Targets["jimwallatm"..k] =
exports['qb-target']:AddCircleZone("jimwallatm"..k, vector3(v.x, v.y, 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 = Loc[Config.Lan].target["atm"], id = "atm" },
--{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = Loc[Config.Lan].target["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(v.x, v.y, 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 = Loc[Config.Lan].target["atm"], id = "atm" },
--{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = Loc[Config.Lan].target["transfer_money"], id = "transfer" },
}, distance = 1.5 })
end
end
if Config.useBanks then
for k,v in pairs(Config.BankLocations) do
for l, b in pairs(v) do
Targets["jimbank"..k..l] =
exports['qb-target']:AddCircleZone("jimbank"..k..l, vector3(b.x, b.y, 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 = Loc[Config.Lan].target["bank"], id = "bank" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = Loc[Config.Lan].target["transfer"], id = "transfer" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-dollar", label = Loc[Config.Lan].target["saving"], id = "savings" },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-building", label = Loc[Config.Lan].target["soc_saving"], id = "society", job = bossroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = Loc[Config.Lan].target["soc_trans"], id = "societytransfer", job = bossroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-building", label = Loc[Config.Lan].target["gang_acct"], id = "gang", gang = gangroles },
{ event = "jim-payments:Client:ATM:use", icon = "fas fa-arrow-right-arrow-left", label = Loc[Config.Lan].target["gang_trans"], id = "gangtransfer", gang = gangroles }, },
distance = 2.5 })
if Config.Peds then
local i = math.random(1, #Config.PedPool)
if not Config.Gabz then CreateModelHide(b.xyz, 1.0, `v_corp_bk_chair3`, true) end
if not Peds["jimbank"..k..l] then Peds["jimbank"..k..l] = makePed(Config.PedPool[i], b, false, false) end
end
end
end
end
end)
RegisterNetEvent('jim-payments:Client:ATM:use', function(data)
RegisterNetEvent(getScript()..":Client:ATM", function() local setheader = nil
--this grabs all the info from names to savings account numbers in the databases
local p = promise.new()
QBCore.Functions.TriggerCallback('jim-payments:ATM:Find', function(cb) p:resolve(cb) end) local info = Citizen.Await(p)
if Config.Banking == "qb" then
local p = promise.new()
QBCore.Functions.TriggerCallback('qb-bossmenu:server:GetAccount', function(cb) p:resolve(cb) end, PlayerJob.name) info.society = Citizen.Await(p)
local p2 = promise.new()
QBCore.Functions.TriggerCallback('qb-gangmenu:server:GetAccount', function(cb) p2:resolve(cb) end, PlayerGang.name) info.gsociety = Citizen.Await(p2)
end
local atmbartime = 2500
local bartext = ""
local setoptions = {}
local info = triggerCallback(getScript()..":GetInfo")
if data.id == "atm" then
setoptions = { { value = "withdraw", text = Loc[Config.Lan].menu["withdraw"] }, }
setview = "<center><img src=https://static.wikia.nocookie.net/gtawiki/images/b/bd/Fleeca-GTAV-Logo.png width=200px></center><br>"..Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["citizenid"]..info.cid..Loc[Config.Lan].menu["header_balance_bank"]..cv(info.bank)..Loc[Config.Lan].menu["cash_balance"]..cv(info.cash)..Loc[Config.Lan].menu["header_option"]
setheader = Loc[Config.Lan].menu["header_atm"]
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
for k, v in pairs(Config.ATMModels) do
if IsObjectNearPoint(v, GetEntityCoords(PlayerPedId()), 1.6) then
local obj = GetClosestObjectOfType(GetEntityCoords(PlayerPedId()), 1.6, v, false, false, false)
local atmCoords = GetEntityCoords(obj)
lookEnt(obj)
bartext = Loc[Config.Lan].menu["acc_atm"]
end
end
playAnim("amb@prop_human_atm@male@enter", "enter", 2000, 1)
elseif data.id == "bank" then
setoptions = { { value = "withdraw", text = Loc[Config.Lan].menu["withdraw"] }, { value = "deposit", text = Loc[Config.Lan].menu["deposit"] } }
setview = Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["header_acc"]..info.account.."<br>"..info.cid..Loc[Config.Lan].menu["header_balance_bank"]..cv(info.bank)..Loc[Config.Lan].menu["cash_balance"]..cv(info.cash)..Loc[Config.Lan].menu["header_option"]
setheader = Loc[Config.Lan].menu["header_bank"]
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
bartext = Loc[Config.Lan].menu["acc_bank"]
if progressBar({ label = locale("menu", "acc_atm"), time = 3000 }) then
local Menu = {}
elseif data.id == "transfer" then
setoptions = { { value = "transfer", text = Loc[Config.Lan].menu["transfer"] } }
setview = Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["header_acc"]..info.account.."<br>"..info.cid..Loc[Config.Lan].menu["header_balance_bank"]..cv(info.bank)..Loc[Config.Lan].menu["header_option"]
setheader = Loc[Config.Lan].menu["header_trans"]
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'text', isRequired = true, name = 'account', text = Loc[Config.Lan].menu["header_account_no"] },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
Menu[#Menu+1] = {
isMenuHeader = true,
header = locale("menu", "welcome")..info.name,
txt = info.cid,
}
Menu[#Menu+1] = {
isMenuHeader = true,
header = locale("menu", "header_balance"),
txt = locale("menu", "bank_balance")..cv(info.bank)..br..locale("menu", "cash_balance")..cv(info.cash)
}
Menu[#Menu+1] = {
header = locale("menu", "withdraw"),
onSelect = function()
atmWithdrawl(info)
end,
}
local header = locale("menu", "header_atm")
if Config.System.Menu == "qb" then
header = "<center><img src="..Config.General.menuLogo.." width=200px></center>"
elseif Config.System.Menu == "ox" then
header = '!['..''.. ']('..Config.General.menuLogo..')'
end
openMenu(Menu, { header = header, canClose = true, onExit = function() playAnim("amb@prop_human_atm@male@exit", "exit", 3000, 1) end, })
else
triggerNotify(nil, locale("error", "cancel"), "error")
end
end)
bartext = Loc[Config.Lan].menu["acc_trans"]
function atmWithdrawl(info)
local setimage = locale("menu", "header_atm")
if Config.System.Menu == "qb" then setimage = "<center><img src="..Config.General.menuLogo.." width=200px></center>"
elseif Config.System.Menu == "ox" then setimage = '!['..''.. ']('..Config.General.menuLogo..')'
end
local dialog = createInput(locale("menu", "header_atm"), {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and locale("menu", "bank_balance")..cv(info.bank)..locale("menu", "cash_balance")..cv(info.cash)
or
setimage..
locale("menu", "header_balance")..br..
locale("menu", "bank_balance")..cv(info.bank)..br..
locale("menu", "cash_balance")..cv(info.cash)..br..br..
locale("menu", "header_option"),
options = {
{ value = "withdraw", text = locale("menu", "withdraw") },
} },
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount"),
min = 0,
max = info.bank,
},
})
if dialog then
if dialog[1] then
dialog.billtype = dialog[1]
dialog.amount = dialog[2] or 1
end
if not dialog.amount then return end
playAnim("amb@prop_human_atm@male@exit", "exit", 3000, 1)
Wait(1000)
TriggerServerEvent(getScript()..":server:ATM:use", dialog.amount, dialog.billtype, dialog.account, "atm", info.society, info.gsociety)
end
end
elseif data.id == "savings" then
setoptions = { { value = "withdraw", text = Loc[Config.Lan].menu["withdraw"] }, { value = "deposit", text = Loc[Config.Lan].menu["deposit"] } }
setview = Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["header_info"]..info.aid.."<br>"..info.cid..Loc[Config.Lan].menu["saving_balance"]..cv(info.savbal)..Loc[Config.Lan].menu["bank_balance"]..cv(info.bank)..Loc[Config.Lan].menu["header_option"]
setheader = Loc[Config.Lan].menu["header_saving"]
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
bartext = Loc[Config.Lan].menu["acc_saving"]
RegisterNetEvent(getScript()..":client:ATM:give", function()
elseif data.id == "society" then
setoptions = { { value = "withdraw", text = Loc[Config.Lan].menu["withdraw"] }, { value = "deposit", text = Loc[Config.Lan].menu["deposit"] } }
setview = Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["header_soc"]..PlayerJob.label..Loc[Config.Lan].menu["header_balance"]..PlayerJob.label.." - $"..cv(info.society)..Loc[Config.Lan].menu["bank_balance"]..cv(info.bank)
setheader = Loc[Config.Lan].menu["header_soc_bank"]
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
bartext = Loc[Config.Lan].menu["acc_boss"]
elseif data.id == "societytransfer" then
setoptions = { { value = "transfer", text = Loc[Config.Lan].menu["transfer"] } }
setview = Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["header_soc"]..PlayerJob.label..Loc[Config.Lan].menu["header_balance"]..PlayerJob.label.." - $"..cv(info.society)..Loc[Config.Lan].menu["header_option"]
setheader = Loc[Config.Lan].menu["header_trans"]
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'text', isRequired = true, name = 'account', text = Loc[Config.Lan].menu["header_account_no"] },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
bartext = Loc[Config.Lan].menu["acc_boss_trans"]
elseif data.id == "gang" then
setheader = Loc[Config.Lan].menu["header_soc_bank"]
setview = Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["header_soc"]..PlayerGang.label..Loc[Config.Lan].menu["header_balance"]..PlayerGang.label.." - $"..cv(info.gsociety)..Loc[Config.Lan].menu["bank_balance"]..cv(info.bank)..Loc[Config.Lan].menu["header_option"]
setoptions = { { value = "withdraw", text = Loc[Config.Lan].menu["withdraw"] }, { value = "deposit", text = Loc[Config.Lan].menu["deposit"] } }
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
bartext = Loc[Config.Lan].menu["acc_gang"]
elseif data.id == "gangtransfer" then
setoptions = { { value = "transfer", text = Loc[Config.Lan].menu["transfer"] } }
setview = Loc[Config.Lan].menu["welcome"]..info.name..Loc[Config.Lan].menu["header_soc"]..PlayerGang.label..Loc[Config.Lan].menu["header_balance"]..PlayerGang.label.." - $"..cv(info.gsociety)..Loc[Config.Lan].menu["header_option"]
setheader = Loc[Config.Lan].menu["header_trans"]
setinputs = { { type = 'radio', name = 'billtype', text = setview, options = setoptions },
{ type = 'text', isRequired = true, name = 'account', text = Loc[Config.Lan].menu["header_account_no"] },
{ type = 'number', isRequired = true, name = 'amount', text = Loc[Config.Lan].menu["header_trans_amount"] }, }
bartext = Loc[Config.Lan].menu["acc_gang_trans"]
local newinputs = {} -- Begin qb-input creation here.
local nearbyList = {}
if Config.General.List then -- If nearby player list is wanted:
--Retrieve a list of nearby players from server
local onlineList = triggerCallback(getScript()..":MakePlayerList")
--Convert list of players nearby into one qb-input understands + add distance info
local playerCoords = GetEntityCoords(PlayerPedId())
for _, v in ipairs(GetPlayersFromCoords(playerCoords, Config.General.PaymentRadius)) do
local ped = GetPlayerPed(v)
local dist = #(GetEntityCoords(ped) - playerCoords)
for i = 1, #onlineList do
if onlineList[i].value == GetPlayerServerId(v) then
if v ~= PlayerId() or debugMode then
nearbyList[#nearbyList+1] = {
value = onlineList[i].value,
label = onlineList[i].text .. ' (' .. math.floor(dist+0.05) .. 'm)',
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[1] then triggerNotify(nil, locale("error" ,"no_one"), "error") return end
else -- If Config.List is false, create input text box for ID's
newinputs[#newinputs+1] = { type = 'text', isRequired = true, required = true, name = 'citizen', label = locale("menu" ,"person_id"), text = locale("menu" ,"person_id") }
end
loadAnimDict('amb@prop_human_atm@male@enter')
TaskPlayAnim(PlayerPedId(), 'amb@prop_human_atm@male@enter', "enter", 1.0,-1.0, 1500, 1, 1, true, true, true)
unloadAnimDict('amb@prop_human_atm@male@enter')
QBCore.Functions.Progressbar("accessing_atm", bartext, atmbartime, false, true, { disableMovement = false, disableCarMovement = false, disableMouse = false, disableCombat = false, }, {}, {}, {}, function()
local dialog = exports['qb-input']:ShowInput({ header = setheader, txt = "test", submitText = Loc[Config.Lan].menu["transfer"], inputs = setinputs })
if dialog then
if not dialog.amount then return end
loadAnimDict('amb@prop_human_atm@male@exit')
TaskPlayAnim(PlayerPedId(), 'amb@prop_human_atm@male@exit', "exit", 1.0,-1.0, 3000, 1, 1, true, true, true)
unloadAnimDict('amb@prop_human_atm@male@enter')
Wait(1000)
TriggerServerEvent('jim-payments:server:ATM:use', dialog.amount, dialog.billtype, dialog.account, data.id, info.society, info.gsociety)
end
end, function() triggerNotify(nil, Loc[Config.Lan].error["cancel"], "error")
end, data.icon)
end)
if Config.General.List then
newinputs[#newinputs+1] = { type = "select", text = locale("menu" ,"cus_id"), name = "citizen", label = locale("menu" ,"cus_id"), default = 1, options = nearbyList }
else
newinputs[#newinputs+1] = { type = 'text', isRequired = true, name = 'citizen', text = locale("menu" ,"cus_id") }
end
newinputs[#newinputs+1] = {
type = 'select',
name = 'billtype',
text = locale("menu" ,"type"),
default = billPrev,
options = {
{ value = "cash", text = locale("menu" ,"cash"), label = locale("menu" ,"cash") },
}
}
newinputs[#newinputs+1] = { type = 'number', isRequired = true, name = 'price', text = locale("menu" ,"amount_charge") }
RegisterNetEvent('jim-payments:client:ATM:give', function()
local onlineList = {}
local nearbyList = {}
QBCore.Functions.TriggerCallback('jim-payments:MakePlayerList', function(cb) onlineList = cb if onlineList[1] == nil then Wait(200) end
for _, id in pairs(QBCore.Functions.GetPlayersFromCoords(GetEntityCoords(PlayerPedId()), Config.PaymentRadius)) do
local dist = #(GetEntityCoords(GetPlayerPed(id)) - GetEntityCoords(PlayerPedId()))
for i = 1, #onlineList do
if onlineList[i].value == GetPlayerServerId(id) then
if id ~= 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
dist = nil
end
if not nearbyList[1] then triggerNotify(nil, Loc[Config.Lan].error["no_one"], "error") return end
local dialog = exports['qb-input']:ShowInput({ header = Loc[Config.Lan].menu["give_cash"], submitText = Loc[Config.Lan].menu["give"],
inputs = {
{ text = " ", name = "citizen", type = "select", options = nearbyList },
{ type = 'number', isRequired = true, name = 'price', text = Loc[Config.Lan].menu["amount_pay"] }, }
})
if dialog then
if not dialog.citizen or not dialog.price then return end
TriggerServerEvent('jim-payments:server:ATM:give', dialog.citizen, dialog.price)
end
end)
end)
local dialog = createInput(locale("menu", "give_cash"), newinputs)
AddEventHandler('onResourceStop', function(r) if r ~= 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)
if dialog then
if dialog[1] then
dialog.citizen = dialog[1]
dialog.billtype = dialog[2]
dialog.price = dialog[3]
end
billPrev = dialog.billtype
TriggerServerEvent('jim-payments:server:ATM:give', dialog.citizen, dialog.price)
end
end)

365
client/banks.lua Normal file
View File

@@ -0,0 +1,365 @@
Peds = {}
RegisterNetEvent('QBCore:Client:SetDuty', function(duty) onDuty = duty end)
if Config.Banks.enable then
onPlayerLoaded(function()
for k, v in pairs(BankLocations) do
for i = 1, #v do
local name = getScript()..":BankLocation:"..k..i
if Config.General.Peds then
if not Config.Gabz then CreateModelHide(v[i].xyz, 1.0, `v_corp_bk_chair3`, true) end
if not Peds[name] then
Peds[name] = makePed(Config.General.PedPool[math.random(1, #Config.General.PedPool)], v[i], false, false)
if isStarted("jim-talktonpc") then
exports["jim-talktonpc"]:createDistanceMessage("hi", Peds[name], 3.0, false)
end
end
end
local jobroles = {} local gangroles = {}
for k, v in pairs(Config.Receipts.Jobs) do
if v.gang then
gangroles[k] = 0
else
jobroles[k] = 0
end
end
createCircleTarget(
{ name, vec3(v[i].x, v[i].y, v[i].z+0.2), 2.0, { name = name, debugPoly = debugMode, useZ = true, }, }, {
{ action = function()
if Config.General.Peds and isStarted("jim-talktonpc") then
exports["jim-talktonpc"]:createCam(Peds[name], true, "generic", true)
end
TriggerEvent(getScript()..":Client:Bank", { ped = Config.General.Peds and Peds[name] })
end,
icon = "fas fa-piggy-bank", label = locale("target", "bank") },
{ action = function() TriggerEvent(getScript()..":Tickets:Menu", { gang = false }) end,
icon = "fas fa-receipt", label = locale("target", "cashin_boss"), job = jobroles,
},
{ action = function() TriggerEvent(getScript()..":Tickets:Menu", { gang = true }) end,
icon = "fas fa-receipt", label = locale("target", "cashin_gang"), gang = gangroles,
},
}, 2.5)
if Config.Banks.showBlips then
makeBlip({coords = v[i], sprite = 814, col = 2, scale = 0.7, disp = 6, name = locale("blip", "blip_bank") })
end
end
end
end, true)
end
RegisterNetEvent(getScript()..":Client:Bank", function(data) local setheader = nil
--this grabs all the info from names to savings account numbers in the databases
local bankinfo = triggerCallback(getScript()..":GetInfo")
local info = getPlayer()
info.ped = data.ped or nil
playAnim("amb@prop_human_atm@male@enter", "enter", 2000, 1)
if progressBar({ label = locale("menu", "acc_bank"), time = 3000 }) then
local Menu = {}
Menu[#Menu+1] = {
isMenuHeader = true,
header = locale("menu", "welcome")..info.name,
txt = locale("menu", "header_acc").." "..info.account..br..locale("menu", "citizenid").." "..info.citizenId,
}
Menu[#Menu+1] = {
isMenuHeader = true,
header = locale("menu", "header_acc")..locale("menu", "header_balance"),
txt = locale("menu", "bank_balance")..cv(info.bank)..br..locale("menu", "cash_balance")..cv(info.cash)
}
Menu[#Menu+1] = {
header = locale("menu", "deposit").."/"..locale("menu", "withdraw"),
icon = "fas fa-piggy-bank",
onSelect = function()
info.id = "bank"
bankTransaction(info, bankinfo)
end,
}
if isStarted(QBExport) and not isStarted(QBXExport) then -- only supports qbcore account transfers
Menu[#Menu+1] = {
header = locale("target", "transfer"),
icon = "fas fa-arrow-right-arrow-left",
onSelect = function()
info.id = "transfer"
bankTransaction(info, bankinfo)
end,
}
Menu[#Menu+1] = {
header = locale("target", "saving"),
icon = "fas fa-money-check-dollar",
onSelect = function()
info.id = "savings"
bankTransaction(info, bankinfo)
end,
}
end
if info.jobBoss then
Menu[#Menu+1] = {
header = locale("target", "soc_saving"),
txt = Jobs[info.job].label..br.." 🏦 $"..bankinfo.society or "Error",
icon = "fas fa-building",
onSelect = function()
info.id = "society"
bankTransaction(info, bankinfo)
end,
}
if isStarted(QBExport) and not isStarted(QBXExport) then -- only supports qbcore account transfers
Menu[#Menu+1] = {
header = locale("target", "soc_trans"),
txt = Jobs[info.job].label or "Error",
icon = "fas fa-arrow-right-arrow-left",
onSelect = function()
info.id = "societytransfer"
bankTransaction(info, bankinfo)
end,
}
end
end
if info.gangBoss then
Menu[#Menu+1] = {
header = locale("target", "gang_acct"),
txt = Gangs[info.gang].label or "Error",
icon = "fas fa-building",
onSelect = function()
info.id = "gang"
bankTransaction(info, bankinfo)
end,
}
if isStarted(QBExport) then
Menu[#Menu+1] = {
header = locale("target", "gang_trans"),
txt = Gangs[info.gang].label or "Error",
icon = "fas fa-arrow-right-arrow-left",
onSelect = function()
info.id = "gangtransfer"
bankTransaction(info, bankinfo)
end,
}
end
end
local header = locale("menu", "header_atm")
if Config.System.Menu == "qb" then header = "<center><img src="..Config.General.menuLogo.." width=200px></center>"
elseif Config.System.Menu == "ox" then header = '!['..''.. ']('..Config.General.menuLogo..')'
end
openMenu(Menu, { header = header, canClose = true, onExit = function()
if Config.General.Peds and isStarted("jim-talktonpc") then
exports["jim-talktonpc"]:stopCam()
end
playAnim("amb@prop_human_atm@male@exit", "exit", 3000, 1)
end, })
else
triggerNotify(nil, locale("error", "cancel"), "error")
end
end)
function bankTransaction(info, bankinfo)
local setimage = locale("menu", "header_atm")
if Config.System.Menu == "qb" then setimage = "<center><img src="..Config.General.menuLogo.." width=200px></center>"
elseif Config.System.Menu == "ox" then setimage = '!['..''.. ']('..Config.General.menuLogo..')'
end
playAnim("amb@prop_human_atm@male@idle_a", "idle_a", nil, 1)
if isStarted("jim-talktonpc") then exports["jim-talktonpc"]:injectEmotion("thanks", info.ped) end
local setinputs, setheader = {}, ""
if info.id == "bank" then
setheader = locale("menu", "header_bank")
setinputs = {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and locale("menu", "bank_balance")..cv(info.bank)..locale("menu", "cash_balance")..cv(info.cash)
or
setimage..
locale("menu", "header_balance")..br..
locale("menu", "bank_balance")..cv(info.bank)..br..
locale("menu", "cash_balance")..cv(info.cash)..br..br..
locale("menu", "header_option"),
options = {
{ value = "withdraw", text = locale("menu", "withdraw") },
{ value = "deposit", text = locale("menu", "deposit") }
},
},
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount")
},
}
elseif info.id == "transfer" then
setheader = locale("menu", "header_trans")
setinputs = {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and locale("menu", "bank_balance")..cv(info.bank)
or
setimage..
locale("menu", "header_balance")..br..
locale("menu", "bank_balance")..cv(info.bank)..br..
locale("menu", "header_option"),
options = {
{ value = "transfer", text = locale("menu", "transfer") }
},
},
{ type = 'text',
isRequired = true,
name = 'account',
text = locale("menu", "header_account_no")
},
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount"),
min = 0,
max = info.bank,
},
}
elseif info.id == "savings" then
setheader = locale("menu", "header_saving")
setinputs = {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and locale("menu", "saving_balance")..cv(bankinfo.savbal)..locale("menu", "bank_balance")..cv(info.bank)
or
setimage..
locale("menu", "header_balance")..br..
locale("menu", "saving_balance")..cv(bankinfo.savbal)..br..
locale("menu", "bank_balance")..cv(info.bank)..br..br..
locale("menu", "header_option"),
options = {
{ value = "withdraw", text = locale("menu", "withdraw") },
{ value = "deposit", text = locale("menu", "deposit") }
}
},
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount")
},
}
elseif info.id == "society" then
setheader = Jobs[info.job].label.." - "..locale("menu", "header_soc_bank")
setinputs = {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and Jobs[info.job].label.." - $"..cv(bankinfo.society)..locale("menu", "bank_balance")..cv(info.bank)
or
setimage..
locale("menu", "header_balance")..br..
Jobs[info.job].label.." - $"..cv(bankinfo.society)..br..
locale("menu", "bank_balance")..cv(info.bank)..br..br..
locale("menu", "header_option"),
options = {
{ value = "withdraw", text = locale("menu", "withdraw") },
{ value = "deposit", text = locale("menu", "deposit") }
}
},
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount")
},
}
elseif info.id == "societytransfer" then
setheader =Jobs[info.job].label.." - "..locale("menu", "header_trans")
setinputs = {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and Jobs[info.job].label.." - $"..cv(bankinfo.society)..locale("menu", "bank_balance")..cv(info.bank)
or
setimage..
locale("menu", "header_balance")..br..
Jobs[info.job].label.." - $"..cv(bankinfo.society)..br..
locale("menu", "bank_balance")..cv(info.bank)..br..br..
locale("menu", "header_option"),
options = { { value = "transfer", text = locale("menu", "transfer") } }
},
{ type = 'text',
isRequired = true,
name = 'account',
text = locale("menu", "header_account_no")
},
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount")
},
}
elseif info.id == "gang" then
setheader = Gangs[info.gang].label.." - "..locale("menu", "header_soc_bank")
setinputs = {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and Gangs[info.gang].label.." - $"..cv(bankinfo.gsociety)..locale("menu", "bank_balance")..cv(info.bank)
or
setimage..
locale("menu", "header_balance")..br..
Gangs[info.gang].label.." - $"..cv(bankinfo.gsociety)..br..
locale("menu", "bank_balance")..cv(info.bank)..br..br..
locale("menu", "header_option"),
options = {
{ value = "withdraw", text = locale("menu", "withdraw") },
{ value = "deposit", text = locale("menu", "deposit") }
}
},
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount")
},
}
elseif info.id == "gangtransfer" then
setheader = Gangs[info.gang].label.." - "..locale("menu", "header_soc_bank")
setinputs = {
{ type = 'radio',
name = 'billtype',
text = Config.System.Menu == "ox" and Gangs[info.gang].label.." - $"..cv(bankinfo.gsociety)..locale("menu", "bank_balance")..cv(info.bank)
or
setimage..
locale("menu", "header_balance")..br..
Gangs[info.gang].label.." - $"..cv(bankinfo.gsociety)..br..
locale("menu", "bank_balance")..cv(info.bank)..br..br..
locale("menu", "header_option"),
options = {
{ value = "transfer", text = locale("menu", "transfer") }
}
},
{ type = 'text',
isRequired = true,
name = 'account',
text = locale("menu", "header_account_no")
},
{ type = 'number',
isRequired = true,
name = 'amount',
text = locale("menu", "header_trans_amount")
},
}
end
local dialog = createInput(setheader, setinputs)
if dialog then
if dialog[1] then
dialog.billtype = dialog[1]
dialog.amount = dialog[2] or 1
end
if not dialog.amount then
TriggerEvent(getScript()..":Client:Bank", { ped = info.ped })
return
end
if Config.General.Peds and isStarted("jim-talktonpc") then
exports["jim-talktonpc"]:stopCam()
end
playAnim("amb@prop_human_atm@male@exit", "exit", 3000, 1)
Wait(1000)
TriggerServerEvent(getScript()..":server:ATM:use", dialog.amount, dialog.billtype, dialog.account, info.id, bankinfo.society, bankinfo.gsociety)
end
end

150
client/charge.lua Normal file
View File

@@ -0,0 +1,150 @@
local BankPed = nil
local Till = {}
function spawnCustomRegisters()
Wait(1000)
for k, v in pairs(Config.CustomCashRegisters) do
for i = 1, #v do
local job, gang = v[i].gang and nil or k, v[i].gang and k or nil
createBoxTarget({"CustomRegister: "..k..i, v[i].coords.xyz, 0.47, 0.34, { name="CustomRegister: "..k..i, heading = v[i].coords[4], debugPoly=debugMode, minZ=v[i].coords.z-0.1, maxZ=v[i].coords.z+0.4}}, {
{ onSelect = function() TriggerEvent(getScript()..":client:Charge", { job = job, gang = gang, img = ""}) end, icon = "fas fa-credit-card", label = locale("target", "charge"), }
}, 2.0)
if v[i].prop then makeProp({prop = "prop_till_03", coords = v[i].coords}, 1, false) end
end
end
end
onPlayerLoaded(function() spawnCustomRegisters() end, true)
local billPrev = "cash"
RegisterNetEvent(getScript()..":client:Charge", function(data, outside)
--if not outside and not onDuty and data.gang == nil then triggerNotify(nil, locale("error", "not_onduty") return end
local newinputs = {} -- Begin qb-input creation here.
local nearbyList = {}
if Config.General.List then -- If nearby player list is wanted:
--Retrieve a list of nearby players from server
local onlineList = triggerCallback(getScript()..":MakePlayerList")
--Convert list of players nearby into one qb-input understands + add distance info
local playerCoords = GetEntityCoords(PlayerPedId())
for _, v in ipairs(GetPlayersFromCoords(playerCoords, Config.General.PaymentRadius)) do
local ped = GetPlayerPed(v)
local dist = #(GetEntityCoords(ped) - playerCoords)
for i = 1, #onlineList do
if onlineList[i].value == GetPlayerServerId(v) then
if v ~= PlayerId() or debugMode then
nearbyList[#nearbyList+1] = {
value = onlineList[i].value,
label = onlineList[i].text .. ' (' .. math.floor(dist+0.05) .. 'm)',
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[1] then triggerNotify(nil, locale("error" ,"no_one"), "error") return end
else -- If Config.List is false, create input text box for ID's
newinputs[#newinputs+1] = { type = 'text', isRequired = true, required = true, name = 'citizen', label = locale("menu" ,"person_id"), text = locale("menu" ,"person_id") }
end
--Grab Player Job name or Gang Name if needed
local getInfo = getPlayer()
--Check if image was given when opening the regsiter
local img = data.img ~= nil and (Config.System.Menu == "qb" and "<center><img src="..(data.img).." width=200px></center>") or Jobs[getInfo.job].label
if Config.General.List then
newinputs[#newinputs+1] = { type = "select", text = locale("menu" ,"cus_id"), name = "citizen", label = locale("menu" ,"cus_id"), default = 1, options = nearbyList }
else
newinputs[#newinputs+1] = { type = 'text', isRequired = true, name = 'citizen', text = locale("menu" ,"cus_id") }
end
newinputs[#newinputs+1] = {
type = 'select',
name = 'billtype',
text = locale("menu" ,"type"),
default = billPrev,
options = {
{ value = "cash", text = locale("menu" ,"cash"), label = locale("menu" ,"cash") },
{ value = "bank", text = locale("menu" ,"card"), label = locale("menu" ,"card") }
}
}
newinputs[#newinputs+1] = { type = 'number', isRequired = true, name = 'price', text = locale("menu" ,"amount_charge") }
local dialog = createInput(img, newinputs)
if dialog then
if dialog[1] then
dialog.citizen = dialog[1]
dialog.billtype = dialog[2]
dialog.price = dialog[3]
end
billPrev = dialog.billtype
TriggerServerEvent(getScript()..":server:Charge", dialog.citizen, dialog.price, dialog.billtype, data.img, outside, gang)
end
end)
RegisterNetEvent(getScript()..":client:PayPopup", function(amount, biller, billtype, img, billerjob, gang, outside)
local setimage = ""
print(billerjob)
if not img then
setimage = billerjob
else
if Config.System.Menu == "qb" then
setimage = "<center><img src="..(img and img or "").." width=200px></center>"
elseif Config.System.Menu == "ox" then
setimage = '!['..''.. ']('..(img and img or "")..')'
end
end
local Menu = {}
Menu[#Menu+1] = {
isMenuHeader = true,
header = "🧾 "..locale("menu" ,"payment"),
txt = locale("menu" ,"accept_payment")
}
Menu[#Menu+1] = {
isMenuHeader = true,
header = "",
txt = billtype:gsub("^%l", string.upper)..locale("menu" ,"payment_amount")..amount
}
Menu[#Menu+1] = {
icon = "fas fa-circle-check",
header = locale("menu" ,"yes"),
txt = "",
onSelect = function()
TriggerServerEvent(getScript()..":server:PayPopup", {
accept = true,
amount = amount,
biller = biller,
billtype = billtype,
outside = outside
})
end,
}
Menu[#Menu+1] = {
icon = "fas fa-circle-xmark",
header = locale("menu" ,"no"),
onSelect = function()
TriggerServerEvent(getScript()..":server:PayPopup", {
accept = false,
amount = amount,
biller = biller,
billtype = billtype,
outside = outside
})
end,
}
debugPrint(setimage)
openMenu(Menu, {
header = setimage,
onExit = function()
TriggerServerEvent(getScript()..":server:PayPopup", {
accept = false,
amount = amount,
biller = biller,
billtype = billtype,
outside = outside
})
end,
})
end)

View File

@@ -1,194 +0,0 @@
PlayerJob = {}
PlayerGang = {}
local onDuty = false
local BankPed = nil
local Targets = {}
local Till = {}
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 return end
QBCore.Functions.GetPlayerData(function(PlayerData)
PlayerJob = PlayerData.job
PlayerGang = PlayerData.gang
onDuty = PlayerJob.onduty
end)
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
Targets["JimBank"] =
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 = Loc[Config.Lan].target["cashin_boss"], job = jobroles, },
{ event = "jim-payments:Tickets:Menu", icon = "fas fa-receipt", label = Loc[Config.Lan].target["cashin_gang"], gang = gangroles, } },
distance = 2.0 })
--Crete Ped at the location
if Config.Peds then
if not Config.Gabz then CreateModelHide(vector3(Config.CashInLocation.x, Config.CashInLocation.y, Config.CashInLocation.z), 1.0, `v_corp_bk_chair3`, true) end
BankPed = makePed(Config.PedPool[math.random(1, #Config.PedPool)], Config.CashInLocation, false, false)
end
--Spawn Custom Cash Register Targets
for k, v in pairs(Config.CustomCashRegisters) do
for i = 1, #v do
local job = k
local gang = nil
if v[i].gang then job = nil gang = k end
Targets["CustomRegister: "..k..i] =
exports['qb-target']:AddBoxZone("CustomRegister: "..k..i, v[i].coords.xyz, 0.47, 0.34, { name="CustomRegister: "..k..i, heading = v[i].coords[4], debugPoly=Config.Debug, minZ=v[i].coords.z-0.1, maxZ=v[i].coords.z+0.4 },
{ options = { { event = "jim-payments:client:Charge", icon = "fas fa-credit-card", label = Loc[Config.Lan].target["charge"], job = job, gang = gang, img = "" }, },
distance = 2.0 })
if v[i].prop then
Till[#Till+1] = makeProp({prop = `prop_till_03`, coords = v[i].coords}, 1, false)
end
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 triggerNotify(nil, Loc[Config.Lan].error["not_onduty"], "error") return end
local newinputs = {} -- Begin qb-input creation here.
if Config.Usebzzz then
TriggerEvent('animations:client:EmoteCommandStart', {'terminal'})
end
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[1] then triggerNotify(nil, Loc[Config.Lan].error["no_one"], "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 = Loc[Config.Lan].menu["cus_id"] }
end
--Check if image was given when opening the regsiter
local img = data.img or ""
if not string.find(img, "<") then img = "<center><p><img src="..img.." width=100px></p>" end
--Continue adding payment options to qb-input
newinputs[#newinputs+1] = { type = 'radio', name = 'billtype', text = Loc[Config.Lan].menu["type"], options = { { value = "cash", text = Loc[Config.Lan].menu["cash"] }, { value = "bank", text = Loc[Config.Lan].menu["card"] } } }
newinputs[#newinputs+1] = { type = 'number', isRequired = true, name = 'price', text = Loc[Config.Lan].menu["amount_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..Loc[Config.Lan].menu["cash_reg"], submitText = Loc[Config.Lan].menu["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
if config.Usebzzz then
ExecuteCommand("e c")
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 triggerNotify(nil, Loc[Config.Lan].error["no_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[1] then triggerNotify(nil, Loc[Config.Lan].error["no_one"], "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 = Loc[Config.Lan].menu["person_id"] }
end
--Continue adding payment options to qb-input
newinputs[#newinputs+1] = { type = 'number', isRequired = true, name = 'price', text = Loc[Config.Lan].menu["amount_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..Loc[Config.Lan].menu["charge"], submitText = Loc[Config.Lan].menu["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 not amount then triggerNotify(nil, Loc[Config.Lan].error["no_ticket"], "error") amount = 0 return else amount = amount.amount 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..Loc[Config.Lan].menu["receipt"], txt = Loc[Config.Lan].menu["trade_confirm"] },
{ isMenuHeader = true, header = "", txt = Loc[Config.Lan].menu["ticket_amount"]..amount..Loc[Config.Lan].menu["total_pay"]..(Config.Jobs[name].PayPerTicket * amount) },
{ icon = "fas fa-circle-check", header = Loc[Config.Lan].menu["yes"], txt = "", params = { event = "jim-payments:Tickets:Sell:yes" } },
{ icon = "fas fa-circle-xmark", header = Loc[Config.Lan].menu["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..Loc[Config.Lan].menu["payment"], txt = Loc[Config.Lan].menu["accept_payment"] },
{ isMenuHeader = true, header = "", txt = billtype:gsub("^%l", string.upper)..Loc[Config.Lan].menu["payment_amount"]..amount },
{ icon = "fas fa-circle-check", header = Loc[Config.Lan].menu["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 = Loc[Config.Lan].menu["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..Loc[Config.Lan].menu["payment"], txt = Loc[Config.Lan].menu["accept_charge"] },
{ isMenuHeader = true, header = "", txt = Loc[Config.Lan].menu["bank_charge"]..amount },
{ icon = "fas fa-circle-check", header = Loc[Config.Lan].menu["yes"], txt = "", params = { isServer = true, event = "jim-payments:server:PolPopup", args = { accept = true, amount = amount, biller = biller } } },
{ icon = "fas fa-circle-xmark", header = Loc[Config.Lan].menu["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(r) if r ~= GetCurrentResourceName() then return end
for k in pairs(Targets) do exports['qb-target']:RemoveZone(k) end
for i = 1, #Till do DeleteEntity(Till[i]) end
unloadModel(GetEntityModel(BankPed)) DeletePed(BankPed)
end)

82
client/polcharge.lua Normal file
View File

@@ -0,0 +1,82 @@
RegisterNetEvent(getScript()..":client:PolCharge", function()
local Playerinfo = getPlayer()
--Check if player is allowed to use /cashregister command
local allowed = false
for k in pairs(Config.PolCharge.FineJobs) do if k == Playerinfo.job then allowed = true end end
if not allowed then triggerNotify(nil, locale("error", "no_job"), "error") return end
local newinputs = {} -- Begin qb-input creation here.
local nearbyList = {}
if Config.PolCharge.FineJobList then -- If nearby player list is wanted:
--Retrieve a list of nearby players from server
local onlineList = triggerCallback(getScript()..":MakePlayerList")
--Convert list of players nearby into one qb-input understands + add distance info
for _, v in pairs(Core.Functions.GetPlayersFromCoords(GetEntityCoords(PlayerPedId()), Config.General.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 debugMode then
nearbyList[#nearbyList+1] = { value = onlineList[i].value, label = onlineList[i].text..' ('..math.floor(dist+0.05)..'m)', 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[1] then triggerNotify(nil, locale("error" ,"no_one"), "error") return end
end
if Config.PolCharge.FineJobList then
newinputs[#newinputs+1] = { type = "select", text = locale("menu" ,"cus_id"), name = "citizen", label = locale("menu" ,"cus_id"), default = 1, options = nearbyList }
else
newinputs[#newinputs+1] = { type = 'text', isRequired = true, name = 'citizen', text = locale("menu" ,"cus_id") }
end
newinputs[#newinputs+1] = { type = 'number', isRequired = true, name = 'price', text = locale("menu" ,"amount_charge") }
local dialog = createInput(Jobs[Playerinfo.job].label, newinputs)
if dialog then
if dialog[1] then
dialog.citizen = dialog[1]
dialog.price = dialog[2]
end
TriggerServerEvent(getScript()..":server:PolCharge", dialog.citizen, dialog.price)
end
end)
RegisterNetEvent(getScript()..":client:PolPopup", function(amount, biller, billerjob)
local Menu = {}
Menu[#Menu+1] = { isMenuHeader = true, header = "", txt = locale("menu" ,"bank_charge")..amount }
Menu[#Menu+1] = {
icon = "fas fa-circle-check",
header = locale("menu" ,"yes"),
txt = "",
onSelect = function()
TriggerServerEvent(getScript()..":server:PolPopup", {
accept = true,
amount = amount,
biller = biller,
})
end,
}
Menu[#Menu+1] = {
icon = "fas fa-circle-xmark",
header = locale("menu" ,"no"),
onSelect = function()
TriggerServerEvent(getScript()..":server:PolPopup", {
accept = false,
amount = amount,
biller = biller,
})
end,
}
openMenu(Menu, {
header = "🧾 "..billerjob..locale("menu" ,"payment"),
headertxt = locale("menu" ,"accept_payment"),
onExit = function()
TriggerServerEvent(getScript()..":server:PolPopup", {
accept = false,
amount = amount,
biller = biller,
})
end,
})
end)

27
client/tickets.lua Normal file
View File

@@ -0,0 +1,27 @@
RegisterNetEvent(getScript()..":Tickets:Menu", function(data)
local PlayerInfo = getPlayer()
local hasItem, hasTable = hasItem("payticket", 1)
if not hasItem then
triggerNotify(nil, locale("error" ,"no_ticket"), "error")
return
end
local amount, sellable, name, label = hasTable["payticket"].count, false, "", ""
for k, v in pairs(Config.Receipts.Jobs) do
sellable = (data.gang and v.gang and k == PlayerInfo.gang) or (not data.gang and not v.gang and k == PlayerInfo.job)
if sellable then name, label = k, (data.gang and Gangs[PlayerInfo.gang].label) or (not data.gang and Jobs[PlayerInfo.job].label) break end
end
if sellable then local Menu = {}
Menu[#Menu+1] = {
isMenuHeader = true,
txt = locale("menu" ,"ticket_amount")..amount..locale("menu" ,"total_pay")..(Config.Receipts.Jobs[name].PayPerTicket * amount)
}
Menu[#Menu+1] = {
icon = "fas fa-circle-check", header = locale("menu" ,"yes"),
onSelect = function()
TriggerServerEvent(getScript()..":Tickets:Sell")
playAnim("pickup_object", "putdown_low", 2000, 1)
end,
}
openMenu(Menu, { header = "🧾 "..label..locale("menu" ,"receipt"), headertxt = locale("menu" ,"trade_confirm"), canClose = true, })
end
end)

View File

@@ -1,258 +1,166 @@
print("^2Jim^7-^2Payments ^7v^42^7.^48^7.^45 ^7- ^2Payments Script by ^1Jimathy^7")
-- 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 = {
Lan = "en",
Debug = false,
Notify = "qb",
---------------------------------
-- Default Job Payment Systems --
---------------------------------
Banking = "qb", -- qb, renewed, and fd currently default supported
ApGov = false, -- Toggle support for AP-Goverment Tax
List = true, -- "true" to use nearby player list feature in the cash registers, "false" for manual id entry
PaymentRadius = 15, -- This is how far the playerlist will check for nearby players (based on the person charging)
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`,
},
usebzzz = false, -- enable if you're using the prop from bzzz
Enablecommand = true, -- Enables the cashregister command
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
TicketSystem = true, -- Enable this if you want to use the ticket system false
TicketSystemAll = true, -- Enable this to give tickets to all workers clocked in
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
-- 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, },
['bakery'] = { 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, }, -- Example of a gang being supported
},
------------------------------
-- Custom Job Cash Register --
------------------------------
-- This adds the ability to add multiple locations for each job
-- Basically adding ready made locations, all you need to a vector4 and to confrim if you need a new prop in that location
CustomCashRegisters = {
},
-- The /polcharge command requires specific jobs to be set
-- No tickets for these, it's just commission (0.25 = 25%)
FineJobs = {
['police'] = { Commission = 0.25, },
['ambulance'] = { Commission = 0.25, },
},
FineJobConfirmation = false, --"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
---------------------
-- Banking Systems --
---------------------
useATM = false, -- Enable this to use the scripts ATM's and controls
useBanks = false, -- Enable this to use my banking stuff
BankBlips = false, -- 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
Gabz = false, -- "true" to enable Gabz Bank locations
-- this corrects the ATM/Bank Cashier + Ticket Cash in location
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 Gabz banks enabled, load these locations instead
if Config.Gabz then
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
Loc = {}
-- 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 = {
Lan = "en",
System = {
Debug = false,
EventDebug = false,
Menu = "qb", -- "qb", "ox", "gta"
Notify = "gta", -- "qb", "ox", "gta", "esx"
ProgressBar = "gta", -- "qb", "ox", "gta", "esx"
DontUseTarget = false, -- uses drawtext targets instead of alt targets
},
Crafting = {
craftCam = true,
MultiCraft = true,
MultiCraftAmounts = { [1], [5], [10] },
showItemBox = true,
},
General = {
ApGov = false, -- Toggle support for AP-Goverment Tax
List = true, -- "true" to use nearby player list feature in the cash registers, "false" for manual id entry
PaymentRadius = 15, -- This is how far the playerlist will check for nearby players (based on the person charging)
Usebzzz = false, -- enable if you're using the prop from bzzz
Enablecommand = true, -- Enables the /cashregister command
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 a confirmation window
-- This is helpful for phones that don't support invoices well
Peds = true, -- "true" to enable peds spawning in banks
PedPool = { -- If Peds is true, use this pool of ped models to pick from
"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",
},
PhoneType = "qb", -- Change this setting to make invoices work with your phone script [still testing this currently]
-- "qb" for qb-phone
-- "gks" for GKSPhone
Gabz = false, -- "true" to enable Gabz Bank locations
-- this corrects the ATM/Bank Cashier + Ticket Cash in locations
menuLogo = "https://static.wikia.nocookie.net/gtawiki/images/b/bd/Fleeca-GTAV-Logo.png",
},
ATMs = {
enable = true, -- Enable this if wanting to use jim-payments atm systems
showBlips = true,
ATMModels = { `prop_atm_01`, `prop_atm_02`, `prop_atm_03`, `prop_fleeca_atm`, `gabz_sm_pb_atmframe` },
},
Banks = {
enable = true, -- Enable this if wanting to use jim-payments banking systems
showBlips = true,
},
CustomCashRegisters = {
-- ["jobname"] = { -- Player job role restriction
-- { coords = vector4(0, 0, 0, 0), }, -- vector4 to place the till and the way it faces
-- { coords = vector4(0, 0, 0, 0), prop = true, }, -- "prop = true" spawns a prop at the coords
-- },
},
Receipts = {
TicketSystem = true, -- Enable this if you want to use the ticket system false
TicketSystemAll = true, -- Enable this to give tickets to all workers clocked in
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
CashInLocations = {
vec4(252.23, 223.11, 106.29, 159.2), -- Default Third Window along in Pacific Bank
},
CashInAnywhere = true, -- enable this to add cash ticket option to any banking location
-- MinAmountforTicket should be your cheapest item
-- PayPerTicket should never be higher than MinAmountforTicket
-- Commission is a percentage eg "0.10" becomes 10%
Jobs = {
-- Jim Businesses | https://jimathy666.tebex.io/
['bakery'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['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, },
['upnatom'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['hornys'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
-- JixelTay Businesses | https://jixeltay.tebex.io/
['cigarbar'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['cluckinbell'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['smokeshop'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['pearls'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['kois'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['whitewidow'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
['bestbuds'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, },
-- Jim Mechanic | https://jimathy666.tebex.io/
['mechanic'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
['tuners'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
['ottos'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
['lscustoms'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
['bennys'] = { MinAmountforTicket = 1000, PayPerTicket = 500, Commission = 0.10, },
-- Gangs | Example of a gang being supported
['lostmc'] = { MinAmountforTicket = 50, PayPerTicket = 50, Commission = 0.10, gang = true, },
},
},
PolCharge = {
-- The /polcharge command requires specific jobs to be set
-- No tickets for these, it's just commission (0.25 = 25%)
FineJobs = {
['police'] = { Commission = 0.25, },
['ambulance'] = { Commission = 0.25, },
},
FineJobConfirmation = false, --"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
},
}
PlayerGang, PlayerJob, onDuty = {}, {}, nil
-- Test function for locales
function locale(section, string)
if not Config.Lan or Config.Lan == "" then return print("Error, no langauge set") end
local localTable = Loc[Config.Lan]
if not localTable then return "Locale Table Not Found" end
if not localTable[section] then return "["..section.."] Invalid" end
if not localTable[section][string] then return "["..string.."] Invalid" end
return localTable[section][string]
end

View File

@@ -1,11 +1,39 @@
name "Jim-Payments"
author "Jimathy"
version "v2.8.6"
version "3.0.01"
description "Payment Script By Jimathy"
fx_version "cerulean"
game "gta5"
lua54 'yes'
shared_scripts { 'config.lua', 'shared/*.lua', 'locales/*.lua' }
client_scripts { 'client/*.lua', }
server_scripts { '@oxmysql/lib/MySQL.lua', 'server/*.lua' }
server_script '@oxmysql/lib/MySQL.lua'
shared_scripts {
'locales/*.lua',
'config.lua',
-- Required core scripts
'@ox_lib/init.lua',
'@ox_core/lib/init.lua',
'@es_extended/imports.lua',
'@qbx_core/modules/playerdata.lua',
--Jim Bridge
'@jim_bridge/starter.lua',
'shared/*.lua',
}
client_scripts {
'@PolyZone/client.lua',
'@PolyZone/BoxZone.lua',
'@PolyZone/EntityZone.lua',
'@PolyZone/CircleZone.lua',
'@PolyZone/ComboZone.lua',
'client/*.lua',
}
server_script 'server/*.lua'
dependency 'jim_bridge'

136
locales/da.lua Normal file
View File

@@ -0,0 +1,136 @@
-- Provided by iplayer1337fivem on Github
Loc = Loc or {}
Loc["da"] = {
error = {
["cancel"] = "Afbestilt",
["no_one"] = "Ingen i nærheden at opkræve",
["not_onduty"] = "Ikke logget ind!",
["no_job"] = "Du har ikke det påkrævede job",
["no_ticket"] = "Du har ingen billetter at handle med",
["bank_low"] = "Bankbalance for lav",
["no_cash"] = "Ikke nok kontanter",
["saving_low"] = "Savings balance for lav",
["soc_low"] = "Society balance for lav",
["nomoney_bank"] = "Ikke nok penge på din bankkonto",
["error_start"] = "Fejl: Konto '",
["error_end"] = "' ikke fundet",
["not_enough"] = "Du har ikke nok kontanter til at give",
["zero"] = "Du kan ikke give DKK0",
["charge_zero"] = "Du kan ikke opkræve 0 DKK",
["no_ticket_to"] = "Ingen billetter at handle med",
["customer_nocash"] = "Kunden har ikke nok kontanter til at betale",
["you_nocash"] = "Du har ikke nok kontanter til at betale",
["decline_pay"] = " afslog DKK",
["declined_payment"] = "Du afslog betalingen",
},
success = {
["draw"] = "Hævet DKK",
["from_bank"] = " fra banken",
["deposited"] = "Indsat DKK",
["into_bank"] = " på bankkontoen",
["draw_save"] = " Trukket fra opsparingskontoen til bankkontoen",
["depos_save"] = " Indsat fra bankkontoen til opsparingen",
["fromthe"] = " fra ",
["into"] = " til ",
["account"] = " konto",
["sent"] = "Sendt DKK",
["recieved"] = "Modtaget DKK",
["to"] = " til ",
["from"] = " fra ",
["you_gave"] = "Du gav ",
["you_got"] = "Du fik DKK",
["invoice_start"] = " Betalte deres DKK",
["invoice_end"] = " faktura",
["rec_rec"] = "Kvittering modtaget",
["commission"] = " i provision",
["trade_ticket_start"] = "Billetter handlet: ",
["trade_ticket_end"] = " I alt: DKK",
["inv_succ"] = "Faktura sendt med succes",
["inv_recieved"] = "Ny faktura modtaget",
["declined"] = "Du afslog betalingen",
["accepted_pay"] = " accepterede DKK",
["payment"] = " betaling",
["charged"] = " blev opkrævet for DKK",
["you_charged"] = "Du blev opkrævet for DKK",
["charge_end"] = " opkrævning",
},
blip = {
["blip_atm"] = "Hæveautomat",
["blip_bank"] = "Bank",
},
command = {
["pay_user"] = "Betal en bruger i nærheden",
["cash_reg"] = "Brug mobil kontantregister",
["charge"] = "Opkræv en anden person",
},
target = {
["atm"] = "Brug hæveautomat",
["bank"] = "Brug bank",
["transfer"] = "Overfør penge",
["saving"] = "Adgang til opsparing",
["soc_saving"] = "Adgang til society-konto",
["soc_trans"] = "Society pengetransfer",
["gang_acct"] = "Gang Society-konto",
["gang_trans"] = "Gang pengetransfer",
["charge"] = "Opkræv kunde",
["cashin_boss"] = "Indbetal jobkvitteringer",
["cashin_gang"] = "Indbetal gangkvitteringer",
},
menu = {
["close"] = "Luk",
["withdraw"] = "Hæv",
["deposit"] = "Indsæt",
["transfer"] = "Overfør",
["transfer_money"] = "Overfør penge",
["header_atm"] = "💵 Hæveautomat Bank 💵",
["header_trans_amount"] = "💵 Beløb at overføre",
["header_bank"] = "🏦 Bankvæsen 🏦",
["header_trans"] = "🔀 Overførselsservice 🔀",
["header_account_no"] = "🏦 Kontonr.",
["header_saving"] = "💰 Opsparing 💰",
["acc_atm"] = "Adgang til hæveautomat",
["acc_bank"] = "Adgang til bank",
["acc_trans"] = "Adgang til overførsler",
["acc_saving"] = "Adgang til opsparing",
["acc_boss"] = "Adgang til society-konto",
["acc_boss_trans"] = "Adgang til society-overførsler",
["acc_gang"] = "Adgang til gang-society-konto",
["acc_gang_trans"] = "Adgang til gangoverførsler",
["header_soc"] = "- Society-konto -",
["header_soc_bank"] = "🏢 Society Bank 🏢",
["amount_pay"] = "💵 Beløb at betale",
["give_cash"] = "Giv nogen kontanter",
["give"] = "Giv",
["welcome"] = "Velkommen tilbage, ",
["citizenid"] = "- Borger-ID -",
["header_acc"] = "- Konto -",
["header_info"] = "- Kontoinformation -Opsparings-ID: ",
["header_balance_bank"] = "- Balancer -🏦Bank - DKK",
["header_option"] = "- Valg -",
["cash_balance"] = "💵Kontanter - DKK",
["bank_balance"] = "🏦Bank - DKK",
["saving_balance"] = "- Balancer -💰Opsparing - DKK",
["cus_id"] = "# Kundens ID #",
["type"] = "Betalingstype",
["amount_charge"] = "💵 Beløb at opkræve",
["cash_reg"] = "Kontantregister",
["person_id"] = "# Personens ID #",
["charge"] = "Opkræv",
["send"] = "Send",
["receipt"] = "Kvitteringer 🧾",
["payment"] = " Betaling 🧾",
["trade_confirm"] = "Vil du bytte dine kvitteringer til betaling?",
["accept_payment"] = "Vil du acceptere betalingen?",
["accept_charge"] = "Vil du acceptere opkrævningen?",
["ticket_amount"] = "Antal billetter: ",
["total_pay"] = "Total betaling: DKK",
["confirm"] = "Ja",
["yes"] = "Ja",
["no"] = "Nej",
["cash"] = "Kontanter",
["card"] = "Kort",
["payment_amount"] = " Betaling: DKK",
["bank_charge"] = "Bankgebyr: DKK",
},
}

View File

@@ -1,133 +1,135 @@
Loc["de"] = {
error = {
["cancel"] = "Abgebrochen",
["no_one"] = "Keiner in der Nähe zum Aufladen",
["not_onduty"] = "Nicht eingestempelt!",
["no_job"] = "Sie haben nicht den gewünschten Beruf",
["no_ticket"] = "Sie haben keine Tickets zum Tauschen",
["bank_low"] = "Kontostand zu niedrig",
["no_cash"] = "Nicht genug Bargeld",
["saving_low"] = "Sparguthaben zu niedrig",
["soc_low"] = "Firmenkontoguthaben zu niedrig",
["nomoney_bank"] = "Nicht genug Geld auf Ihrer Bank",
["error_start"] = "Fehler: Konto '",
["error_end"] = "' nicht gefunden",
["not_enough"] = "Sie haben nicht genug Geld zum übergeben",
["zero"] = "Sie können nicht 0$ geben",
["charge_zero"] = "Sie können keine $0 berechnen",
["no_ticket_to"] = "Keine Tickets zum Tauschen",
["customer_nocash"] = "Der Kunde hat nicht genug Bargeld, um zu bezahlen",
["you_nocash"] = "Sie haben nicht genug Geld, um zu bezahlen",
["decline_pay"] = " lehnte die $ ab",
["declined_payment"] = "Sie haben die Zahlung abgelehnt",
},
success = {
["draw"] = "Abgehoben $",
["from_bank"] = " von der Bank",
["deposited"] = "Eingezahlt $",
["into_bank"] = " in die Bank",
["draw_save"] = " Abhebung von Ersparnissen auf ein Bankkonto",
["depos_save"] = " Vom Bankkonto auf das Sparkonto eingezahlt",
["fromthe"] = " von der ",
["into"] = " in die ",
["account"] = " Konto",
["sent"] = "Gesendet $",
["recieved"] = "Empfangen $",
["to"] = " zu ",
["from"] = " von ",
["you_gave"] = "Sie gaben ",
["you_got"] = "Sie haben $",
["invoice_start"] = " Bezahlten ihre $",
["invoice_end"] = " Rechnung",
["rec_rec"] = "Erhaltene Quittung",
["commission"] = " in der Kommission",
["trade_ticket_start"] = "Gehandelte Tickets: ",
["trade_ticket_end"] = " Total: $",
["inv_succ"] = "Rechnung erfolgreich gesendet",
["inv_recieved"] = "Neue Rechnung erhalten",
["declined"] = "Sie haben die Zahlung abgelehnt",
["accepted_pay"] = " akzeptierte die $",
["payment"] = " Zahlung",
["charged"] = " wurde berechnet für $",
["you_charged"] = "Sie wurden berechnet für $",
["charge_end"] = " Gebühr",
},
blip = {
["blip_atm"] = "ATM",
["blip_bank"] = "Bank",
},
command = {
["pay_user"] = "Einen Bürger in der Nähe bezahlen",
["cash_reg"] = "Mobile Registrierkasse verwenden",
["charge"] = "Eine andere Person belasten",
},
target = {
["atm"] = "ATM benutzen",
["bank"] = "Bank benutzen",
["transfer"] = "Geld überweisen",
["saving"] = "Zugang Ersparnisse",
["soc_saving"] = "Zugang Firmenkonto",
["soc_trans"] = "Firmenkonto Geldüberweisung",
["gang_acct"] = "Gang Konto",
["gang_trans"] = "Gang Geldtransfer",
["charge"] = "Gebühr für den Kunden",
["cashin_boss"] = "Bargeld in Job-Einnahmen",
["cashin_gang"] = "Bargeld in Bandeneinnahmen",
},
menu = {
["close"] = "Schließen",
["withdraw"] = "Abheben",
["deposit"] = "Einzahlen",
["transfer"] = "Überweißen",
["transfer_money"] = "Geld überweisen",
["header_atm"] = "💵 ATM Banking 💵",
["header_trans_amount"] = "💵 Überweisungsbetrag",
["header_bank"] = "🏦 Banking 🏦",
["header_trans"] = "🔀 Transferdienste 🔀",
["header_account_no"] = "🏦 Kontonummer.",
["header_saving"] = "💰 Ersparnisse 💰",
["acc_atm"] = "Zugang zu ATM",
["acc_bank"] = "Zugang Bank",
["acc_trans"] = "Zugriff auf Überweisungen",
["acc_saving"] = "Zugang zu Ersparnissen",
["acc_boss"] = "Zugriff auf das Firmenkonto",
["acc_boss_trans"] = "Zugang zu Firmenkontotransfers",
["acc_gang"] = "Zugriff auf das Gangkonto",
["acc_gang_trans"] = "Zugang zu Gangkontotransfers",
["header_soc"] = "<br><br>- Firmenkonto -<br>",
["header_balance"] = "<br><br>- Kontostand -<br>🏢",
["header_soc_bank"] = "🏢 Firmen Banking 🏢",
["amount_pay"] = "💵 Zu zahlender Betrag'",
["give_cash"] = "Jemandem Bargeld geben",
["give"] = "Geben",
["welcome"] = "Willkommen zurück, ",
["citizenid"] = "<br><br>- Ausweisnummer -<br>",
["header_acc"] = "<br><br>- Konto -<br>",
["header_info"] = "<br><br>- Konto Info -<br>Ersparnis-ID: ",
["header_balance_bank"] = "<br><br>- Kontostand -<br>🏦Bank - $",
["header_option"] = "<br><br>- Optionen -",
["cash_balance"] = "<br>💵Bargeld - $",
["bank_balance"] = "<br>🏦Bank - $",
["saving_balance"] = "<br><br>- Kontostand -<br>💰Ersparnisses - $",
["cus_id"] = "# Kunden ID #",
["type"] = "Zahlungsart",
["amount_charge"] = "💵 Zu berechnender Betrag",
["cash_reg"] = " Registrierkasse",
["person_id"] = "# Bürger ID #",
["charge"] = " Laden Sie",
["send"] = "Send",
["receipt"] = " Quittungen 🧾",
["payment"] = " Zahlung 🧾",
["trade_confirm"] = "Möchten Sie Ihre Quittungen gegen Bezahlung eintauschen??",
["accept_payment"] = "Möchten Sie die Zahlung akzeptieren?",
["accept_charge"] = "Möchten Sie die Gebühr akzeptieren?",
["ticket_amount"] = "Anzahl der Tickets: ",
["total_pay"] = "<br>Gesamte Zahlung: $",
["yes"] = "Ja",
["no"] = "Nein",
["cash"] = "Bargeld",
["card"] = "Karte",
["payment_amount"] = " Zahlung: $",
["bank_charge"] = "Bankgebühr: $",
},
}
Loc = Loc or {}
Loc["de"] = {
error = {
["cancel"] = "Abgebrochen",
["no_one"] = "Keiner in der Nähe zum Aufladen",
["not_onduty"] = "Nicht eingestempelt!",
["no_job"] = "Sie haben nicht den gewünschten Beruf",
["no_ticket"] = "Sie haben keine Tickets zum Tauschen",
["bank_low"] = "Kontostand zu niedrig",
["no_cash"] = "Nicht genug Bargeld",
["saving_low"] = "Sparguthaben zu niedrig",
["soc_low"] = "Firmenkontoguthaben zu niedrig",
["nomoney_bank"] = "Nicht genug Geld auf Ihrer Bank",
["error_start"] = "Fehler: Konto '",
["error_end"] = "' nicht gefunden",
["not_enough"] = "Sie haben nicht genug Geld zum übergeben",
["zero"] = "Sie können nicht 0$ geben",
["charge_zero"] = "Sie können keine $0 berechnen",
["no_ticket_to"] = "Keine Tickets zum Tauschen",
["customer_nocash"] = "Der Kunde hat nicht genug Bargeld, um zu bezahlen",
["you_nocash"] = "Sie haben nicht genug Geld, um zu bezahlen",
["decline_pay"] = " lehnte die $ ab",
["declined_payment"] = "Sie haben die Zahlung abgelehnt",
},
success = {
["draw"] = "Abgehoben $",
["from_bank"] = " von der Bank",
["deposited"] = "Eingezahlt $",
["into_bank"] = " in die Bank",
["draw_save"] = " Abhebung von Ersparnissen auf ein Bankkonto",
["depos_save"] = " Vom Bankkonto auf das Sparkonto eingezahlt",
["fromthe"] = " von der ",
["into"] = " in die ",
["account"] = " Konto",
["sent"] = "Gesendet $",
["recieved"] = "Empfangen $",
["to"] = " zu ",
["from"] = " von ",
["you_gave"] = "Sie gaben ",
["you_got"] = "Sie haben $",
["invoice_start"] = " Bezahlten ihre $",
["invoice_end"] = " Rechnung",
["rec_rec"] = "Erhaltene Quittung",
["commission"] = " in der Kommission",
["trade_ticket_start"] = "Gehandelte Tickets: ",
["trade_ticket_end"] = " Total: $",
["inv_succ"] = "Rechnung erfolgreich gesendet",
["inv_recieved"] = "Neue Rechnung erhalten",
["declined"] = "Sie haben die Zahlung abgelehnt",
["accepted_pay"] = " akzeptierte die $",
["payment"] = " Zahlung",
["charged"] = " wurde berechnet für $",
["you_charged"] = "Sie wurden berechnet für $",
["charge_end"] = " Gebühr",
},
blip = {
["blip_atm"] = "ATM",
["blip_bank"] = "Bank",
},
command = {
["pay_user"] = "Einen Bürger in der Nähe bezahlen",
["cash_reg"] = "Mobile Registrierkasse verwenden",
["charge"] = "Eine andere Person belasten",
},
target = {
["atm"] = "ATM benutzen",
["bank"] = "Bank benutzen",
["transfer"] = "Geld überweisen",
["saving"] = "Zugang Ersparnisse",
["soc_saving"] = "Zugang Firmenkonto",
["soc_trans"] = "Firmenkonto Geldüberweisung",
["gang_acct"] = "Gang Konto",
["gang_trans"] = "Gang Geldtransfer",
["charge"] = "Gebühr für den Kunden",
["cashin_boss"] = "Bargeld in Job-Einnahmen",
["cashin_gang"] = "Bargeld in Bandeneinnahmen",
},
menu = {
["close"] = "Schließen",
["withdraw"] = "Abheben",
["deposit"] = "Einzahlen",
["transfer"] = "Überweißen",
["transfer_money"] = "Geld überweisen",
["header_atm"] = "💵 ATM Banking 💵",
["header_trans_amount"] = "💵 Überweisungsbetrag",
["header_bank"] = "🏦 Banking 🏦",
["header_trans"] = "🔀 Transferdienste 🔀",
["header_account_no"] = "🏦 Kontonummer.",
["header_saving"] = "💰 Ersparnisse 💰",
["acc_atm"] = "Zugang zu ATM",
["acc_bank"] = "Zugang Bank",
["acc_trans"] = "Zugriff auf Überweisungen",
["acc_saving"] = "Zugang zu Ersparnissen",
["acc_boss"] = "Zugriff auf das Firmenkonto",
["acc_boss_trans"] = "Zugang zu Firmenkontotransfers",
["acc_gang"] = "Zugriff auf das Gangkonto",
["acc_gang_trans"] = "Zugang zu Gangkontotransfers",
["header_soc"] = "- Firmenkonto -",
["header_soc_bank"] = "🏢 Firmen Banking 🏢",
["amount_pay"] = "💵 Zu zahlender Betrag'",
["give_cash"] = "Jemandem Bargeld geben",
["give"] = "Geben",
["welcome"] = "Willkommen zurück, ",
["citizenid"] = "- Ausweisnummer -",
["header_acc"] = "- Konto -",
["header_info"] = "- Konto Info -Ersparnis-ID: ",
["header_balance_bank"] = "- Kontostand -🏦Bank - $",
["header_option"] = "- Optionen -",
["cash_balance"] = "💵Bargeld - $",
["bank_balance"] = "🏦Bank - $",
["saving_balance"] = "- Kontostand -💰Ersparnisses - $",
["cus_id"] = "# Kunden ID #",
["type"] = "Zahlungsart",
["amount_charge"] = "💵 Zu berechnender Betrag",
["cash_reg"] = " Registrierkasse",
["person_id"] = "# Bürger ID #",
["charge"] = " Laden Sie",
["send"] = "Send",
["receipt"] = " Quittungen 🧾",
["payment"] = " Zahlung 🧾",
["trade_confirm"] = "Möchten Sie Ihre Quittungen gegen Bezahlung eintauschen??",
["accept_payment"] = "Möchten Sie die Zahlung akzeptieren?",
["accept_charge"] = "Möchten Sie die Gebühr akzeptieren?",
["ticket_amount"] = "Anzahl der Tickets: ",
["total_pay"] = "Gesamte Zahlung: $",
["confirm"] = "Ja",
["yes"] = "Ja",
["no"] = "Nein",
["cash"] = "Bargeld",
["card"] = "Karte",
["payment_amount"] = " Zahlung: $",
["bank_charge"] = "Bankgebühr: $",
},
}

View File

@@ -1,133 +1,135 @@
Loc["en"] = {
error = {
["cancel"] = "Cancelled",
["no_one"] = "No one near by to charge",
["not_onduty"] = "Not Clocked in!",
["no_job"] = "You don't have the required job",
["no_ticket"] = "You don't have any tickets to trade",
["bank_low"] = "Bank Balance too low",
["no_cash"] = "Not enough cash",
["saving_low"] = "Savings Balance too low",
["soc_low"] = "Society balance too low",
["nomoney_bank"] = "Not enough money in your bank",
["error_start"] = "Error: Account '",
["error_end"] = "' not found",
["not_enough"] = "You don't have enough cash to give",
["zero"] = "You can't give $0",
["charge_zero"] = "You can't charge $0",
["no_ticket_to"] = "No tickets to trade",
["customer_nocash"] = "Customer doesn't have enough cash to pay",
["you_nocash"] = "You don't have enough cash to pay",
["decline_pay"] = " declined the $",
["declined_payment"] = "You declined the payment",
},
success = {
["draw"] = "Withdrew $",
["from_bank"] = " from the bank",
["deposited"] = "Deposited $",
["into_bank"] = " into the Bank",
["draw_save"] = " Withdrawn from savings into bank account",
["depos_save"] = " Deposited from bank account into savings",
["fromthe"] = " from the ",
["into"] = " into the ",
["account"] = " account",
["sent"] = "Sent $",
["recieved"] = "Recieved $",
["to"] = " to ",
["from"] = " from ",
["you_gave"] = "You gave ",
["you_got"] = "You got $",
["invoice_start"] = " Paid their $",
["invoice_end"] = " invoice",
["rec_rec"] = "Receipt received",
["commission"] = " in Commission",
["trade_ticket_start"] = "Tickets traded: ",
["trade_ticket_end"] = " Total: $",
["inv_succ"] = "Invoice Successfully Sent",
["inv_recieved"] = "New Invoice Received",
["declined"] = "You declined the payment",
["accepted_pay"] = " accepted the $",
["payment"] = " payment",
["charged"] = " was charged for $",
["you_charged"] = "You were charged for $",
["charge_end"] = " charge",
},
blip = {
["blip_atm"] = "ATM",
["blip_bank"] = "Bank",
},
command = {
["pay_user"] = "Pay a user nearby",
["cash_reg"] = "Use mobile cash register",
["charge"] = "Charge another person",
},
target = {
["atm"] = "Use ATM",
["bank"] = "Use Bank",
["transfer"] = "Transfer Money",
["saving"] = "Access Savings",
["soc_saving"] = "Access Society Account",
["soc_trans"] = "Society Money Transfer",
["gang_acct"] = "Gang Society Account",
["gang_trans"] = "Gang Money Transfer",
["charge"] = "Charge Customer",
["cashin_boss"] = "Cash in Job Receipts",
["cashin_gang"] = "Cash in Gang Receipts",
},
menu = {
["close"] = "Close",
["withdraw"] = "Withdrawl",
["deposit"] = "Deposit",
["transfer"] = "Transfer",
["transfer_money"] = "Transfer Money",
["header_atm"] = "💵 ATM Banking 💵",
["header_trans_amount"] = "💵 Amount to transfer",
["header_bank"] = "🏦 Banking 🏦",
["header_trans"] = "🔀 Transfer Services 🔀",
["header_account_no"] = "🏦 Account no.",
["header_saving"] = "💰 Savings 💰",
["acc_atm"] = "Accessing ATM",
["acc_bank"] = "Accessing Bank",
["acc_trans"] = "Accessing Transfers",
["acc_saving"] = "Accessing Savings",
["acc_boss"] = "Accessing Society Account",
["acc_boss_trans"] = "Accessing Society Transfers",
["acc_gang"] = "Accessing Gang Society Account",
["acc_gang_trans"] = "Accessing Gang Transfers",
["header_soc"] = "<br><br>- Society Account -<br>",
["header_balance"] = "<br><br>- Balances -<br>🏢",
["header_soc_bank"] = "🏢 Society Banking 🏢",
["amount_pay"] = "💵 Amount to Pay'",
["give_cash"] = "Give someone cash",
["give"] = "Give",
["welcome"] = "Welcome back, ",
["citizenid"] = "<br><br>- Citizen ID -<br>",
["header_acc"] = "<br><br>- Account -<br>",
["header_info"] = "<br><br>- Account Info -<br>Savings ID: ",
["header_balance_bank"] = "<br><br>- Balances -<br>🏦Bank - $",
["header_option"] = "<br><br>- Options -",
["cash_balance"] = "<br>💵Cash - $",
["bank_balance"] = "<br>🏦Bank - $",
["saving_balance"] = "<br><br>- Balances -<br>💰Savings - $",
["cus_id"] = "# Customer ID #",
["type"] = "Payment Type",
["amount_charge"] = "💵 Amount to Charge",
["cash_reg"] = " Cash Register",
["person_id"] = "# Person's ID #",
["charge"] = " Charge",
["send"] = "Send",
["receipt"] = " Receipts 🧾",
["payment"] = " Payment 🧾",
["trade_confirm"] = "Do you want trade your receipts for payment?",
["accept_payment"] = "Do you want accept the payment?",
["accept_charge"] = "Do you want accept the charge?",
["ticket_amount"] = "Amount of Tickets: ",
["total_pay"] = "<br>Total Payment: $",
["yes"] = "Yes",
["no"] = "No",
["cash"] = "Cash",
["card"] = "Card",
["payment_amount"] = " Payment: $",
["bank_charge"] = "Bank Charge: $",
},
}
Loc = Loc or {}
Loc["en"] = {
error = {
["cancel"] = "Cancelled",
["no_one"] = "No one near by to charge",
["not_onduty"] = "Not Clocked in!",
["no_job"] = "You don't have the required job",
["no_ticket"] = "You don't have any tickets to trade",
["bank_low"] = "Bank Balance too low",
["no_cash"] = "Not enough cash",
["saving_low"] = "Savings Balance too low",
["soc_low"] = "Society balance too low",
["nomoney_bank"] = "Not enough money in your bank",
["error_start"] = "Error: Account '",
["error_end"] = "' not found",
["not_enough"] = "You don't have enough cash to give",
["zero"] = "You can't give $0",
["charge_zero"] = "You can't charge $0",
["no_ticket_to"] = "No tickets to trade",
["customer_nocash"] = "Customer doesn't have enough cash to pay",
["you_nocash"] = "You don't have enough cash to pay",
["decline_pay"] = " declined the $",
["declined_payment"] = "You declined the payment",
},
success = {
["draw"] = "Withdrew $",
["from_bank"] = " from the bank",
["deposited"] = "Deposited $",
["into_bank"] = " into the Bank",
["draw_save"] = " Withdrawn from savings into bank account",
["depos_save"] = " Deposited from bank account into savings",
["fromthe"] = " from the ",
["into"] = " into the ",
["account"] = " account",
["sent"] = "Sent $",
["recieved"] = "Recieved $",
["to"] = " to ",
["from"] = " from ",
["you_gave"] = "You gave ",
["you_got"] = "You got $",
["invoice_start"] = " Paid their $",
["invoice_end"] = " invoice",
["rec_rec"] = "Receipt received",
["commission"] = " in Commission",
["trade_ticket_start"] = "Tickets traded: ",
["trade_ticket_end"] = " Total: $",
["inv_succ"] = "Invoice Successfully Sent",
["inv_recieved"] = "New Invoice Received",
["declined"] = "You declined the payment",
["accepted_pay"] = " accepted the $",
["payment"] = " payment",
["charged"] = " was charged for $",
["you_charged"] = "You were charged for $",
["charge_end"] = " charge",
},
blip = {
["blip_atm"] = "ATM",
["blip_bank"] = "Bank",
},
command = {
["pay_user"] = "Pay a user nearby",
["cash_reg"] = "Use mobile cash register",
["charge"] = "Charge another person",
},
target = {
["atm"] = "Use ATM",
["bank"] = "Use Bank",
["transfer"] = "Transfer Money",
["saving"] = "Access Savings",
["soc_saving"] = "Access Society Account",
["soc_trans"] = "Society Money Transfer",
["gang_acct"] = "Gang Society Account",
["gang_trans"] = "Gang Money Transfer",
["charge"] = "Charge Customer",
["cashin_boss"] = "Cash in Job Receipts",
["cashin_gang"] = "Cash in Gang Receipts",
},
menu = {
["close"] = "Close",
["withdraw"] = "Withdrawal",
["deposit"] = "Deposit",
["transfer"] = "Transfer",
["transfer_money"] = "Transfer Money",
["header_atm"] = "💵 ATM Banking 💵",
["header_trans_amount"] = "💵 Amount to transfer",
["header_bank"] = "🏦 Banking 🏦",
["header_trans"] = "🔀 Transfer Services 🔀",
["header_account_no"] = "🏦 Account no.",
["header_saving"] = "💰 Savings 💰",
["acc_atm"] = "Accessing ATM",
["acc_bank"] = "Accessing Bank",
["acc_trans"] = "Accessing Transfers",
["acc_saving"] = "Accessing Savings",
["acc_boss"] = "Accessing Society Account",
["acc_boss_trans"] = "Accessing Society Transfers",
["acc_gang"] = "Accessing Gang Society Account",
["acc_gang_trans"] = "Accessing Gang Transfers",
["header_soc"] = "Society Account -",
["header_soc_bank"] = "Society Banking",
["amount_pay"] = "💵 Amount to Pay'",
["give_cash"] = "Give someone cash",
["give"] = "Give",
["welcome"] = "Welcome back, ",
["citizenid"] = "Citizen ID -",
["header_acc"] = "Account -",
["header_info"] = "Account Info - Savings ID: ",
["header_balance"] = "Balances -",
["header_option"] = "Options -",
["cash_balance"] = "💵Cash - $",
["bank_balance"] = "🏦Bank - $",
["saving_balance"] = "💰Savings - $",
["cus_id"] = "# Customer ID #",
["type"] = "Payment Type",
["amount_charge"] = "💵 Amount to Charge",
["cash_reg"] = " Cash Register",
["person_id"] = "# Person's ID #",
["charge"] = " Charge",
["send"] = "Send",
["receipt"] = " Receipts 🧾",
["payment"] = " Payment 🧾",
["trade_confirm"] = "Do you want trade your receipts for payment?",
["accept_payment"] = "Do you want accept the payment?",
["accept_charge"] = "Do you want accept the charge?",
["ticket_amount"] = "Amount of Tickets: ",
["total_pay"] = "<br>Total Payment: $",
["confirm"] = "Confirm",
["yes"] = "Yes",
["no"] = "No",
["cash"] = "Cash",
["card"] = "Card",
["payment_amount"] = " Payment: $",
["bank_charge"] = "Bank Charge: $",
},
}

View File

@@ -1,94 +1,85 @@
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
end
return formatted
end
registerCommand("cashgive", {
locale("command" , "pay_user"), {}, false,
function(source)
TriggerClientEvent(getScript()..":client:ATM:give", source)
end
})
RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, baccount, account, society, gsociety)
RegisterServerEvent(getScript()..":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 Player = getPlayer(src)
local amount = tonumber(amount)
local bankScript, newAmount = "", 0
--Simple transfers from bank to wallet --
if account == "bank" or account == "atm" then
if billtype == "withdraw" then
if bankB < amount then triggerNotify(nil, Loc[Config.Lan].error["bank_low"], "error", src)
elseif bankB >= tonumber(amount) then
triggerNotify(nil, Loc[Config.Lan].success["draw"]..cv(amount)..Loc[Config.Lan].success["from_bank"], "success") -- Don't really need this as phone gets notified when money is withdrawn
Player.Functions.RemoveMoney('bank', amount) Wait(1500)
Player.Functions.AddMoney('cash', amount)
if Player.bank < amount then
triggerNotify(nil, locale("error" ,"bank_low"), "error", src)
elseif Player.bank >= tonumber(amount) then
triggerNotify(nil, locale("success" ,"draw")..cv(amount)..locale("success" ,"from_bank"), "success") -- Don't really need this as phone gets notified when money is withdrawn
chargePlayer(amount, "bank", src) Wait(1500)
fundPlayer(amount, "cash", src)
end
elseif billtype == "deposit" then
if cashB < amount then triggerNotify(nil, Loc[Config.Lan].error["no_cash"], "error", src)
elseif cashB >= amount then
Player.Functions.RemoveMoney('cash', amount) Wait(1500)
Player.Functions.AddMoney('bank', amount)
triggerNotify(nil, Loc[Config.Lan].success["deposited"]..cv(amount)..Loc[Config.Lan].success["into_bank"], "success", src)
if Player.cash < amount then
triggerNotify(nil, locale("error" ,"no_cash"), "error", src)
elseif Player.cash >= amount then
chargePlayer(amount, "cash", src) Wait(1500)
fundPlayer(amount, "bank", src)
triggerNotify(nil, locale("success" ,"deposited")..cv(amount)..locale("success" ,"into_bank"), "success", src)
end
end
-- Transfers from bank to savings account --
elseif account == "savings" then
local getSavingsAccount = MySQL.Sync.fetchAll('SELECT * FROM bank_accounts WHERE citizenid = ? AND account_type = ?', { Player.PlayerData.citizenid, 'Savings' })
if getSavingsAccount[1] ~= nil then savbal = tonumber(getSavingsAccount[1].amount) aid = getSavingsAccount[1].record_id end
local getSavingsAccount = MySQL.Sync.fetchAll('SELECT * FROM bank_accounts WHERE citizenid = ? AND account_name = ?', { Player.citizenId, 'Savings_'..Player.citizenId, })
if getSavingsAccount[1] ~= nil then savbal = tonumber(getSavingsAccount[1].account_balance) aid = getSavingsAccount[1].citizenid end
if billtype == "withdraw" then
if savbal >= amount then
savbal -= amount
Player.Functions.AddMoney('bank', amount)
triggerNotify(nil, "$"..cv(amount)..Loc[Config.Lan].success["draw_save"], "success", src)
MySQL.Async.execute('UPDATE bank_accounts SET amount = ? WHERE citizenid = ? AND record_id = ?', { savbal, Player.PlayerData.citizenid, getSavingsAccount[1].record_id }, function(success)
fundPlayer(amount, "cash", src)
triggerNotify(nil, "$"..cv(amount)..locale("success" ,"draw_save"), "success", src)
MySQL.Async.execute('UPDATE bank_accounts SET account_balance = ? WHERE citizenid = ?', { savbal, Player.citizenId }, function(success)
if success then return true else return false end
end)
elseif savbal < amount then
triggerNotify(nil, Loc[Config.Lan].error["saving_low"], "error")
triggerNotify(nil, locale("error" ,"saving_low"), "error")
end
elseif billtype == "deposit" then
if amount < bankB then
if amount < Player.bank then
savbal += amount
Player.Functions.RemoveMoney('bank', amount)
triggerNotify(nil, "$"..cv(amount)..Loc[Config.Lan].success["depos_save"], "success", src)
MySQL.Async.execute('UPDATE bank_accounts SET amount = ? WHERE citizenid = ? AND record_id = ?', { savbal, Player.PlayerData.citizenid, getSavingsAccount[1].record_id }, function(success)
chargePlayer(amount, "bank", src)
triggerNotify(nil, "$"..cv(amount)..locale("success", "depos_save"), "success", src)
MySQL.Async.execute('UPDATE bank_accounts SET account_balance = ? WHERE citizenid = ?', { savbal, Player.citizenId}, function(success)
if success then return true else return false end
end)
else triggerNotify(nil, Loc[Config.Lan].error["bank_low"], "error", src)
else triggerNotify(nil, locale("error" ,"bank_low"), "error", src)
end
end
--Simple transfers from society account to bank --
elseif account == "society" then
if billtype == "withdraw" then
if tonumber(society) < amount then triggerNotify(nil, Loc[Config.Lan].error["soc_low"], "error", src)
if tonumber(society) < amount then
triggerNotify(nil, locale("error" ,"soc_low"), "error", src)
elseif tonumber(society) >= amount then
triggerNotify(nil, Loc[Config.Lan].success["draw"]..cv(amount)..Loc[Config.Lan].success["fromthe"]..Player.PlayerData.job.label..Loc[Config.Lan].success["account"], "success", src)
Player.Functions.AddMoney('bank', amount)
if Config.Banking == "renewed" then
exports['Renewed-Banking']:removeAccountMoney(tostring(Player.PlayerData.job.name), amount)
elseif Config.Banking == "qb" then
exports["qb-management"]:RemoveMoney(tostring(Player.PlayerData.job.name), amount)
elseif Config.Banking == "fd" then
exports.fd_banking:RemoveMoney(tostring(Player.PlayerData.job.name), amount)
chargeSociety(Player.job, amount)
fundPlayer(amount, "bank", src)
triggerNotify(nil, locale("success", "draw")..cv(amount)..locale("success", "fromthe")..Jobs[Player.job].label..locale("success" ,"account"), "success", src)
end
elseif billtype == "deposit" then
if bankB < amount then triggerNotify(nil, Loc[Config.Lan].error["nomoney_bank"], "error", src)
elseif bankB >= amount then
if Config.Banking == "qb" then
exports['Renewed-Banking']:addAccountMoney(tostring(Player.PlayerData.job.name), amount)
elseif Config.Banking == "qb" then
exports["qb-management"]:AddMoney(tostring(Player.PlayerData.job.name), amount)
elseif Config.Banking == "fd" then
exports.fd_banking:AddMoney(tostring(Player.PlayerData.job.name), amount)
end
Player.Functions.RemoveMoney('bank', amount) Wait(1500)
triggerNotify(nil, Loc[Config.Lan].success["deposited"]..cv(amount)..Loc[Config.Lan].success["into"]..Player.PlayerData.job.label..Loc[Config.Lan].success["account"], "success", src)
if Player.bank < amount then triggerNotify(nil, locale("error", "nomoney_bank"), "error", src)
elseif Player.bank >= amount then
fundSociety(Player.job, amount)
chargePlayer(amount, "bank", src) Wait(1500)
triggerNotify(nil, locale("success", "deposited")..cv(amount)..locale("success", "into")..Jobs[Player.job].label..locale("success", "account"), "success", src)
end
end
-- Transfer from boss account to players --
--[[ disabled until i work out a system for other frameworks
elseif account == "societytransfer" then
local bannedCharacters = {'%','$',';'}
local newAmount = tostring(amount)
@@ -100,51 +91,53 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
baccount = newiban
amount = tonumber(newAmount)
local Player = QBCore.Functions.GetPlayer(src)
local Player = Core.Functions.GetPlayer(src)
if (society - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
local Reciever = Core.Functions.GetPlayerByCitizenId(result[1].citizenid)
if Config.Banking == "renewed" then
exports['Renewed-Banking']:removeAccountMoney(tostring(Player.PlayerData.job.name), amount)
elseif Config.Banking == "qb" then
exports["qb-management"]:RemoveMoney(tostring(Player.PlayerData.job.name), amount) end
elseif Config.Banking == "qb-management" then
exports["qb-management"]:RemoveMoney(tostring(Player.PlayerData.job.name), amount)
elseif Config.Banking == "qb-banking" then
exports["qb-banking"]:RemoveMoney(tostring(Player.PlayerData.job.name), amount)
elseif Config.Banking == "fd" then
exports.fd_banking:RemoveMoney(tostring(Player.PlayerData.job.name), amount)
end
if Reciever then
Reciever.Functions.AddMoney('bank', amount)
triggerNotify(nil, Loc[Config.Lan].success["sent"]..amount..Loc[Config.Lan].success["to"]..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success", src)
triggerNotify(nil, Loc[Config.Lan].success["recieved"]..cv(amount)..Loc[Config.Lan].success["from"]..tostring(Player.PlayerData.job.label)..Loc[Config.Lan].success["account"], "success", Reciever.PlayerData.source)
triggerNotify(nil, locale("success" ,"sent"]..amount..locale("success" ,"to"]..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success", src)
triggerNotify(nil, locale("success" ,"recieved"]..cv(amount)..locale("success" ,"from"]..tostring(Player.PlayerData.job.label)..locale("success" ,"account"], "success", Reciever.PlayerData.source)
else
local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank += amount
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end
elseif not result[1] then triggerNotify(nil, Loc[Config.Lan].error["error_start"]..baccount..Loc[Config.Lan].error["error_end"], "error", src)
elseif not result[1] then triggerNotify(nil, locale("error" ,"error_start"]..baccount..locale("error" ,"error_end"], "error", src)
end
end
end]]
--Simple transfers from gang society account to bank --
elseif account == "gang" then
if billtype == "withdraw" then
if tonumber(gsociety) < amount then triggerNotify(nil, Loc[Config.Lan].error["soc_low"], "error", src)
if tonumber(gsociety) < amount then
triggerNotify(nil, locale("error" ,"soc_low"), "error", src)
elseif tonumber(gsociety) >= amount then
triggerNotify(nil, Loc[Config.Lan].success["draw"]..cv(amount)..Loc[Config.Lan].success["fromthe"]..Player.PlayerData.gang.label..Loc[Config.Lan].success["account"], "success", src)
Player.Functions.AddMoney('bank', amount)
if Config.Banking == "renewed" then exports['Renewed-Banking']:removeAccountMoney( tostring(Player.PlayerData.gang.name), amount)
elseif Config.Banking == "qb" then exports["qb-management"]:RemoveGangMoney(tostring(Player.PlayerData.gang.name), amount)
elseif Config.Banking == "fd" then exports.fd_banking:RemoveGangMoney(tostring(Player.PlayerData.gang.name), amount) end
chargeSociety(Player.gang, amount)
end
fundPlayer(amount, "bank", src)
triggerNotify(nil, locale("success" ,"draw")..cv(amount)..locale("success" ,"fromthe")..Gangs[Player.gang].label..locale("success" ,"account"), "success", src)
elseif billtype == "deposit" then
if bankB < amount then triggerNotify(nil, Loc[Config.Lan].error["nomoney_bank"], "error", src)
elseif bankB >= amount then
if Config.Banking == "rewnewed" then exports['Renewed-Banking']:addAccountMoney(tostring(Player.PlayerData.gang.name), amount)
elseif Config.Banking == "qb" then exports["qb-management"]:AddGangMoney(tostring(Player.PlayerData.gang.name), amount)
elseif Config.Banking == "fd" then exports.fd_banking:AddGangMoney(tostring(Player.PlayerData.gang.name), amount) end
Player.Functions.RemoveMoney('bank', amount) Wait(1500)
triggerNotify(nil, Loc[Config.Lan].success["deposited"]..cv(amount)..Loc[Config.Lan].success["into"]..Player.PlayerData.gang.label..Loc[Config.Lan].success["account"], "success", src)
if Player.bank < amount then
triggerNotify(nil, locale("error" ,"nomoney_bank"), "error", src)
elseif Player.bank >= amount then
fundSociety(Player.gang, amount)
chargePlayer(amount, "bank", Player.source) Wait(1500)
triggerNotify(nil, locale("success" ,"deposited")..cv(amount)..locale("success" ,"into")..Gangs[Player.gang].label..locale("success" ,"account"), "success", src)
end
end
-- Transfer from gang account to players --
@@ -159,29 +152,23 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
baccount = newiban
amount = tonumber(newAmount)
local Player = QBCore.Functions.GetPlayer(src)
local Player = Core.Functions.GetPlayer(src)
if (gsociety - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
if Config.Banking == "renewed" then
exports['Renewed-Banking']:removeAccountMoney( tostring(Player.PlayerData.gang.name), amount)
elseif Config.Banking == "qb" then
exports["qb-management"]:RemoveGangMoney(tostring(Player.PlayerData.gang.name), amount)
elseif Config.Banking == "fd" then
exports.fd_banking:RemoveGangMoney(tostring(Player.PlayerData.gang.name), amount)
end
local Reciever = Core.Functions.GetPlayerByCitizenId(result[1].citizenid)
chargeSociety(Player.PlayerData.gang.nameg, amount)
if not Reciever then
Reciever.Functions.AddMoney('bank', amount)
triggerNotify(nil, Loc[Config.Lan].success["sent"]..amount..Loc[Config.Lan].success["to"]..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success", src)
triggerNotify(nil, Reciever.PlayerData.source, Loc[Config.Lan].success["recieved"]..cv(amount)..Loc[Config.Lan].success["from"]..tostring(Player.PlayerData.gang.label)..Loc[Config.Lan].success["account"], "success", Reciever.PlayerData.source)
triggerNotify(nil, locale("success" ,"sent")..amount..locale("success" ,"to")..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success", src)
triggerNotify(nil, Reciever.PlayerData.source, locale("success" ,"recieved")..cv(amount)..locale("success" ,"from")..tostring(Player.PlayerData.gang.label)..locale("success" ,"account"), "success", Reciever.PlayerData.source)
else
local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank += amount
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end
elseif not result[1] then triggerNotify(nil, Loc[Config.Lan].error["error_start"]..baccount..Loc[Config.Lan].error["error_end"], "error", src)
elseif not result[1] then triggerNotify(nil, locale("error" ,"error_start")..baccount..locale("error" ,"error_end"), "error", src)
end
end
@@ -197,92 +184,82 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
baccount = newiban
amount = tonumber(newAmount)
local Player = QBCore.Functions.GetPlayer(src)
local Player = Core.Functions.GetPlayer(src)
if (Player.PlayerData.money.bank - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%'
local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
local Reciever = Core.Functions.GetPlayerByCitizenId(result[1].citizenid)
Player.Functions.RemoveMoney('bank', amount)
if Reciever then
Reciever.Functions.AddMoney('bank', amount)
triggerNotify(nil, Loc[Config.Lan].success["sent"]..cv(amount)..Loc[Config.Lan].success["to"]..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success", src)
triggerNotify(nil, Loc[Config.Lan].success["recieved"]..cv(amount)..Loc[Config.Lan].success["from"]..Player.PlayerData.charinfo.firstname.." "..Player.PlayerData.charinfo.lastname, "success", Reciever.PlayerData.source)
triggerNotify(nil, locale("success" ,"sent")..cv(amount)..locale("success" ,"to")..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success", src)
triggerNotify(nil, locale("success" ,"recieved")..cv(amount)..locale("success" ,"from")..Player.PlayerData.charinfo.firstname.." "..Player.PlayerData.charinfo.lastname, "success", Reciever.PlayerData.source)
else
local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank += amount
MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end
elseif not result[1] then triggerNotify(nil, Loc[Config.Lan].error["error_start"]..baccount..Loc[Config.Lan].error["error_end"], "error", src)
elseif not result[1] then
triggerNotify(nil, locale("error" ,"error_start")..baccount..locale("error" ,"error_end"), "error", src)
end
end
end
end)
QBCore.Functions.CreateCallback('jim-payments:ATM:Find', function(source, cb)
local Player = QBCore.Functions.GetPlayer(source)
local name = Player.PlayerData.charinfo.firstname..' '..Player.PlayerData.charinfo.lastname
local cid = Player.PlayerData.citizenid.." ["..source.."]"
local cash = Player.Functions.GetMoney("cash")
local bank = Player.Functions.GetMoney("bank")
local account = Player.PlayerData.charinfo.account
local society = 0
local gsociety = 0
-- If qb-management, grab info directly from database
if not Config.Banking == "renewed" then
local result = MySQL.Sync.fetchAll('SELECT * FROM management_funds')
for _, v in pairs(result) do
if Player.PlayerData.job.name == v.job_name then society = v.amount end
end
if Player.PlayerData.gang.name ~= "none" then
for _, v in pairs(result) do
if Player.PlayerData.gang.name == v.job_name then gsociety = v.amount end
end
end
else
createCallback(getScript()..":GetInfo", function(source)
local Player = getPlayer(source)
local society, gsociety = 0, 0
society = getSocietyAccount(Player.job)
if Player.gang ~= "none" then
gsociety = getSocietyAccount(Player.gang)
end
-- Savings account is only QBCore for now
if isStarted(QBExport) and not isStarted(QBXExport) then
-- Grab Savings account info
local result = MySQL.Sync.fetchAll('SELECT * FROM bank_accounts WHERE citizenid = ? AND account_type = ?', { Player.PlayerData.citizenid, 'Savings' })
if result[1] then
accountID = result[1].record_id
savingBalance = result[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 result = MySQL.Sync.fetchAll('SELECT * FROM bank_accounts WHERE citizenid = ? AND account_type = ?', { Player.PlayerData.citizenid, 'Savings' })
aid = result[1].record_id
savingBalance = result[1].amount
end
cb({name = name,
cash = cash,
bank = bank,
account = account,
cid = cid,
local result = MySQL.Sync.fetchAll('SELECT * FROM bank_accounts WHERE citizenid = ? AND account_name = ?', { Player.citizenId, 'Savings_'..Player.citizenId, })
if result[1] then
accountID = result[1].citizenid
savingBalance = result[1].account_balance
else
MySQL.Async.insert('INSERT INTO bank_accounts (citizenid, account_name, account_balance) VALUES (?, ?, ?)', { Player.citizenId, 'Savings_'..Player.citizenId, 0}, function() completed = true end) repeat Wait(0) until completed == true
local result = MySQL.Sync.fetchAll('SELECT * FROM bank_accounts WHERE citizenid = ? AND account_name = ?', { Player.citizenId, 'Savings_'..Player.citizenId, })
accountID = result[1].citizenid
savingBalance = result[1].account_balance
end
end
local retTable = {
name = Player.firstname..' '..Player.lastname,
cash = Player.cash,
bank = Player.bank,
account = Player.account,
cid = Player.citizenId.." ["..source.."]",
savbal = savingBalance,
aid = accountID,
society = society,
gsociety = gsociety})
gsociety = gsociety
}
return retTable
end)
QBCore.Commands.Add("cashgive", Loc[Config.Lan].command["pay_user"], {}, false, function(source) TriggerClientEvent("jim-payments:client:ATM:give", source) end)
RegisterServerEvent("jim-payments:server:ATM:give", function(citizen, price)
local Player = QBCore.Functions.GetPlayer(source)
local Reciever = QBCore.Functions.GetPlayer(tonumber(citizen))
RegisterServerEvent(getScript()..":server:ATM:give", function(citizen, price)
local Player = getPlayer(source)
local Reciever = getPlayer(tonumber(citizen))
local amount = tonumber(price)
local balance = Player.Functions.GetMoney("cash")
local balance = Player.cash
if amount and amount > 0 then
if balance >= amount then
Player.Functions.RemoveMoney('cash', amount)
triggerNotify(nil, Loc[Config.Lan].success["you_gave"]..Reciever.PlayerData.charinfo.firstname.." $"..cv(amount), "success", source)
Reciever.Functions.AddMoney('cash', amount)
triggerNotify(nil, Loc[Config.Lan].success["you_got"]..cv(amount)..Loc[Config.Lan].success["from"]..Player.PlayerData.charinfo.firstname, "success", tonumber(citizen))
chargePlayer(amount, "cash", source)
triggerNotify(nil, locale("success" ,"you_gave")..Reciever.name.." $"..cv(amount), "success", source)
fundPlayer(amount, "cash", Reciever.source)
triggerNotify(nil, locale("success" ,"you_got")..cv(amount)..locale("success" ,"from")..Player.name, "success", tonumber(citizen))
elseif balance < amount then
triggerNotify(nil, Loc[Config.Lan].error["not_enough"], "error", source)
triggerNotify(nil, locale("error" ,"not_enough"), "error", source)
end
else triggerNotify(nil, Loc[Config.Lan].error["zero"], 'error', source) end
else triggerNotify(nil, locale("error" ,"zero"), 'error', source) end
end)

104
server/chargerserver.lua Normal file
View File

@@ -0,0 +1,104 @@
onResourceStart(function()
for k in pairs(Config.Receipts.Jobs) do
while not Jobs do Wait(10) end
if not Jobs[k] and not Gangs[k] then
debugPrint("^1Error^7: ^5Config^7.^5Receipts^7.^5Jobs ^2searched for job/gang ^7'^3"..k.."^7' ^2and couldn't find it in the Shared^7")
end
end
if Items and not Items["payticket"] then
debugPrint("^1Error^7: ^2Unable to find ^7'^3payticket^7' ^2item it in the Shared^7")
end
end, true)
registerCommand("cashregister", {
locale("command", "cash_reg"), {}, false,
function(source)
TriggerClientEvent(getScript()..":client:Charge", source, {}, true)
end
})
createCallback(getScript()..":MakePlayerList", function(source)
local onlineList = {}
for _, v in pairs(GetPlayers()) do
if v ~= nil or type(v) ~= "number" then
local Player = getPlayer(v)
onlineList[#onlineList+1] = { value = tonumber(v), text = "["..v.."] - "..Player.name }
Wait(10)
end
end
return onlineList
end)
RegisterServerEvent(getScript()..":server:Charge", function(citizen, price, billtype, img, outside, gang)
local src = source
local biller = getPlayer(src)
local billed = getPlayer(tonumber(citizen))
local amount = tonumber(price)
local balance = billed[billtype]
if amount and amount > 0 then
if balance < amount then
triggerNotify(nil, locale("error", "customer_nocash"), "error", src)
triggerNotify(nil, locale("error", "you_nocash"), "error", tonumber(citizen))
return
end
local label = gang == true and Gangs[biller.gang].label or Jobs[biller.job].label
if Config.General.PhoneBank == false or gang == true or billtype == "cash" then
TriggerClientEvent(getScript()..":client:PayPopup", billed.source, amount, src, billtype, img, label, gang, outside)
else
if Config.General.PhoneType == "qb" then
MySQL.Async.insert(
'INSERT INTO phone_invoices (citizenid, amount, society, sender, sendercitizenid) VALUES (?, ?, ?, ?, ?)',
{billed.citizenid, amount, biller.job, biller.firstname, biller.citizenid}, function(id)
if id then
TriggerClientEvent('qb-phone:client:AcceptorDenyInvoice', billed.source, id, biller.firstname, biller.job, biller.citizenid, amount, GetInvokingResource())
end
end)
TriggerClientEvent('qb-phone:RefreshPhone', billed.source)
elseif Config.General.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.citizenid,
['@amount'] = amount,
['@society'] = biller.job,
['@sender'] = biller.firstname,
['@sendercitizenid'] = biller.citizenid,
['@label'] = label,
})
TriggerClientEvent('gksphone:notifi', src, {title = 'Billing', message = locale("success", "inv_succ"), img= '/html/static/img/icons/logo.png' })
TriggerClientEvent('gksphone:notifi', billed.source, {title = 'Billing', message = locale("success", "inv_recieved"), img= '/html/static/img/icons/logo.png' })
end
triggerNotify(nil, locale("success", "inv_succ"), 'success', src)
triggerNotify(nil, locale("success", "inv_recieved"), nil, billed.source)
end
else triggerNotify(nil, locale("error", "charge_zero"), 'error', source) return end
end)
RegisterServerEvent(getScript()..":server:PayPopup", function(data)
local src = source
local billed = getPlayer(src)
local biller = getPlayer(tonumber(data.biller))
local newdata = {
senderCitizenId = biller.citizenid,
society = data.gang and biller.gang or biller.job,
amount = data.amount
}
if data.accept then
chargePlayer(data.amount, data.billtype, src)
if Config.General.ApGov then
exports['ap-government']:chargeCityTax(billed.source, "Item", data.amount)
end
TriggerEvent(getScript()..":Tickets:Give", newdata, biller, data.gang)
triggerNotify(nil, billed.firstname..locale("success", "accepted_pay")..data.amount..locale("success", "payment"), "success", data.biller)
elseif not data.accept then
triggerNotify(nil, locale("success", "declined"), "error", src)
triggerNotify(nil, billed.firstname..locale("error", "decline_pay")..data.amount..locale("success", "payment"), "error", data.biller)
end
end)
CreateThread(function()
if Config.General.Usebzzz then
createUseableItem('terminal', function(source, item)
TriggerClientEvent(getScript()..":client:Charge", source, {}, true)
end)
end
end)

103
server/polchargeserver.lua Normal file
View File

@@ -0,0 +1,103 @@
registerCommand("polcharge", {
locale("command", "charge"), {}, false,
function(source)
TriggerClientEvent(getScript()..":client:PolCharge", source)
end
})
RegisterServerEvent(getScript()..":server:PolCharge", function(citizen, price)
local src = source
local biller = getPlayer(src)
local billed = getPlayer(tonumber(citizen))
local price = math.floor(tonumber(price))
local commPercent = Config.PolCharge.FineJobs[biller.job] and Config.PolCharge.FineJobs[biller.job].Commission or 0.25
if Config.PolCharge.FineJobs[biller.job] then
commPercent = Config.PolCharge.FineJobs[biller.job].Commission
else
commPercent = 0.25
print("Can't find job in 'FineJobs', defaulting to 0.25 (25% commission)")
end
local commission = math.floor(price * commPercent)
if price > 0 then
if not Config.PolCharge.FineJobConfirmation then
polCharge({
biller = biller,
billed = billed,
price = price,
commission = commission,
billerJob = tostring(biller.job),
amountChange = (price - commission)
})
triggerNotify(nil, billed.firstname..locale("success", "charged")..(price - commission), "success", src)
triggerNotify(nil, locale("success", "you_charged")..(price - commission), nil, billed.source)
else
TriggerClientEvent(getScript()..":client:PolPopup", billed.source, price, src, biller.job, commPercent)
end
else triggerNotify(nil, locale("error", "charge_zero"), 'error', source) return end
end)
RegisterServerEvent(getScript()..":server:PolPopup", function(data)
local src = source
local billed = getPlayer(src)
local biller = getPlayer(tonumber(data.biller))
local price = math.floor(data.amount)
local commission = math.floor(tonumber(data.amount) * data.commPercent)
if data.accept then
polCharge({
biller = biller,
billed = billed,
price = price,
commission = commission,
billerJob = tostring(biller.job),
amountChange = (price - commission)
})
elseif not data.accept then
triggerNotify(nil, locale("error", "declined_payment"), nil, src)
triggerNotify(nil, billed.PlayerData.charinfo.firstname.." declined the $"..data.amount..locale("success", "charge_end"), "error", data.biller)
end
end)
function polCharge(data)
local billedSource, billerSource, newAmount = data.billed.source, data.biller.source, 0
local bankScript = nil
chargePlayer(data.price, "bank", billedSource)
debugPrint("^5Debug^7: ^3PolCharge^7 - ^2Player^7(^6"..billedSource.."^7) ^2charged ^7$^6"..data.price.."^7")
if Config.ApGov then
exports['ap-government']:chargeCityTax(billedSource, "Item", data.price)
end
fundPlayer(data.commission, "bank", billerSource)
debugPrint("^5Debug^7: ^3PolCharge^7 - ^2Commission of ^7$^6"..data.commission.." ^2sent to Player^7(^6"..billerSource.."^7)")
if isStarted("Renewed-Banking") then
bankScript = "Renewed-Banking"
exports["Renewed-Banking"]:addAccountMoney(data.billerJob, data.amountChange)
newAmount = exports["Renewed-Banking"]:getAccountMoney(data.billerJob)
elseif isStarted("qb-banking") then
bankScript = "qb-banking"
exports["qb-banking"]:AddMoney(data.billerJob, data.amountChange, "Cash Register Payment")
newAmount = exports["qb-banking"]:GetAccountBalance(data.billerJob)
elseif isStarted("fd_banking") then
bankScript = "fd_banking"
if gang then
exports["fd_banking"]:AddGangMoney(data.billerJob, data.amountChange)
newAmount = exports["fd_banking"]:GetGangAccount(data.billerJob)
else
exports["fd_banking"]:AddMoney(data.billerJob, data.amountChange)
newAmount = exports["fd_banking"]:GetAccount(data.billerJob)
end
elseif isStarted("okokBanking") then
bankScript = "okokBanking"
exports['okokBanking']:AddMoney(data.billerJob, data.amountChange)
newAmount = exports['okokBanking']:GetAccount(data.billerJob)
end
debugPrint("^5Debug^7: ^3"..bankScript.."^7(^3Job^7): ^2Adding ^7$"..data.amountChange.." ^2to account ^7'^6"..data.billerJob.."^7' ($"..newAmount..")")
end

View File

@@ -1,264 +0,0 @@
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)
CreateThread(function()
if Config.Enablecommand then
QBCore.Commands.Add("cashregister", Loc[Config.Lan].command["cash_reg"], {}, false, function(source) TriggerClientEvent("jim-payments:client:Charge", source, {}, true) end)
end
end)
QBCore.Commands.Add("polcharge", Loc[Config.Lan].command["charge"], {}, 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
local takecomm = math.floor(tonumber(data.amount) * Config.Jobs[data.society].Commission)
if biller then -- If this is found, it ISN'T a phone payment, so add money to society here
if gang then
if Config.Banking == "renewed" then
exports['Renewed-Banking']:addAccountMoney(tostring(biller.PlayerData.gang.name), data.amount - takecomm)
if Config.Debug then
print("^5Debug^7: ^3Renewed-Banking^7(^3Gang^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.gang.name).."^7' ($^6"..exports['Renewed-Banking']:getAccountMoney(biller.PlayerData.gang.name).."^7)") end
elseif Config.Banking == "qb" then
exports["qb-management"]:AddGangMoney(tostring(biller.PlayerData.gang.name), data.amount - takecomm)
if Config.Debug then print("^5Debug^7: ^3QB-Management^7(^3Gang^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.gang.name).."^7' ($^6"..exports["qb-management"]:GetGangAccount(biller.PlayerData.gang.name).."^7)") end
elseif Config.Banking == "fd" then
exports.fd_banking:AddGangMoney(tostring(biller.PlayerData.gang.name), data.amount - takecomm)
if Config.Debug then print("^5Debug^7: ^3FD-Banking^7(^3Gang^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.gang.name).."^7' ($^6"..exports.fd_banking:GetGangAccount(biller.PlayerData.gang.name).."^7)") end
end
elseif not gang then
if Config.Banking == "renewed"
then exports['Renewed-Banking']:addAccountMoney(tostring(biller.PlayerData.job.name), data.amount - takecomm)
if Config.Debug then print("^5Debug^7: ^3Renewed-Banking^7(^3Job^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..tostring(exports['Renewed-Banking']:getAccountMoney(biller.PlayerData.job.name)).."^7)") end
elseif Config.Banking == "qb" then
exports["qb-management"]:AddMoney(tostring(biller.PlayerData.job.name), data.amount - takecomm)
if Config.Debug then print("^5Debug^7: ^3QB-Management^7(^3Job^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports["qb-management"]:GetAccount(biller.PlayerData.job.name).."^7)") end
elseif Config.Banking == "fd" then
exports.fd_banking:AddMoney(tostring(biller.PlayerData.job.name), data.amount - takecomm)
if Config.Debug then print("^5Debug^7: ^3FD-Banking^7(^3Job^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports.fd_banking:GetAccount(biller.PlayerData.job.name).."^7)") 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
triggerNotify(nil, data.sender..Loc[Config.Lan].success["invoice_start"]..data.amount..Loc[Config.Lan].success["invoice_end"], "success", biller.PlayerData.source)
end
-- If ticket system enabled, do this
if (biller.PlayerData.job.onduty or gang) and Config.TicketSystem then
if data.amount >= Config.Jobs[data.society].MinAmountforTicket then
if Config.TicketSystemAll then
for _, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player ~= nil or Player ~= billed then
if gang then
if Player.PlayerData.gang.name == data.society then
if Player.Functions.AddItem('payticket', 1) then TriggerClientEvent('inventory:client:ItemBox', Player.PlayerData.source, QBCore.Shared.Items['payticket'], "add", 1) end
triggerNotify(nil, Loc[Config.Lan].success["rec_rec"], 'success', Player.PlayerData.source)
end
else
if Player.PlayerData.job.name == data.society and Player.PlayerData.job.onduty then
if Player.Functions.AddItem('payticket', 1) then TriggerClientEvent('inventory:client:ItemBox', Player.PlayerData.source, QBCore.Shared.Items['payticket'], "add", 1) end
triggerNotify(nil, Loc[Config.Lan].success["rec_rec"], 'success', Player.PlayerData.source)
end
end
end
end
else
if biller.Functions.AddItem('payticket', 1) then TriggerClientEvent('inventory:client:ItemBox', biller.PlayerData.source, QBCore.Shared.Items['payticket'], "add", 1) end
triggerNotify(nil, Loc[Config.Lan].success["rec_rec"], 'success', biller.PlayerData.source)
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)))
triggerNotify(nil, Loc[Config.Lan].success["recieved"]..math.floor(tonumber(data.amount) * (comm *2))..Loc[Config.Lan].success["commission"], "success", biller.PlayerData.source)
else biller.Functions.AddMoney("bank", math.floor(tonumber(data.amount) *comm))
triggerNotify(nil, Loc[Config.Lan].success["recieved"]..math.floor(tonumber(data.amount) * comm)..Loc[Config.Lan].success["commission"], "success", biller.PlayerData.source)
end
if Config.CommissionAll then
for _, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v)
if Player 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))
triggerNotify(nil, Loc[Config.Lan].success["recieved"]..math.floor(tonumber(data.amount) * comm)..Loc[Config.Lan].success["commission"], "success", Player.PlayerData.source)
end
end
end
end
end
end)
RegisterServerEvent('jim-payments:Tickets:Sell', function()
local Player = QBCore.Functions.GetPlayer(source)
if not Player.Functions.GetItemByName("payticket") then triggerNotify(nil, Loc[Config.Lan].error["no_ticket_to"], 'error', source) return
else
tickets = Player.Functions.GetItemByName("payticket").amount
Player.Functions.RemoveItem('payticket', tickets)
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)
triggerNotify(nil, Loc[Config.Lan].success["trade_ticket_start"]..tickets..Loc[Config.Lan].success["trade_ticket_end"]..cv(pay), 'success', source)
end
end)
QBCore.Functions.CreateCallback('jim-payments:Ticket:Count', function(source, cb)
cb(QBCore.Functions.GetPlayer(source).Functions.GetItemByName('payticket'))
end)
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 balance = billed.Functions.GetMoney(billtype)
if amount and amount > 0 then
if balance < amount then
triggerNotify(nil, Loc[Config.Lan].error["customer_nocash"], "error", src)
triggerNotify(nil, Loc[Config.Lan].error["you_nocash"], "error", tonumber(citizen))
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}, function(id)
if id then
TriggerClientEvent('qb-phone:client:AcceptorDenyInvoice', billed.PlayerData.source, id, biller.PlayerData.charinfo.firstname, biller.PlayerData.job.name, biller.PlayerData.citizenid, amount, GetInvokingResource())
end
end)
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 = Loc[Config.Lan].success["inv_succ"], img= '/html/static/img/icons/logo.png' })
TriggerClientEvent('gksphone:notifi', billed.PlayerData.source, {title = 'Billing', message = Loc[Config.Lan].success["inv_recieved"], img= '/html/static/img/icons/logo.png' })
end
triggerNotify(nil, Loc[Config.Lan].success["inv_succ"], 'success', src)
triggerNotify(nil, Loc[Config.Lan].success["inv_recieved"], nil, billed.PlayerData.source)
end
else triggerNotify(nil, Loc[Config.Lan].error["charge_zero"], 'error', source) 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)
if Config.ApGov then exports['ap-government']:chargeCityTax(billed.PlayerData.source, "Item", data.amount) end
TriggerEvent('jim-payments:Tickets:Give', newdata, biller, data.gang)
triggerNotify(nil, billed.PlayerData.charinfo.firstname..Loc[Config.Lan].success["accepted_pay"]..data.amount..Loc[Config.Lan].success["payment"], "success", data.biller)
elseif data.accept == false then
triggerNotify(nil, Loc[Config.Lan].success["declined"], nil, src)
triggerNotify(nil, billed.PlayerData.charinfo.firstname..Loc[Config.Lan].error["decline_pay"]..data.amount..Loc[Config.Lan].success["payment"], "error", data.biller)
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))
local price = math.floor(tonumber(price))
local commission = math.floor(price * Config.FineJobs[biller.PlayerData.job.name].Commission)
if price > 0 then
if not Config.FineJobConfirmation then
if billed.Functions.RemoveMoney("bank", price) then if Config.Debug then print("^5Debug^7: ^3PolCharge^7 - ^2Player^7(^6"..billed.PlayerData.source.."^7) ^2charged ^7$^6"..price.."^7") end end
if Config.ApGov then exports['ap-government']:chargeCityTax(billed.PlayerData.source, "Item", price) end
if biller.Functions.AddMoney("bank", commission) then if Config.Debug then print("^5Debug^7: ^3PolCharge^7 - ^2Commission of ^7$^6"..commission.." ^2sent to Player^7(^6"..biller.PlayerData.source.."^7)") end end
if Config.Banking == "renewed" then
exports['Renewed-Banking']:addAccountMoney(tostring(biller.PlayerData.job.name), (price - commission))
if Config.Debug then print("^5Debug^7: ^3Renewed-Banking^7(^3Job^7): ^2Adding ^7$^6"..(price - commission).." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports['Renewed-Banking']:getAccountMoney((biller.PlayerData.job.name).."^7)")) end
elseif Config.Banking == "qb" then
exports["qb-management"]:AddMoney(tostring(biller.PlayerData.job.name), (price - commission))
if Config.Debug then print("^5Debug^7: ^3QB-Management^7(^3Job^7): ^2Adding ^7$^6"..(price - takecomm).." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports["qb-management"]:GetAccount(biller.PlayerData.job.name).."^7)") end
elseif Config.Banking == "fd" then
exports.fd_banking:AddMoney(tostring(biller.PlayerData.job.name), (price - commission))
if Config.Debug then print("^5Debug^7: ^3QB-Management^7(^3Job^7): ^2Adding ^7$^6"..(price - takecomm).." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports.fd_banking:GetAccount(biller.PlayerData.job.name).."^7)") end
end
triggerNotify(nil, billed.PlayerData.charinfo.firstname..Loc[Config.Lan].success["charged"]..(price - commission), "success", src)
triggerNotify(nil, Loc[Config.Lan].success["you_charged"]..(price - commission), nil, billed.PlayerData.source)
else
TriggerClientEvent("jim-payments:client:PolPopup", billed.PlayerData.source, price, src, biller.PlayerData.job.label)
end
else triggerNotify(nil, Loc[Config.Lan].error["charge_zero"], 'error', source) 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))
data.amount = math.floor(data.amount)
local commission = math.floor(tonumber(data.amount) * Config.FineJobs[biller.PlayerData.job.name].Commission)
if data.accept == true then
if billed.Functions.RemoveMoney("bank", data.amount) then if Config.Debug then print("^5Debug^7: ^3PolCharge^7 - ^2Player^7(^6"..billed.PlayerData.source.."^7) ^2charged ^7$^6"..data.amount.."^7") end end
if Config.ApGov then exports['ap-government']:chargeCityTax(billed.PlayerData.source, "Item", data.amount) end
triggerNotify(nil, billed.PlayerData.charinfo.firstname..Loc[Config.Lan].success["accepted_pay"]..data.amount..Loc[Config.Lan].success["charge_end"], "success", data.biller)
if biller.Functions.AddMoney("bank", commission) then if Config.Debug then print("^5Debug^7: ^3PolCharge^7 - ^2Commission^2 of ^7$^6"..commission.." ^2sent to Player^7(^6"..biller.PlayerData.source.."^7)") end end
if Config.Banking == "renewed" then
exports['Renewed-Banking']:addAccountMoney(tostring(biller.PlayerData.job.name), data.amount - commission)
if Config.Debug then print("^5Debug^7: ^3Renewed-Banking^7(^3Job^7): ^2Adding ^7$^6"..(data.amount - commission).." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports['Renewed-Banking']:getAccountMoney((biller.PlayerData.job.name).."^7)")) end
elseif Config.Banking == "qb" then
exports["qb-management"]:AddMoney(tostring(biller.PlayerData.job.name), data.amount - commission)
if Config.Debug then print("^5Debug^7: ^3QB-Management^7(^3Job^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports["qb-management"]:GetAccount(biller.PlayerData.job.name).."^7)") end
elseif Config.Banking == "fd" then
exports.fd_banking:AddMoney(tostring(biller.PlayerData.job.name), data.amount - commission)
if Config.Debug then print("^5Debug^7: ^3FD-Banking^7(^3Job^7): ^2Adding ^7$^6"..data.amount - takecomm.." ^2to account ^7'^6"..tostring(biller.PlayerData.job.name).."^7' ($^6"..exports.fd_banking:GetAccount(biller.PlayerData.job.name).."^7)") end
end
else
triggerNotify(nil, Loc[Config.Lan].error["declined_payment"], nil, src)
triggerNotify(nil, billed.PlayerData.charinfo.firstname.." declined the $"..data.amount..Loc[Config.Lan].success["charge_end"], "error", data.biller)
end
end)
QBCore.Functions.CreateCallback('jim-payments:MakePlayerList', function(source, cb)
local onlineList = {}
for _, 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)
end)
CreateThread(function()
if Config.Usebzzz then
QBCore.Functions.CreateUseableItem('terminal', function(source, item)
TriggerClientEvent("jim-payments:client:Charge", source, {}, true)
end)
end
end)

123
server/ticketserver.lua Normal file
View File

@@ -0,0 +1,123 @@
RegisterServerEvent(getScript()..":Tickets:Give", function(data, biller, gang)
local src = source
local activePlayers = GetPlayers()
local commPercent = 0
jsonPrint(data)
if Config.Receipts.Jobs[data.society] then
commPercent = Config.Receipts.Jobs[data.society].Commission
else commPercent = 0.25
print("^1Error^7: ^2Can't find job in ^7'^3Config^7.^3Receipts^7.^3Jobs^7', ^2defaulting to 0.25 (25% commission)^7")
end
local takecomm = math.floor(data.amount * commPercent)
if biller ~= nil then -- If this is found, it ISN'T a phone payment, so add money to society here
local amountChange, newAmount = (data.amount - takecomm), 0
local society = gang and tostring(biller.gang) or tostring(biller.job)
local bankScript = nil
if isStarted("Renewed-Banking") then
bankScript = "Renewed-Banking"
exports["Renewed-Banking"]:addAccountMoney(society, amountChange)
newAmount = exports["Renewed-Banking"]:getAccountMoney(society)
elseif isStarted("qb-banking") then
bankScript = "qb-banking"
exports["qb-banking"]:AddMoney(society, amountChange, "Cash Register Payment")
newAmount = exports["qb-banking"]:GetAccountBalance(society)
elseif isStarted("fd_banking") then
bankScript = "fd_banking"
if gang then
exports["fd_banking"]:AddGangMoney(society, amountChange)
newAmount = exports["fd_banking"]:GetGangAccount(society)
else
exports["fd_banking"]:AddMoney(society, amountChange)
newAmount = exports["fd_banking"]:GetAccount(society)
end
elseif isStarted("okokBanking") then
bankScript = "okokBanking"
exports['okokBanking']:AddMoney(society, amountChange)
newAmount = exports['okokBanking']:GetAccount(society)
end
debugPrint("^5Debug^7: ^3"..bankScript.."^7(^3"..(gang and "Gang" or "Job").."^7): ^2Adding ^7$"..amountChange.." ^2to account ^7'^6"..society.."^7' ($"..newAmount..")")
elseif not biller then --Find the biller from their citizenid
for _, v in pairs(activePlayers) do
local Player = getPlayer(v)
if Player.citizenid == data.senderCitizenId then
biller = Player
end
end
triggerNotify(nil, data.sender..locale("success", "invoice_start")..data.amount..locale("success", "invoice_end"), "success", biller.source)
end
-- If ticket system enabled, do this
if (biller.onDuty or gang) and Config.Receipts.TicketSystem then
if not Config.Receipts.Jobs[data.society] then
print("^1Error^7: Failed to find job "..data.society.." in ^2Config.Receipts.Jobs^7")
return
end
if data.amount >= Config.Receipts.Jobs[data.society].MinAmountforTicket then
if Config.Receipts.TicketSystemAll then
for _, v in pairs(activePlayers) do
local Player = getPlayer(v)
if v ~= src then
if gang then
if Player.gang == data.society then
addItem("payticket", 1, nil, Player.source)
triggerNotify(nil, locale("success", "rec_rec"), 'success', Player.source)
end
else
if Player.job == data.society and Player.onDuty then
print("player on duty, giving tickets")
addItem("payticket", 1, nil, Player.source)
triggerNotify(nil, locale("success", "rec_rec"), 'success', Player.source)
end
end
end
end
else
addItem("payticket", 1, nil, biller.source)
triggerNotify(nil, locale("success", "rec_rec"), 'success', biller.source)
end
end
end
-- Commission section, does each config option separately
local comm = tonumber(Config.Receipts.Jobs[data.society].Commission)
if Config.Receipts.Commission and comm ~= 0 then
if Config.Receipts.CommissionLimit and data.amount < Config.Receipts.Jobs[data.society].MinAmountforTicket then return end
if Config.Receipts.CommissionDouble then
fundPlayer(math.floor(tonumber(data.amount) * (comm *2)), "bank", biller.source)
triggerNotify(nil, locale("success", "recieved")..math.floor(tonumber(data.amount) * (comm *2))..locale("success", "commission"), "success", biller.source)
else
fundPlayer(math.floor(tonumber(data.amount) *comm), "bank", biller.source)
triggerNotify(nil, locale("success", "recieved")..math.floor(tonumber(data.amount) * comm)..locale("success", "commission"), "success", biller.source)
end
if Config.Receipts.CommissionAll then
for _, v in pairs(activePlayers) do
local Player = getPlayer(v)
if v ~= biller.source then
if Player.job == data.society and Player.onDuty then
fundPlayer(math.floor(tonumber(data.amount) * comm), "bank", Player.source)
triggerNotify(nil, locale("success", "recieved")..math.floor(tonumber(data.amount) * comm)..locale("success", "commission"), "success", Player.source)
end
end
end
end
end
end)
RegisterServerEvent(getScript()..":Tickets:Sell", function() local src = source
local Player = getPlayer(src)
local hasItem, hasTable = hasItem("payticket", 1, src)
if not hasItem then
triggerNotify(nil, locale("error", "no_ticket_to"), 'error', src)
return
else
local tickets = hasTable["payticket"].count
removeItem("payticket", tickets, src)
local pay = (tickets * Config.Receipts.Jobs[Player.job].PayPerTicket)
fundPlayer(pay, "bank", src)
triggerNotify(nil, locale("success", "trade_ticket_start")..tickets..locale("success", "trade_ticket_end")..cv(pay), 'success', src)
end
end)

63
shared/banklocs.lua Normal file
View File

@@ -0,0 +1,63 @@
BankLocations = {
["legion"] = {
vec4(149.5, -1042.08, 29.37, 342.74), -- Legion Fleeca
},
["hawick"] = {
vec4(313.81, -280.43, 54.16, 342.29), -- Hawick Fleeca
},
["vinewood"] = {
vec4(-351.4, -51.24, 49.04, 338.4), -- Vinewood Fleeca
},
["delperro"] = {
vec4(-1212.11, -332.01, 37.78, 25.33), -- Del Perro Fleeca
},
["route1"] = {
vec4(-2961.17, 482.9, 15.7, 84.68), -- Route 1 Fleeca
},
["route68"] = {
vec4(1175.03, 2708.2, 38.09, 180.0), -- Route 68 Fleeca
},
["paleto"] = {
vec4(-111.22, 6470.03, 31.63, 133.86), -- Paleto Bank
},
["pacific"] = {
vec4(243.58, 226.25, 106.29, 169.06), -- Pacific Bank Window 1
vec4(247.08, 224.98, 106.29, 157.75), -- Pacific Bank Window 2
},
}
if Config.General.Gabz then
Config.Receipts.CashInLocation = vec4(269.28, 217.24, 106.28, 69.0)
BankLocations = {
["legion"] = {
vec4(149.5, -1042.08, 29.37, 342.74), -- Legion Fleeca
},
["hawick"] = {
vec4(313.81, -280.43, 54.16, 342.29), -- Hawick Fleeca
},
["vinewood"] = {
vec4(-351.4, -51.24, 49.04, 338.4), -- Vinewood Fleeca
},
["delperro"] = {
vec4(-1212.11, -332.01, 37.78, 25.33), -- Del Perro Fleeca
},
["route1"] = {
vec4(-2961.17, 482.9, 15.7, 84.68), -- Route 1 Fleeca
},
["route68"] = {
vec4(1175.03, 2708.2, 38.09, 180.0), -- Route 68 Fleeca
},
["paleto"] = {
vec4(-110.72, 6469.82, 31.63, 222.94), -- Paleto Bank (GABZ) - 1
vec4(-108.98, 6471.56, 31.63, 222.92), -- Paleto Bank (GABZ) - 2
},
["pacific"] = {
vec4(258.55, 227.63, 106.28, 160.96), -- Pacficic Gabz 1+2
vec4(263.21, 225.93, 106.28, 158.25), -- Pacficic Gabz 3+4
vec4(267.95, 224.24, 106.28, 158.5), -- Pacficic Gabz 5+6
vec4(263.71, 212.63, 106.28, 337.53), -- Pacficic Gabz 7+8
vec4(259.02, 214.32, 106.28, 337.82), -- Pacficic Gabz 9+10
vec4(254.27, 216.06, 106.28, 336.37), -- Pacficic Gabz 11+12
},
}
end

View File

@@ -1,120 +0,0 @@
QBCore = exports['qb-core']:GetCoreObject()
local time = 1000
function loadModel(model) if not HasModelLoaded(model) then
if Config.Debug then print("^5Debug^7: ^2Loading Model^7: '^6"..model.."^7'") end
while not HasModelLoaded(model) do
if time > 0 then time -= 1 RequestModel(model)
else time = 1000 print("^5Debug^7: ^3LoadModel^7: ^2Timed out loading model ^7'^6"..model.."^7'") break
end
Wait(10)
end
end end
function unloadModel(model) if Config.Debug then print("^5Debug^7: ^2Removing Model^7: '^6"..model.."^7'") end SetModelAsNoLongerNeeded(model) end
function loadAnimDict(dict) if not HasAnimDictLoaded(dict) then if Config.Debug then print("^5Debug^7: ^2Loading Anim Dictionary^7: '^6"..dict.."^7'") end while not HasAnimDictLoaded(dict) do RequestAnimDict(dict) Wait(5) end end end
function unloadAnimDict(dict) if Config.Debug then print("^5Debug^7: ^2Removing Anim Dictionary^7: '^6"..dict.."^7'") end RemoveAnimDict(dict) end
function loadPtfxDict(dict) if not HasNamedPtfxAssetLoaded(dict) then if Config.Debug then print("^5Debug^7: ^2Loading Ptfx Dictionary^7: '^6"..dict.."^7'") end while not HasNamedPtfxAssetLoaded(dict) do RequestNamedPtfxAsset(dict) Wait(5) end end end
function unloadPtfxDict(dict) if Config.Debug then print("^5Debug^7: ^2Removing Ptfx Dictionary^7: '^6"..dict.."^7'") end RemoveNamedPtfxAsset(dict) end
function lookEnt(entity)
if type(entity) == "vector3" then
if not IsPedHeadingTowardsPosition(PlayerPedId(), entity, 10.0) then
TaskTurnPedToFaceCoord(PlayerPedId(), entity, 1500)
if Config.Debug then print("^5Debug^7: ^2Turning Player to^7: '^6"..json.encode(entity).."^7'") end
Wait(1500)
end
else
if DoesEntityExist(entity) then
if not IsPedHeadingTowardsPosition(PlayerPedId(), GetEntityCoords(entity), 30.0) then
TaskTurnPedToFaceCoord(PlayerPedId(), GetEntityCoords(entity), 1500)
if Config.Debug then print("^5Debug^7: ^2Turning Player to^7: '^6"..entity.."^7'") end
Wait(1500)
end
end
end
end
function destroyProp(entity)
if Config.Debug then print("^5Debug^7: ^2Destroying Prop^7: '^6"..entity.."^7'") end
SetEntityAsMissionEntity(entity) Wait(5)
DetachEntity(entity, true, true) Wait(5)
DeleteObject(entity)
end
function makeProp(data, freeze, synced)
loadModel(data.prop)
local prop = CreateObject(data.prop, data.coords.x, data.coords.y, data.coords.z, synced or false, synced or false, 0)
SetEntityHeading(prop, data.coords.w+180.0)
FreezeEntityPosition(prop, freeze or 0)
if Config.Debug then print("^5Debug^7: ^6Prop ^2Created ^7: '^6"..prop.."^7'") end
return prop
end
function makePed(model, coords, freeze, collision, scenario, anim)
loadModel(model)
local ped = CreatePed(0, model, coords.x, coords.y, coords.z-1.03, coords.w, false, false)
SetEntityInvincible(ped, true)
SetBlockingOfNonTemporaryEvents(ped, true)
FreezeEntityPosition(ped, freeze or true)
if collision then SetEntityNoCollisionEntity(ped, PlayerPedId(), false) end
if scenario then TaskStartScenarioInPlace(ped, scenario, 0, true) end
if anim then
loadAnimDict(anim[1])
TaskPlayAnim(ped, anim[1], anim[2], 1.0, 1.0, -1, 1, 0.2, 0, 0, 0)
end
if Config.Debug then print("^5Debug^7: ^6Ped ^2Created for location^7: '^6"..model.."^7'") end
return ped
end
function makeBlip(data)
local blip = AddBlipForCoord(data.coords)
SetBlipAsShortRange(blip, true)
SetBlipSprite(blip, data.sprite or 1)
SetBlipColour(blip, data.col or 0)
SetBlipScale(blip, data.scale or 0.7)
SetBlipDisplay(blip, (data.disp or 6))
BeginTextCommandSetBlipName('STRING')
AddTextComponentString(tostring(data.name))
EndTextCommandSetBlipName(blip)
if Config.Debug then print("^5Debug^7: ^6Blip ^2created for location^7: '^6"..data.name.."^7'") end
return blip
end
function triggerNotify(title, message, type, src)
if Config.Notify == "okok" then
if not src then exports['okokNotify']:Alert(title, message, 6000, type or 'info')
else TriggerClientEvent('okokNotify:Alert', src, title, message, 6000, type or 'info') end
elseif Config.Notify == "qb" then
if not src then TriggerEvent("QBCore:Notify", message, "primary")
else TriggerClientEvent("QBCore:Notify", src, message, "primary") end
elseif Config.Notify == "t" then
if not src then exports['t-notify']:Custom({title = title, style = type, message = message, sound = true})
else TriggerClientEvent('t-notify:client:Custom', src, { style = type, duration = 6000, title = title, message = message, sound = true, custom = true}) end
elseif Config.Notify == "infinity" then
if not src then TriggerEvent('infinity-notify:sendNotify', message, type)
else TriggerClientEvent('infinity-notify:sendNotify', src, message, type) end
elseif Config.Notify == "rr" then
if not src then exports.rr_uilib:Notify({msg = message, type = type, style = "dark", duration = 6000, position = "top-right", })
else TriggerClientEvent("rr_uilib:Notify", src, {msg = message, type = type, style = "dark", duration = 6000, position = "top-right", }) end
end
end
function pairsByKeys(t)
local a = {}
for n in pairs(t) do a[#a+1] = n end
table.sort(a)
local i = 0
local iter = function() i += 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end
return iter
end
function countTable(table) local i = 0 for keys in pairs(table) do i += 1 end return i end
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
end
return formatted
end

1
version.txt Normal file
View File

@@ -0,0 +1 @@
3.0.01