How to Create Money as Item in QBCore
Learn how to create physical money items that players can drop, trade, and pick up in your QBCore server.
Overview
In QBCore, you can create physical money items that act like regular inventory items. This allows players to drop cash, trade it with others, and creates more immersive roleplay opportunities.
Prerequisites
- QBCore Framework installed
- Access to server files
- Basic understanding of Lua scripting
- QB-Inventory system
Step 1: Configure Money Items
First, you need to add money items to your shared items configuration.
Edit qb-core/shared/items.lua
Add these money items to your items list:
-- Money Items
['cash'] = {
name = 'cash',
label = 'Cash',
weight = 0,
type = 'item',
image = 'cash.png',
unique = false,
useable = false,
shouldClose = false,
combinable = nil,
description = 'Paper money'
},
['markedbills'] = {
name = 'markedbills',
label = 'Marked Bills',
weight = 1000,
type = 'item',
image = 'markedbills.png',
unique = true,
useable = false,
shouldClose = false,
combinable = nil,
description = 'Money with serial numbers'
},
['dirtymoney'] = {
name = 'dirtymoney',
label = 'Dirty Money',
weight = 1000,
type = 'item',
image = 'dirtymoney.png',
unique = true,
useable = false,
shouldClose = false,
combinable = nil,
description = 'Illegally obtained money'
}
Step 2: Create Money Conversion Functions
Server-Side Functions (qb-core/server/functions.lua)
Add functions to convert between cash and money items:
-- Convert cash to item
QBCore.Functions.ConvertCashToItem = function(source, amount)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return false end
if Player.PlayerData.money.cash >= amount then
Player.Functions.RemoveMoney('cash', amount)
Player.Functions.AddItem('cash', amount)
return true
end
return false
end
-- Convert item to cash
QBCore.Functions.ConvertItemToCash = function(source, amount)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return false end
local cashItem = Player.Functions.GetItemByName('cash')
if cashItem and cashItem.amount >= amount then
Player.Functions.RemoveItem('cash', amount)
Player.Functions.AddMoney('cash', amount)
return true
end
return false
end
Step 3: Create Useable Items
Make Cash Items Useable
Add to qb-core/server/main.lua or create a separate resource:
-- Use cash item to convert to money
QBCore.Functions.CreateUseableItem('cash', function(source, item)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
local amount = item.amount or 1
Player.Functions.RemoveItem('cash', amount)
Player.Functions.AddMoney('cash', amount)
TriggerClientEvent('QBCore:Notify', source, 'You deposited $' .. amount .. ' to your wallet', 'success')
end)
-- Use dirty money (requires laundering)
QBCore.Functions.CreateUseableItem('dirtymoney', function(source, item)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
TriggerClientEvent('QBCore:Notify', source, 'This money needs to be laundered first', 'error')
end)
Step 4: Create Admin Commands
Money Management Commands
Add these commands for server administration:
-- Give cash item to player
QBCore.Commands.Add('givecash', 'Give cash item to player (Admin Only)', {{name = 'id', help = 'Player ID'}, {name = 'amount', help = 'Amount of cash'}}, true, function(source, args)
local Player = QBCore.Functions.GetPlayer(tonumber(args[1]))
local amount = tonumber(args[2])
if Player and amount and amount > 0 then
Player.Functions.AddItem('cash', amount)
TriggerClientEvent('QBCore:Notify', source, 'Gave $' .. amount .. ' cash to ' .. Player.PlayerData.charinfo.firstname, 'success')
TriggerClientEvent('QBCore:Notify', Player.PlayerData.source, 'You received $' .. amount .. ' in cash', 'success')
end
end, 'admin')
-- Convert all cash to items
QBCore.Commands.Add('cashtoitem', 'Convert wallet cash to items', {}, false, function(source, args)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
local cashAmount = Player.PlayerData.money.cash
if cashAmount > 0 then
if QBCore.Functions.ConvertCashToItem(source, cashAmount) then
TriggerClientEvent('QBCore:Notify', source, 'Converted $' .. cashAmount .. ' to cash items', 'success')
else
TriggerClientEvent('QBCore:Notify', source, 'Failed to convert cash', 'error')
end
else
TriggerClientEvent('QBCore:Notify', source, 'You have no cash to convert', 'error')
end
end)
Step 5: Inventory Integration
Configure QB-Inventory
Ensure your inventory system can handle these items properly:
-- In qb-inventory/config.lua
Config.ItemDrops = true -- Allow dropping items
Config.PickupKey = 38 -- E key to pickup items
-- Add to weapon drops or item specific configs if needed
Config.MaxDroppedCash = 100000 -- Maximum cash that can be dropped at once
Step 6: Add Images
Create Item Images
-
Create or download appropriate images:
cash.png
- Regular money iconmarkedbills.png
- Marked bills icondirtymoney.png
- Dirty money icon
-
Place them in your inventory resource’s images folder:
qb-inventory/html/images/ ├── cash.png ├── markedbills.png └── dirtymoney.png
Step 7: Money Laundering System (Optional)
Create a Simple Laundering Script
-- Money laundering location
local launderingLocation = vector3(1138.0, -3199.0, -39.0) -- Example coords
-- Client-side proximity check
CreateThread(function()
while true do
local ped = PlayerPedId()
local pos = GetEntityCoords(ped)
local distance = #(pos - launderingLocation)
if distance < 3.0 then
QBCore.Functions.DrawText3D(launderingLocation.x, launderingLocation.y, launderingLocation.z, '[E] Launder Money')
if IsControlJustPressed(0, 38) then -- E key
TriggerServerEvent('qb-money:server:launderMoney')
end
end
Wait(1000)
end
end)
-- Server-side laundering
RegisterNetEvent('qb-money:server:launderMoney', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local dirtyMoney = Player.Functions.GetItemByName('dirtymoney')
if dirtyMoney then
local amount = dirtyMoney.amount
local launderedAmount = math.floor(amount * 0.75) -- 25% fee
Player.Functions.RemoveItem('dirtymoney', amount)
Player.Functions.AddItem('cash', launderedAmount)
TriggerClientEvent('QBCore:Notify', src, 'Laundered $' .. amount .. ' for $' .. launderedAmount, 'success')
else
TriggerClientEvent('QBCore:Notify', src, 'You have no dirty money to launder', 'error')
end
end)
Step 8: Testing
Test Your Implementation
-
Give yourself cash items:
/givecash [your_id] 1000
-
Test dropping and picking up:
- Open inventory and drag cash to drop
- Walk over dropped cash and press E to pick up
-
Test conversion:
- Use
/cashtoitem
command - Right-click cash items in inventory to use them
- Use
-
Test trading:
- Give cash items to other players
- Verify they can use the items
Advanced Features
Track Money Serial Numbers
-- Add metadata to track money origin
local function CreateTrackedMoney(source, amount, origin)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
local metadata = {
serial = QBCore.Shared.RandomStr(8),
origin = origin,
timestamp = os.time()
}
Player.Functions.AddItem('markedbills', amount, false, metadata)
end
-- Usage example
CreateTrackedMoney(source, 5000, 'bank_robbery')
Anti-Duplication Measures
-- Prevent money duplication exploits
local moneyTransactions = {}
RegisterNetEvent('qb-money:server:secureTransfer', function(targetId, amount)
local src = source
local transactionId = src .. '_' .. os.time()
if moneyTransactions[transactionId] then
return -- Prevent duplicate transactions
end
moneyTransactions[transactionId] = true
-- Your transfer logic here
-- Clean up old transactions
SetTimeout(60000, function()
moneyTransactions[transactionId] = nil
end)
end)
Troubleshooting
Common Issues
Items not showing in inventory:
- Check if item images exist
- Verify items are properly added to shared/items.lua
- Restart qb-core and inventory resources
Can’t drop items:
- Ensure
Config.ItemDrops = true
in inventory config - Check weight limits in inventory system
- Verify player has permission to drop items
Items not useable:
- Make sure
QBCore.Functions.CreateUseableItem
is registered - Check for script errors in console
- Verify item names match exactly
Best Practices
- Always validate inputs - Check amounts and player data
- Use metadata - Track item origins for security
- Implement limits - Prevent excessive cash items
- Log transactions - Keep records for admin purposes
- Test thoroughly - Verify all functionality before deploying
Conclusion
Creating money as items in QBCore adds depth to your roleplay server by making cash physical and tradeable. Players can now drop money during robberies, trade cash directly, and engage in more realistic financial interactions.
Remember to regularly backup your server before implementing these changes, and always test on a development server first.
Need more help? Join our GitHub discussions or check out more QBCore tutorials.