cl_utils.lua

CORE = exports["ak4y-core"]
Framework = nil
loadEvent = "QBCore:Client:OnPlayerLoaded"

CreateThread(function()
    if not Framework then
        if GetResourceState("qbx_core") == "started" then
            Framework = "qb"
        elseif GetResourceState("es_extended") == "started" then
            Framework = "esx"
        elseif GetResourceState("qb-core") == "started" then 
            Framework = "qb"
        end
    end
end)

CreateThread(function()
    if Framework == "qb" then
        loadEvent = "QBCore:Client:OnPlayerLoaded"
    elseif Framework == "esx" then
        loadEvent = 'esx:playerLoaded'
    elseif Framework == "oldEsx" then
        loadEvent = 'esx:playerLoaded'
    end

    RegisterNetEvent(loadEvent, function()
        
    end)
end)

if Framework == "esx" then
    RegisterNetEvent('esx:playerLoaded')
    AddEventHandler('esx:playerLoaded', function(playerData, isNew, skin)
        local spawn = playerData.coords or Config.DefaultSpawn
        
        if isNew or not skin or (type(skin) == "table" and #skin == 1) then
            if playerData.sex ~= nil then 
                if skin and type(skin) == "table" then
                    skin.sex = playerData.sex == "m" and 0 or 1
                end
            end
            local model = (skin and skin.sex == 0) and "mp_m_freemode_01" or "mp_f_freemode_01"
            RequestModel(model)
            SetPlayerModel(PlayerId(), model)
            SetModelAsNoLongerNeeded(model)
            if GetResourceState('skinchanger') == 'started' then
                TriggerEvent('skinchanger:loadSkin', skin, function()
                    local playerPed = PlayerPedId()
                    SetPedAoBlobRendering(playerPed, true)
                    ResetEntityAlpha(playerPed)
                    if GetResourceState('esx_skin') == 'started' then
                        TriggerEvent('esx_skin:openSaveableMenu')
                    end
                end)
            end
        end
        
        local playerPed = PlayerPedId()
        FreezeEntityPosition(playerPed, true)
        SetEntityCoordsNoOffset(playerPed, spawn.x, spawn.y, spawn.z, false, false, false, true)
        if spawn.heading then
            SetEntityHeading(playerPed, spawn.heading)
        end
        
        if not isNew and skin and GetResourceState('skinchanger') == 'started' then
            TriggerEvent('skinchanger:loadSkin', skin)
        end
        
        Config.PlayerLoadedESX(isNew)
        TriggerServerEvent('esx:onPlayerSpawn')
        TriggerEvent('esx:onPlayerSpawn')
        TriggerEvent('playerSpawned')
        TriggerEvent('esx:restoreLoadout')
    end)
end

function ClothingExports(skinData)
    if GetResourceState('rcore_clothing') == 'started' then
        exports.rcore_clothing:setPedSkin(PlayerPedId(), skinData)
    elseif GetResourceState('crm-appearance') == 'started' then
        exports['crm-appearance']:crm_set_ped_appearance(PlayerPedId(), skinData)
    elseif GetResourceState('bl_appearance') == 'started' then
        TriggerEvent('skinchanger:loadSkin', skinData)
    elseif GetResourceState('illenium-appearance') == 'started' then
        exports['illenium-appearance']:setPlayerAppearance(skinData)
    elseif GetResourceState('fivem-appearance') == 'started' then
        exports['fivem-appearance']:setPlayerAppearance(skinData)
    elseif GetResourceState('skinchanger') == 'started' then
        TriggerEvent('skinchanger:loadSkin', skinData)
    else
        print('You can add your own clothing exports here.')
    end
end



function SetPedSkin(cacheped, skinData)
    if GetResourceState('rcore_clothing') == 'started' then
        exports.rcore_clothing:setPedSkin(cacheped, skinData)
    elseif GetResourceState('crm-appearance') == 'started' then
        exports['crm-appearance']:crm_set_ped_appearance(cacheped, skinData)
    elseif GetResourceState('bl_appearance') == 'started' then
        TriggerEvent('skinchanger:loadSkin', skinData)
    elseif GetResourceState('illenium-appearance') == 'started' then
        exports['illenium-appearance']:setPedAppearance(cacheped, skinData)
    elseif GetResourceState('fivem-appearance') == 'started' then
        exports['fivem-appearance']:setPedAppearance(cacheped, skinData)
    elseif GetResourceState('skinchanger') == 'started' then
    else
        print('You can add your own clothing exports here.')
    end
end

function SetSkin(cid)
    local skindata = CORE:Trigger('ak4y-multicharacter-v3:GetSkinData', cid)
    
    if Framework == "esx" then
        if skindata then
            if type(skindata) == "string" then
                skindata = json.decode(skindata)
            end
            
            if skindata and skindata.model then
                local modelHash = joaat(skindata.model)
                RequestModel(modelHash)
                while not HasModelLoaded(modelHash) do
                    Wait(50)
                end
                SetPlayerModel(PlayerId(), modelHash)

                SetPedHeadBlendData(PlayerPedId(), 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, false)

                if skindata.model == "mp_m_freemode_01" or skindata.model == "mp_f_freemode_01" then
                    if GetResourceState('skinchanger') == 'started' then
                        TriggerEvent('skinchanger:loadSkin', skindata)
                    end
                end
            else
                -- If no model, check sex and create default model
                if skindata and (skindata.sex == 0 or skindata.sex == 1) then
                    local model = (skindata.sex == 0) and "mp_m_freemode_01" or "mp_f_freemode_01"
                    skindata.model = model
                    local modelHash = joaat(model)
                    RequestModel(modelHash)
                    while not HasModelLoaded(modelHash) do
                        Wait(50)
                    end
                    SetPlayerModel(PlayerId(), modelHash)

                    SetPedHeadBlendData(PlayerPedId(), 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, false)

                    if GetResourceState('skinchanger') == 'started' then
                        TriggerEvent('skinchanger:loadSkin', skindata)
                    end
                else
                    print("^3[WARN]^7 No skin data or sex info for character: " .. tostring(cid))
                end
            end
        else
            print("^1[ERROR]^7 Skin data not found for character: " .. tostring(cid))
        end
    -- QB skin loading
    elseif Framework == "qb" then
        skindata = skindata[1]
        if skindata then
            if skindata.model then
                local modelHash = joaat(skindata.model)
                RequestModel(modelHash)
                while not HasModelLoaded(modelHash) do
                    Wait(50)
                end
                SetPlayerModel(PlayerId(), modelHash)

                SetPedHeadBlendData(PlayerPedId(), 0, 0, 0, 0, 0, 0, 1.0, 1.0, 1.0, false)

                if skindata.model == "mp_m_freemode_01" or skindata.model == "mp_f_freemode_01" then
                    if skindata.skin then
                        exports['illenium-appearance']:setPlayerAppearance(json.decode(skindata.skin))
                    end
                end
            end
        else
            print("Skin data not found: " .. tostring(cid))
        end
    end
end

Last updated