FRAMEWORK

AUTO-DETECTION

ℹ️

The framework is auto-detected based on started resource. You can look at it bridge/**

If you wanna edit framework functions go to bridge/**/*.lua

CUSTOM CLIENT

If you wanna edit this functions you can do it. If you want to use custom frameworks, do similar logic in bridge/custom/client.lua using your framework functions

bridge/custom/client.lua
 
--- getting framework object
FRAMEWORK = exports['your_framework']['export_name']()
 
--- load script if player is loaded when script started
Citizen.CreateThread(function()
    if FRAMEWORK.IsPlayerLoaded() then
        OnPlayerLoad()
    end
end)
 
--- load player on load
RegisterNetEvent("yourFramework:onPlayerLoad", function()
    OnPlayerLoad()
end)
 
--- refresh job blips on playerData job change
AddEventHandler('yourFramework:onJobChange', function()
    RefreshJobBlips()
end)
 
--- checking if player can work, you can edit it how you want (for example disable job based logic)
---@return boolean
function CanWork()
    return FRAMEWORK.GetPlayerJob() == Config.JobName
end
 
--- change clothes logic
local lastClothes = nil
function ChangeClothes(work)
    if not Config.Clothes.enabled then return end
 
    if work then
        local gender = FRAMEWORK.GetPlayerGender() -- male or female
        local clothes = work and Config.Clothes[gender] or lastClothes
        if not clothes then return end
        lastClothes = FRAMEWORK.GetPlayerSkin()
        TriggerEvent('yourFramework:changeClothes', clothes)
    else
        TriggerEvent('yourFramework:changeClothes', lastClothes)
        lastClothes = nil
    end
end

CUSTOM SERVER

If you wanna edit this functions you can do it. If you want to use custom frameworks, do similar logic in bridge/custom/server.lua using your framework functions

bridge/custom/server.lua
 
--- getting framework object
FRAMEWORK = exports['your_framework']['export_name']()
 
---@class PlayerJob
---@field name string unique name of the job
---@field label string
 
---@class Player
---@field source number id of player
---@field playerName string character name
---@field identifier string unique identifier of player to using it in db
---@field job PlayerJob
---@field addMoney fun(amount: number) adding money after job complete
 
--- returning Player object from id
---@param playerId number
---@return Player | nil
function GetPlayerFromId(playerId)
    local frameworkPlayer = FRAMEWORK.GetPlayer(playerId)
    if not frameworkPlayer then return end
 
    ---@type Player
    local player = {
        source = playerId,
        identifier = frameworkPlayer.getCharacterUniqueId(),
        job = {
            name = frameworkPlayer.job.name,
            label = frameworkPlayer.job.label,
        },
        addMoney = function(amount)
            local method = Config.SalaryMethod
            if method == "cash" then
                ---@diagnostic disable-next-line
                method = "money"
            end
 
            frameworkPlayer.addMoney(method, amount)
        end,
        playerName = frameworkPlayer.firstname .. ' ' .. frameworkPlayer.lastname
    }
 
    return player
end
 
--- checking if player can work, you can edit it how you want (for example disable job based logic)
---@param player Player
---@return boolean
function CanPlayerWork(player)
    return player.job.name == Config.JobName
end
 
---@class RankingPlayer
---@field name string name of player
---@field xp number
---@field level number
 
--- getting top5 players
---@return RankingPlayer[] --max 5 elements
function GetRanking()
    local ranking = {}
    local result = GetRankingQuery()
    for i = 1, #result, 1 do
        local name = MySQL.scalar.await(
            'SELECT CONCAT(firstname, " ", lastname) FROM characters WHERE unique_id = ?',
            { result[i].identifier }
        )
        local level = GetJobTypeForXP(result[i].xp)
        table.insert(ranking, {
            name = name,
            level = level,
            xp = result[i].xp
        })
    end
 
    return ranking
end
 
MySQL.ready(function()
    if not FRAMEWORK.IsJobExisting(Config.JobName) then
        lib.print.error(string.format("`%s` job doesnt exists!! Add this job in your framework", Config.JobName))
    end
end)