Player Server
Server-side player functionality and exports for BJJ Racing Core v7
This page covers server-side player functionality for BJJ Racing Core v7. These functions handle player data management, money operations, permissions, and database interactions.
Core Access
Access the core system and player functions:
local Core = exports.bjj_racingcore:getCore()Player Management
Core.getPlayer(source)
Retrieve a player object by source ID.
local player = Core.getPlayer(source)Parameters:
source:number- Player's server ID
Returns: table|nil - Player object with methods, or nil if not found
Example:
local player = Core.getPlayer(source)
if player then
print('Player name:', player.data.name)
print('Player money:', player.data.money)
endCore.getPlayerData(source)
Get a copy of player data.
local playerData = Core.getPlayerData(source)Parameters:
source:number- Player's server ID
Returns: table|nil - Copy of player data including source field
Core.getPlayers()
Get all active player objects.
local players = Core.getPlayers()Returns: table - Array of all loaded player objects
Player Object Methods
Once you have a player object, you can use these methods:
Data Management
player.setData(key, value, autoSave)
Set a specific data field.
local success = player.setData('money', 5000, true)Parameters:
key:string- Data field namevalue:any- New valueautoSave:boolean- Whether to save to database immediately
Returns: boolean - Success status
player.getData(key)
Get a specific data field value.
local money = player.getData('money')
local name = player.getData('name')Parameters:
key:string- Data field name
Returns: any - Field value
Money Operations
player.addMoney(amount, autoSave)
Add money to player's balance.
local success = player.addMoney(1000, true)Parameters:
amount:number- Amount to addautoSave:boolean- Save to database immediately
Returns: boolean - Success status
player.removeMoney(amount, autoSave)
Remove money from player's balance.
local success = player.removeMoney(500, true)Parameters:
amount:number- Amount to removeautoSave:boolean- Save to database immediately
Returns: boolean - Success status (false if insufficient funds)
Crypto Operations
In the next version, crypto support is changing. Instead of a single integer value, players will have multiple cryptocurrency balances, each stored as a float. You can access and modify specific coins using new methods like player.getCrypto(coin), player.addCrypto(coin, amount, autoSave), and player.removeCrypto(coin, amount, autoSave).
player.addCrypto(amount, autoSave)
Add cryptocurrency to player's balance.
local success = player.addCrypto(10, true)player.removeCrypto(amount, autoSave)
Remove cryptocurrency from player's balance.
local success = player.removeCrypto(5, true)Metadata Management
player.setMetadata(key, value, autoSave)
Set metadata field.
local success = player.setMetadata('races_won', 15, true)Parameters:
key:string- Metadata keyvalue:any- Value to setautoSave:boolean- Save immediately
player.getMetadata(key, default)
Get metadata field with optional default.
local racesWon = player.getMetadata('races_won', 0)
local lastRace = player.getMetadata('last_race', 'None')Parameters:
key:string- Metadata keydefault:any- Default value if key doesn't exist
Returns: any - Metadata value or default
player.addMetadata(key, amount, autoSave)
Add numeric value to metadata field.
local success = player.addMetadata('races_won', 1, true)Group Management
player.hasGroup(group)
Check if player has a specific group.
local isAdmin = player.hasGroup('admin')
local isVip = player.hasGroup('vip')Parameters:
group:string- Group name
Returns: boolean - Has group
player.addGroup(group, autoSave)
Add group to player.
local success = player.addGroup('vip', true)player.removeGroup(group, autoSave)
Remove group from player.
local success = player.removeGroup('temporary_access', true)player.getGroups()
Get all player groups.
local groups = player.getGroups()
-- Returns: { admin = true, vip = true }Database Operations
player.save()
Save player data to database.
player.save()Returns: boolean - Success status
Player Events
Server Events
| Event | Parameters | Description |
|---|---|---|
bjj:server:playerLoaded | playerData: table | Player has loaded and data is ready |
bjj:server:playerUnloaded | source: number | Player is being unloaded |
Event Handlers
-- Player loaded event
AddEventHandler('bjj:server:playerLoaded', function(playerData)
local source = playerData.source
print('Player loaded:', playerData.name)
-- Your integration logic here
end)
-- Player dropping
AddEventHandler('playerDropped', function(reason)
local source = source
print('Player dropped:', source, reason)
end)Callbacks
bjj_racingcore:server:updatePlayerData
Update player data from client.
lib.callback.register('myresource:updatePlayerStats', function(source, data)
local player = Core.getPlayer(source)
if not player then return false end
-- Update metadata
for key, value in pairs(data) do
player.setMetadata(key, value, false)
end
player.save()
return true
end)Integration Example
-- Example: Race completion system
AddEventHandler('myrace:playerFinished', function(source, position, time)
local player = Core.getPlayer(source)
if not player then return end
-- Award money based on position
local prize = position == 1 and 5000 or position <= 3 and 2000 or 500
player.addMoney(prize, false)
-- Update racing statistics
player.addMetadata('total_races', 1, false)
if position == 1 then
player.addMetadata('races_won', 1, false)
end
player.setMetadata('best_time_track_' .. trackId, time, false)
-- Save all changes
player.save()
-- Notify player
TriggerClientEvent('bjj_racingcore:client:updatePlayerData', source, {
money = player.data.money,
metadata = player.data.metadata
})
end)Always use autoSave or call save() manually to persist changes to the database. The system automatically saves all players every 60 seconds.
Player objects are automatically cleaned up when players disconnect. Always check if a player object exists before using it.