Custom Framework - Server
Make sure to check the qb.lua
and esx.lua
files for examples on how to implement the phone for your framework. They are always up to date with the latest changes.
Framework check
At the top of the file, add a check for Config.Framework
. If it's not set to your framework, return to prevent it from loading.
if Config.Framework ~= "your-framework" then
return
end
Framework functions
You need to implement the following functions for the phone to work with your framework.
GetIdentifier
Get a player's identifier. If you use multicharacter, make sure to return the identifier of the current character.
---@param source number
---@return string | nil
function GetIdentifier(source)
-- This is an example from the lb-phone esx.lua file
return ESX.GetPlayerFromId(source)?.identifier
end
HasPhoneItem
Check if a player has the phone item in their inventory.
---@param source number
---@param number string
---@return boolean
function HasPhoneItem(source, number)
if not Config.Item.Require then
return true
end
if Config.Item.Unique then
-- HasPhoneNumber is a function defined in the unique phones file
return HasPhoneNumber(source, number)
end
-- Implement your own check here
return true
end
CreateUsableItem
Optional. Used to create a usable item for the phone. Callback the source that used the item.
---@param item string
---@param cb function
function CreateUsableItem(item, cb)
-- This is an example from the lb-phone esx.lua file
ESX.RegisterUsableItem(item, cb)
end
GetCharacterName
Get a player's character name.
---@param source number
---@return string firstname
---@return string lastname
function GetCharacterName(source)
-- This is an example from the lb-phone qb.lua file
local ch = QB.Functions.GetPlayer(source).PlayerData.charinfo
return ch.firstname, ch.lastname
end
GetBalance
Get the bank balance of a player
---@param source any
---@return integer
function GetBalance(source)
return 0
end
AddMoney
Add money to a player's bank account
---@param source any
---@param amount integer
---@return boolean success
function AddMoney(source, amount)
return true
end
AddMoneyOffline
Add money to a player's bank account via their identifier
---@param identifier string
---@param amount number
---@return boolean
function AddMoneyOffline(identifier, amount)
if amount <= 0 then
return false
end
amount = math.floor(amount + 0.5)
return MySQL.update.await("UPDATE users SET accounts = JSON_SET(accounts, '$.bank', JSON_EXTRACT(accounts, '$.bank') + ?) WHERE identifier = ?", { amount, identifier }) > 0
end
RemoveMoney
Remove money from a player's bank account
---@param source any
---@param amount integer
---@return boolean success
function RemoveMoney(source, amount)
return true
end
GetPlayerVehicles
Get a list of a player's vehicles
---@param source number
---@return VehicleData[] vehicles An array of vehicles that the player owns
function GetPlayerVehicles(source)
return {}
end
VehicleData:
- plate:
string
- type:
"car" | "boat" | "plane" | "bike" | "truck"
- location:
string
- The location of the vehicle (garage name), set to "out" if the vehicle is out - model:
number
- The vehicle model - statistics?:
VehicleStatistics
- engine?:
number
- The engine health, 0-100 - body?:
number
- The body health, 0-100 - fuel?:
number
- The fuel level, 0-100
- engine?:
- impounded:
boolean
- Whether the vehicle is impounded or not - impoundReason? - optional
- reason?:
string
- retrievable?:
string
- price?:
number
- impounder?:
string
- The name of the person that impounded the vehicle
- reason?:
GetVehicle
Get a player's vehicle by plate
---@param source number
---@param plate string
---@return Vehicle?
function GetVehicle(source, plate)
return {}
end
Vehicle:
- model:
number
- The vehicle model - any other data you want (this will be sent to
CreateFrameworkVehicle
&ApplyVehicleMods
)
IsAdmin
Check if a player is admin, this will allow them to delete posts etc.
---@param source number
function IsAdmin(source)
return IsPlayerAceAllowed(source, "command.lbphone_admin") == 1
end
GetJob
Get the player's job
---@param source number
---@return string job
function GetJob(source)
-- This is an example from the lb-phone qb.lua file
return QB.Functions.GetPlayer(source)?.PlayerData.job.name or "unemployed"
end
GetEmployees
Get an array of player sources with a specific job
---@param job string
---@return number[] employees
function GetEmployees(job)
-- This is an example from the lb-phone qb.lua file
local employees = {}
local players = QB.Functions.GetQBPlayers()
for _, v in pairs(players) do
if v?.PlayerData.job.name == job and v.PlayerData.job.onduty then
employees[#employees+1] = v.PlayerData.source
end
end
return employees
end
GetAllEmployees
Get all employees (even offline) with a specific job
---@param job string
---@return { firstname: string, lastname: string, grade: string, number: string }[] employees
function GetAllEmployees(job)
-- This is an example from the lb-phone esx.lua file
local numberTable = Config.Item.Unique and "phone_last_phone" or "phone_phones"
return MySQL.query.await(([[
SELECT
u.firstname, u.lastname,
u.job_grade AS grade,
p.phone_number AS `number`,
j.label AS gradeLabel
FROM users u
LEFT JOIN %s p ON u.identifier = p.id COLLATE UTF8MB4_GENERAL_CI
JOIN job_grades j ON u.job = j.job_name AND u.job_grade = j.grade
WHERE u.job = ?
]]):format(numberTable), { job })
end
RefreshCompanies
Refresh Config.Companies.Services
to show if they are open or not
function RefreshCompanies()
for i = 1, #Config.Companies.Services do
local jobData = Config.Companies.Services[i]
-- implement your own check here
jobData.open = true
end
end