756 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			756 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local client = client
 | 
						|
local reloadSkinTimer = GetGameTimer()
 | 
						|
 | 
						|
local function LoadPlayerUniform(reset)
 | 
						|
    if reset then
 | 
						|
        TriggerServerEvent("illenium-appearance:server:syncUniform", nil)
 | 
						|
        return
 | 
						|
    end
 | 
						|
    lib.callback("illenium-appearance:server:getUniform", false, function(uniformData)
 | 
						|
        if not uniformData then
 | 
						|
            return
 | 
						|
        end
 | 
						|
        if Config.BossManagedOutfits then
 | 
						|
            local result = lib.callback.await("illenium-appearance:server:getManagementOutfits", false, uniformData.type, Framework.GetGender())
 | 
						|
            local uniform = nil
 | 
						|
            for i = 1, #result, 1 do
 | 
						|
                if result[i].name == uniformData.name then
 | 
						|
                    uniform = {
 | 
						|
                        type = uniformData.type,
 | 
						|
                        name = result[i].name,
 | 
						|
                        model = result[i].model,
 | 
						|
                        components = result[i].components,
 | 
						|
                        props = result[i].props,
 | 
						|
                        disableSave = true,
 | 
						|
                    }
 | 
						|
                    break
 | 
						|
                end
 | 
						|
            end
 | 
						|
 | 
						|
            if not uniform then
 | 
						|
                TriggerServerEvent("illenium-appearance:server:syncUniform", nil) -- Uniform doesn't exist anymore
 | 
						|
                return
 | 
						|
            end
 | 
						|
 | 
						|
            TriggerEvent("illenium-appearance:client:changeOutfit", uniform)
 | 
						|
        else
 | 
						|
            local outfits = Config.Outfits[uniformData.jobName][uniformData.gender]
 | 
						|
            local uniform = nil
 | 
						|
            for i = 1, #outfits, 1 do
 | 
						|
                if outfits[i].name == uniformData.label then
 | 
						|
                    uniform = outfits[i]
 | 
						|
                    break
 | 
						|
                end
 | 
						|
            end
 | 
						|
 | 
						|
            if not uniform then
 | 
						|
                TriggerServerEvent("illenium-appearance:server:syncUniform", nil) -- Uniform doesn't exist anymore
 | 
						|
                return
 | 
						|
            end
 | 
						|
 | 
						|
            uniform.jobName = uniformData.jobName
 | 
						|
            uniform.gender = uniformData.gender
 | 
						|
 | 
						|
            TriggerEvent("illenium-appearance:client:loadJobOutfit", uniform)
 | 
						|
        end
 | 
						|
    end)
 | 
						|
end
 | 
						|
 | 
						|
function InitAppearance()
 | 
						|
    Framework.UpdatePlayerData()
 | 
						|
    lib.callback("illenium-appearance:server:getAppearance", false, function(appearance)
 | 
						|
        if not appearance then
 | 
						|
            return
 | 
						|
        end
 | 
						|
 | 
						|
        client.setPlayerAppearance(appearance)
 | 
						|
        if Config.PersistUniforms then
 | 
						|
            LoadPlayerUniform()
 | 
						|
        end
 | 
						|
    end)
 | 
						|
    ResetBlips()
 | 
						|
    if Config.BossManagedOutfits then
 | 
						|
        Management.AddItems()
 | 
						|
    end
 | 
						|
    RestorePlayerStats()
 | 
						|
end
 | 
						|
 | 
						|
AddEventHandler("onResourceStart", function(resource)
 | 
						|
    if resource == GetCurrentResourceName() then
 | 
						|
        InitAppearance()
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
local function getNewCharacterConfig()
 | 
						|
    local config = GetDefaultConfig()
 | 
						|
    config.enableExit   = false
 | 
						|
 | 
						|
    config.ped          = Config.NewCharacterSections.Ped
 | 
						|
    config.headBlend    = Config.NewCharacterSections.HeadBlend
 | 
						|
    config.faceFeatures = Config.NewCharacterSections.FaceFeatures
 | 
						|
    config.headOverlays = Config.NewCharacterSections.HeadOverlays
 | 
						|
    config.components   = Config.NewCharacterSections.Components
 | 
						|
    config.props        = Config.NewCharacterSections.Props
 | 
						|
    config.tattoos      = not Config.RCoreTattoosCompatibility and Config.NewCharacterSections.Tattoos
 | 
						|
 | 
						|
    return config
 | 
						|
end
 | 
						|
 | 
						|
function SetInitialClothes(initial)
 | 
						|
    client.setPlayerModel(initial.Model)
 | 
						|
    -- Fix for tattoo's appearing when creating a new character
 | 
						|
    local ped = cache.ped
 | 
						|
    client.setPedTattoos(ped, {})
 | 
						|
    client.setPedComponents(ped, initial.Components)
 | 
						|
    client.setPedProps(ped, initial.Props)
 | 
						|
    client.setPedHair(ped, initial.Hair, {})
 | 
						|
    ClearPedDecorations(ped)
 | 
						|
end
 | 
						|
 | 
						|
function InitializeCharacter(gender, onSubmit, onCancel)
 | 
						|
    SetInitialClothes(Config.InitialPlayerClothes[gender])
 | 
						|
    local config = getNewCharacterConfig()
 | 
						|
    TriggerServerEvent("illenium-appearance:server:ChangeRoutingBucket")
 | 
						|
    client.startPlayerCustomization(function(appearance)
 | 
						|
        if (appearance) then
 | 
						|
            TriggerServerEvent("illenium-appearance:server:saveAppearance", appearance)
 | 
						|
            if onSubmit then
 | 
						|
                onSubmit()
 | 
						|
            end
 | 
						|
        elseif onCancel then
 | 
						|
            onCancel()
 | 
						|
        end
 | 
						|
        Framework.CachePed()
 | 
						|
        TriggerServerEvent("illenium-appearance:server:ResetRoutingBucket")
 | 
						|
    end, config)
 | 
						|
end
 | 
						|
 | 
						|
function OpenShop(config, isPedMenu, shopType)
 | 
						|
    lib.callback("illenium-appearance:server:hasMoney", false, function(hasMoney, money)
 | 
						|
        if not hasMoney and not isPedMenu then
 | 
						|
            lib.notify({
 | 
						|
                title = "Cannot Enter Shop",
 | 
						|
                description = "Not enough cash. Need $" .. money,
 | 
						|
                type = "error",
 | 
						|
                position = Config.NotifyOptions.position
 | 
						|
            })
 | 
						|
            return
 | 
						|
        end
 | 
						|
 | 
						|
        client.startPlayerCustomization(function(appearance)
 | 
						|
            if appearance then
 | 
						|
                if not isPedMenu then
 | 
						|
                    TriggerServerEvent("illenium-appearance:server:chargeCustomer", shopType)
 | 
						|
                end
 | 
						|
                TriggerServerEvent("illenium-appearance:server:saveAppearance", appearance)
 | 
						|
            else
 | 
						|
                lib.notify({
 | 
						|
                    title = _L("cancelled.title"),
 | 
						|
                    description = _L("cancelled.description"),
 | 
						|
                    type = "inform",
 | 
						|
                    position = Config.NotifyOptions.position
 | 
						|
                })
 | 
						|
            end
 | 
						|
            Framework.CachePed()
 | 
						|
        end, config)
 | 
						|
    end, shopType)
 | 
						|
end
 | 
						|
 | 
						|
local function OpenClothingShop(isPedMenu)
 | 
						|
    local config = GetDefaultConfig()
 | 
						|
    config.components = true
 | 
						|
    config.props = true
 | 
						|
 | 
						|
    if isPedMenu then
 | 
						|
        config.ped = true
 | 
						|
        config.headBlend = true
 | 
						|
        config.faceFeatures = true
 | 
						|
        config.headOverlays = true
 | 
						|
        config.tattoos = not Config.RCoreTattoosCompatibility and true
 | 
						|
    end
 | 
						|
    OpenShop(config, isPedMenu, "clothing")
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:openClothingShop", OpenClothingShop)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:importOutfitCode", function()
 | 
						|
    local response = lib.inputDialog(_L("outfits.import.title"), {
 | 
						|
        {
 | 
						|
            type = "input",
 | 
						|
            label = _L("outfits.import.name.label"),
 | 
						|
            placeholder = _L("outfits.import.name.placeholder"),
 | 
						|
            default = _L("outfits.import.name.default"),
 | 
						|
            required = true
 | 
						|
        },
 | 
						|
        {
 | 
						|
            type = "input",
 | 
						|
            label = _L("outfits.import.code.label"),
 | 
						|
            placeholder = "XXXXXXXXXXXX",
 | 
						|
            required = true
 | 
						|
        }
 | 
						|
    })
 | 
						|
 | 
						|
    if not response then
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    local outfitName = response[1]
 | 
						|
    local outfitCode = response[2]
 | 
						|
    if outfitCode ~= nil then
 | 
						|
        Wait(500)
 | 
						|
        lib.callback("illenium-appearance:server:importOutfitCode", false, function(success)
 | 
						|
            if success then
 | 
						|
                lib.notify({
 | 
						|
                    title = _L("outfits.import.success.title"),
 | 
						|
                    description = _L("outfits.import.success.description"),
 | 
						|
                    type = "success",
 | 
						|
                    position = Config.NotifyOptions.position
 | 
						|
                })
 | 
						|
            else
 | 
						|
                lib.notify({
 | 
						|
                    title = _L("outfits.import.failure.title"),
 | 
						|
                    description = _L("outfits.import.failure.description"),
 | 
						|
                    type = "error",
 | 
						|
                    position = Config.NotifyOptions.position
 | 
						|
                })
 | 
						|
            end
 | 
						|
        end, outfitName, outfitCode)
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:generateOutfitCode", function(id)
 | 
						|
    lib.callback("illenium-appearance:server:generateOutfitCode", false, function(code)
 | 
						|
        if not code then
 | 
						|
            lib.notify({
 | 
						|
                title = _L("outfits.generate.failure.title"),
 | 
						|
                description = _L("outfits.generate.failure.description"),
 | 
						|
                type = "error",
 | 
						|
                position = Config.NotifyOptions.position
 | 
						|
            })
 | 
						|
            return
 | 
						|
        end
 | 
						|
        lib.setClipboard(code)
 | 
						|
        lib.inputDialog(_L("outfits.generate.success.title"), {
 | 
						|
            {
 | 
						|
                type = "input",
 | 
						|
                label = _L("outfits.generate.success.description"),
 | 
						|
                default = code,
 | 
						|
                disabled = true
 | 
						|
            }
 | 
						|
        })
 | 
						|
    end, id)
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:saveOutfit", function()
 | 
						|
    local response = lib.inputDialog(_L("outfits.save.title"), {
 | 
						|
        {
 | 
						|
            type = "input",
 | 
						|
            label = _L("outfits.save.name.label"),
 | 
						|
            placeholder = _L("outfits.save.name.placeholder"),
 | 
						|
            required = true
 | 
						|
        }
 | 
						|
    })
 | 
						|
 | 
						|
    if not response then
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    local outfitName = response[1]
 | 
						|
    if outfitName then
 | 
						|
        Wait(500)
 | 
						|
        lib.callback("illenium-appearance:server:getOutfits", false, function(outfits)
 | 
						|
            local outfitExists = false
 | 
						|
            for i = 1, #outfits, 1 do
 | 
						|
                if outfits[i].name:lower() == outfitName:lower() then
 | 
						|
                    outfitExists = true
 | 
						|
                    break
 | 
						|
                end
 | 
						|
            end
 | 
						|
 | 
						|
            if outfitExists then
 | 
						|
                lib.notify({
 | 
						|
                    title = _L("outfits.save.failure.title"),
 | 
						|
                    description = _L("outfits.save.failure.description"),
 | 
						|
                    type = "error",
 | 
						|
                    position = Config.NotifyOptions.position
 | 
						|
                })
 | 
						|
                return
 | 
						|
            end
 | 
						|
 | 
						|
            local pedModel = client.getPedModel(cache.ped)
 | 
						|
            local pedComponents = client.getPedComponents(cache.ped)
 | 
						|
            local pedProps = client.getPedProps(cache.ped)
 | 
						|
 | 
						|
            TriggerServerEvent("illenium-appearance:server:saveOutfit", outfitName, pedModel, pedComponents, pedProps)
 | 
						|
        end)
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent('illenium-appearance:client:updateOutfit', function(outfitID)
 | 
						|
    if not outfitID then return end
 | 
						|
 | 
						|
    lib.callback("illenium-appearance:server:getOutfits", false, function(outfits)
 | 
						|
        local outfitExists = false
 | 
						|
        for i = 1, #outfits, 1 do
 | 
						|
            if outfits[i].id == outfitID then
 | 
						|
                outfitExists = true
 | 
						|
                break
 | 
						|
            end
 | 
						|
        end
 | 
						|
 | 
						|
        if not outfitExists then
 | 
						|
            lib.notify({
 | 
						|
                title = _L("outfits.update.failure.title"),
 | 
						|
                description = _L("outfits.update.failure.description"),
 | 
						|
                type = "error",
 | 
						|
                position = Config.NotifyOptions.position
 | 
						|
            })
 | 
						|
            return
 | 
						|
        end
 | 
						|
 | 
						|
        local pedModel = client.getPedModel(cache.ped)
 | 
						|
        local pedComponents = client.getPedComponents(cache.ped)
 | 
						|
        local pedProps = client.getPedProps(cache.ped)
 | 
						|
 | 
						|
        TriggerServerEvent("illenium-appearance:server:updateOutfit", outfitID, pedModel, pedComponents, pedProps)
 | 
						|
    end)
 | 
						|
end)
 | 
						|
 | 
						|
local function RegisterChangeOutfitMenu(id, parent, outfits, mType)
 | 
						|
    local changeOutfitMenu = {
 | 
						|
        id = id,
 | 
						|
        title = _L("outfits.change.title"),
 | 
						|
        menu = parent,
 | 
						|
        options = {}
 | 
						|
    }
 | 
						|
    for i = 1, #outfits, 1 do
 | 
						|
        changeOutfitMenu.options[#changeOutfitMenu.options + 1] = {
 | 
						|
            title = outfits[i].name,
 | 
						|
            description = outfits[i].model,
 | 
						|
            event = "illenium-appearance:client:changeOutfit",
 | 
						|
            args = {
 | 
						|
                type = mType,
 | 
						|
                name = outfits[i].name,
 | 
						|
                model = outfits[i].model,
 | 
						|
                components = outfits[i].components,
 | 
						|
                props = outfits[i].props,
 | 
						|
                disableSave = mType and true or false
 | 
						|
            }
 | 
						|
        }
 | 
						|
    end
 | 
						|
 | 
						|
    table.sort(changeOutfitMenu.options, function(a, b)
 | 
						|
        return a.title < b.title
 | 
						|
    end)
 | 
						|
 | 
						|
    lib.registerContext(changeOutfitMenu)
 | 
						|
end
 | 
						|
 | 
						|
local function RegisterUpdateOutfitMenu(id, parent, outfits)
 | 
						|
    local updateOutfitMenu = {
 | 
						|
        id = id,
 | 
						|
        title = _L("outfits.update.title"),
 | 
						|
        menu = parent,
 | 
						|
        options = {}
 | 
						|
    }
 | 
						|
    for i = 1, #outfits, 1 do
 | 
						|
        updateOutfitMenu.options[#updateOutfitMenu.options + 1] = {
 | 
						|
            title = outfits[i].name,
 | 
						|
            description = outfits[i].model,
 | 
						|
            event = "illenium-appearance:client:updateOutfit",
 | 
						|
            args = outfits[i].id
 | 
						|
        }
 | 
						|
    end
 | 
						|
 | 
						|
    table.sort(updateOutfitMenu.options, function(a, b)
 | 
						|
        return a.title < b.title
 | 
						|
    end)
 | 
						|
 | 
						|
    lib.registerContext(updateOutfitMenu)
 | 
						|
end
 | 
						|
 | 
						|
local function RegisterGenerateOutfitCodeMenu(id, parent, outfits)
 | 
						|
    local generateOutfitCodeMenu = {
 | 
						|
        id = id,
 | 
						|
        title = _L("outfits.generate.title"),
 | 
						|
        menu = parent,
 | 
						|
        options = {}
 | 
						|
    }
 | 
						|
    for i = 1, #outfits, 1 do
 | 
						|
        generateOutfitCodeMenu.options[#generateOutfitCodeMenu.options + 1] = {
 | 
						|
            title = outfits[i].name,
 | 
						|
            description = outfits[i].model,
 | 
						|
            event = "illenium-appearance:client:generateOutfitCode",
 | 
						|
            args = outfits[i].id
 | 
						|
        }
 | 
						|
    end
 | 
						|
 | 
						|
    lib.registerContext(generateOutfitCodeMenu)
 | 
						|
end
 | 
						|
 | 
						|
local function RegisterDeleteOutfitMenu(id, parent, outfits, deleteEvent)
 | 
						|
    local deleteOutfitMenu = {
 | 
						|
        id = id,
 | 
						|
        title = _L("outfits.delete.title"),
 | 
						|
        menu = parent,
 | 
						|
        options = {}
 | 
						|
    }
 | 
						|
 | 
						|
    table.sort(outfits, function(a, b)
 | 
						|
        return a.name < b.name
 | 
						|
    end)
 | 
						|
 | 
						|
    for i = 1, #outfits, 1 do
 | 
						|
        deleteOutfitMenu.options[#deleteOutfitMenu.options + 1] = {
 | 
						|
            title = string.format(_L("outfits.delete.item.title"), outfits[i].name),
 | 
						|
            description = string.format(_L("outfits.delete.item.description"), outfits[i].model, (outfits[i].gender and (" - Gender: " .. outfits[i].gender) or "")),
 | 
						|
            event = deleteEvent,
 | 
						|
            args = outfits[i].id
 | 
						|
        }
 | 
						|
    end
 | 
						|
 | 
						|
    lib.registerContext(deleteOutfitMenu)
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:OutfitManagementMenu", function(args)
 | 
						|
    local outfits = lib.callback.await("illenium-appearance:server:getManagementOutfits", false, args.type, Framework.GetGender())
 | 
						|
    local managementMenuID = "illenium_appearance_outfit_management_menu"
 | 
						|
    local changeManagementOutfitMenuID = "illenium_appearance_change_management_outfit_menu"
 | 
						|
    local deleteManagementOutfitMenuID = "illenium_appearance_delete_management_outfit_menu"
 | 
						|
 | 
						|
    RegisterChangeOutfitMenu(changeManagementOutfitMenuID, managementMenuID, outfits, args.type)
 | 
						|
    RegisterDeleteOutfitMenu(deleteManagementOutfitMenuID, managementMenuID, outfits, "illenium-appearance:client:DeleteManagementOutfit")
 | 
						|
    local managementMenu = {
 | 
						|
        id = managementMenuID,
 | 
						|
        title = string.format(_L("outfits.manage.title"), args.type),
 | 
						|
        options = {
 | 
						|
            {
 | 
						|
                title = _L("outfits.change.title"),
 | 
						|
                description = string.format(_L("outfits.change.description"), args.type),
 | 
						|
                menu = changeManagementOutfitMenuID,
 | 
						|
            },
 | 
						|
            {
 | 
						|
                title = _L("outfits.save.menuTitle"),
 | 
						|
                description = string.format(_L("outfits.save.menuDescription"), args.type),
 | 
						|
                event = "illenium-appearance:client:SaveManagementOutfit",
 | 
						|
                args = args.type
 | 
						|
            },
 | 
						|
            {
 | 
						|
                title = _L("outfits.delete.title"),
 | 
						|
                description = string.format(_L("outfits.delete.description"), args.type),
 | 
						|
                menu = deleteManagementOutfitMenuID,
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    Management.AddBackMenuItem(managementMenu, args)
 | 
						|
 | 
						|
    lib.registerContext(managementMenu)
 | 
						|
    lib.showContext(managementMenuID)
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:SaveManagementOutfit", function(mType)
 | 
						|
    local outfitData = {
 | 
						|
        Type = mType,
 | 
						|
        Model = client.getPedModel(cache.ped),
 | 
						|
        Components = client.getPedComponents(cache.ped),
 | 
						|
        Props = client.getPedProps(cache.ped)
 | 
						|
    }
 | 
						|
 | 
						|
    local rankValues
 | 
						|
 | 
						|
    if mType == "Job" then
 | 
						|
        outfitData.JobName = client.job.name
 | 
						|
        rankValues = Framework.GetRankInputValues("job")
 | 
						|
 | 
						|
    else
 | 
						|
        outfitData.JobName = client.gang.name
 | 
						|
        rankValues = Framework.GetRankInputValues("gang")
 | 
						|
    end
 | 
						|
 | 
						|
    local dialogResponse = lib.inputDialog(_L("outfits.save.managementTitle"), {
 | 
						|
            {
 | 
						|
                label = _L("outfits.save.name.label"),
 | 
						|
                type = "input",
 | 
						|
                required = true
 | 
						|
            },
 | 
						|
            {
 | 
						|
                label = _L("outfits.save.gender.label"),
 | 
						|
                type = "select",
 | 
						|
                options = {
 | 
						|
                    {
 | 
						|
                        label = _L("outfits.save.gender.male"), value = "male"
 | 
						|
                    },
 | 
						|
                    {
 | 
						|
                        label = _L("outfits.save.gender.female"), value = "female"
 | 
						|
                    }
 | 
						|
                },
 | 
						|
                default = "male",
 | 
						|
            },
 | 
						|
            {
 | 
						|
                label = _L("outfits.save.rank.label"),
 | 
						|
                type = "select",
 | 
						|
                options = rankValues,
 | 
						|
                default = "0"
 | 
						|
            }
 | 
						|
        })
 | 
						|
 | 
						|
    if not dialogResponse then
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
 | 
						|
    outfitData.Name = dialogResponse[1]
 | 
						|
    outfitData.Gender = dialogResponse[2]
 | 
						|
    outfitData.MinRank = tonumber(dialogResponse[3])
 | 
						|
 | 
						|
    TriggerServerEvent("illenium-appearance:server:saveManagementOutfit", outfitData)
 | 
						|
 | 
						|
end)
 | 
						|
 | 
						|
local function RegisterWorkOutfitsListMenu(id, parent, menuData)
 | 
						|
    local menu = {
 | 
						|
        id = id,
 | 
						|
        menu = parent,
 | 
						|
        title = _L("jobOutfits.title"),
 | 
						|
        options = {}
 | 
						|
    }
 | 
						|
    local event = "illenium-appearance:client:loadJobOutfit"
 | 
						|
    if Config.BossManagedOutfits then
 | 
						|
        event = "illenium-appearance:client:changeOutfit"
 | 
						|
    end
 | 
						|
    if menuData then
 | 
						|
        for _, v in pairs(menuData) do
 | 
						|
            menu.options[#menu.options + 1] = {
 | 
						|
                title = v.name,
 | 
						|
                event = event,
 | 
						|
                args = v
 | 
						|
            }
 | 
						|
        end
 | 
						|
    end
 | 
						|
    lib.registerContext(menu)
 | 
						|
end
 | 
						|
 | 
						|
function OpenMenu(isPedMenu, menuType, menuData)
 | 
						|
    local mainMenuID = "illenium_appearance_main_menu"
 | 
						|
    local mainMenu = {
 | 
						|
        id = mainMenuID
 | 
						|
    }
 | 
						|
    local menuItems = {}
 | 
						|
 | 
						|
    local outfits = lib.callback.await("illenium-appearance:server:getOutfits", false)
 | 
						|
    local changeOutfitMenuID = "illenium_appearance_change_outfit_menu"
 | 
						|
    local updateOutfitMenuID = "illenium_appearance_update_outfit_menu"
 | 
						|
    local deleteOutfitMenuID = "illenium_appearance_delete_outfit_menu"
 | 
						|
    local generateOutfitCodeMenuID = "illenium_appearance_generate_outfit_code_menu"
 | 
						|
 | 
						|
    RegisterChangeOutfitMenu(changeOutfitMenuID, mainMenuID, outfits)
 | 
						|
    RegisterUpdateOutfitMenu(updateOutfitMenuID, mainMenuID, outfits)
 | 
						|
    RegisterDeleteOutfitMenu(deleteOutfitMenuID, mainMenuID, outfits, "illenium-appearance:client:deleteOutfit")
 | 
						|
    RegisterGenerateOutfitCodeMenu(generateOutfitCodeMenuID, mainMenuID, outfits)
 | 
						|
    local outfitMenuItems = {
 | 
						|
        {
 | 
						|
            title = _L("outfits.change.title"),
 | 
						|
            description = _L("outfits.change.pDescription"),
 | 
						|
            menu = changeOutfitMenuID
 | 
						|
        },
 | 
						|
        {
 | 
						|
            title = _L("outfits.update.title"),
 | 
						|
            description = _L("outfits.update.description"),
 | 
						|
            menu = updateOutfitMenuID
 | 
						|
        },
 | 
						|
        {
 | 
						|
            title = _L("outfits.save.menuTitle"),
 | 
						|
            description = _L("outfits.save.description"),
 | 
						|
            event = "illenium-appearance:client:saveOutfit"
 | 
						|
        },
 | 
						|
        {
 | 
						|
            title = _L("outfits.generate.title"),
 | 
						|
            description = _L("outfits.generate.description"),
 | 
						|
            menu = generateOutfitCodeMenuID
 | 
						|
        },
 | 
						|
        {
 | 
						|
            title = _L("outfits.delete.title"),
 | 
						|
            description = _L("outfits.delete.mDescription"),
 | 
						|
            menu = deleteOutfitMenuID
 | 
						|
        },
 | 
						|
        {
 | 
						|
            title = _L("outfits.import.menuTitle"),
 | 
						|
            description = _L("outfits.import.description"),
 | 
						|
            event = "illenium-appearance:client:importOutfitCode"
 | 
						|
        }
 | 
						|
    }
 | 
						|
    if menuType == "default" then
 | 
						|
        local header = string.format(_L("clothing.title"), Config.ClothingCost)
 | 
						|
        if isPedMenu then
 | 
						|
            header = _L("clothing.titleNoPrice")
 | 
						|
        end
 | 
						|
        mainMenu.title = _L("clothing.options.title")
 | 
						|
        menuItems[#menuItems + 1] = {
 | 
						|
            title = header,
 | 
						|
            description = _L("clothing.options.description"),
 | 
						|
            event = "illenium-appearance:client:openClothingShop",
 | 
						|
            args = isPedMenu
 | 
						|
        }
 | 
						|
        for i = 0, #outfitMenuItems, 1 do
 | 
						|
            menuItems[#menuItems + 1] = outfitMenuItems[i]
 | 
						|
        end
 | 
						|
    elseif menuType == "outfit" then
 | 
						|
        mainMenu.title = _L("clothing.outfits.title")
 | 
						|
        for i = 0, #outfitMenuItems, 1 do
 | 
						|
            menuItems[#menuItems + 1] = outfitMenuItems[i]
 | 
						|
        end
 | 
						|
    elseif menuType == "job-outfit" then
 | 
						|
        mainMenu.title = _L("clothing.outfits.title")
 | 
						|
        menuItems[#menuItems + 1] = {
 | 
						|
            title = _L("clothing.outfits.civilian.title"),
 | 
						|
            description = _L("clothing.outfits.civilian.description"),
 | 
						|
            event = "illenium-appearance:client:reloadSkin",
 | 
						|
            args = true
 | 
						|
        }
 | 
						|
 | 
						|
        local workOutfitsMenuID = "illenium_appearance_work_outfits_menu"
 | 
						|
        RegisterWorkOutfitsListMenu(workOutfitsMenuID, mainMenuID, menuData)
 | 
						|
 | 
						|
        menuItems[#menuItems + 1] = {
 | 
						|
            title = _L("jobOutfits.title"),
 | 
						|
            description = _L("jobOutfits.description"),
 | 
						|
            menu = workOutfitsMenuID
 | 
						|
        }
 | 
						|
    end
 | 
						|
    mainMenu.options = menuItems
 | 
						|
 | 
						|
    lib.registerContext(mainMenu)
 | 
						|
    lib.showContext(mainMenuID)
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:openClothingShopMenu", function(isPedMenu)
 | 
						|
    if type(isPedMenu) == "table" then
 | 
						|
        isPedMenu = false
 | 
						|
    end
 | 
						|
    OpenMenu(isPedMenu, "default")
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:OpenBarberShop", OpenBarberShop)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:OpenTattooShop", OpenTattooShop)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:OpenSurgeonShop", OpenSurgeonShop)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:changeOutfit", function(data)
 | 
						|
    local pedModel = client.getPedModel(cache.ped)
 | 
						|
    local appearanceDB
 | 
						|
    if pedModel ~= data.model then
 | 
						|
        local p = promise.new()
 | 
						|
        lib.callback("illenium-appearance:server:getAppearance", false, function(appearance)
 | 
						|
            BackupPlayerStats()
 | 
						|
            if appearance then
 | 
						|
                client.setPlayerAppearance(appearance)
 | 
						|
                RestorePlayerStats()
 | 
						|
            else
 | 
						|
                lib.notify({
 | 
						|
                    title = _L("outfits.change.failure.title"),
 | 
						|
                    description = _L("outfits.change.failure.description"),
 | 
						|
                    type = "error",
 | 
						|
                    position = Config.NotifyOptions.position
 | 
						|
                })
 | 
						|
            end
 | 
						|
            p:resolve(appearance)
 | 
						|
        end, data.model)
 | 
						|
        appearanceDB = Citizen.Await(p)
 | 
						|
    else
 | 
						|
        appearanceDB = client.getPedAppearance(cache.ped)
 | 
						|
    end
 | 
						|
    if appearanceDB then
 | 
						|
        client.setPedComponents(cache.ped, data.components)
 | 
						|
        client.setPedProps(cache.ped, data.props)
 | 
						|
        client.setPedHair(cache.ped, appearanceDB.hair, appearanceDB.tattoos)
 | 
						|
 | 
						|
        if data.disableSave then
 | 
						|
            TriggerServerEvent("illenium-appearance:server:syncUniform", {
 | 
						|
                type = data.type,
 | 
						|
                name = data.name
 | 
						|
            }) -- Is a uniform
 | 
						|
        else
 | 
						|
            local appearance = client.getPedAppearance(cache.ped)
 | 
						|
            TriggerServerEvent("illenium-appearance:server:saveAppearance", appearance)
 | 
						|
        end
 | 
						|
        Framework.CachePed()
 | 
						|
    end
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:DeleteManagementOutfit", function(id)
 | 
						|
    TriggerServerEvent("illenium-appearance:server:deleteManagementOutfit", id)
 | 
						|
    lib.notify({
 | 
						|
        title = _L("outfits.delete.management.success.title"),
 | 
						|
        description = _L("outfits.delete.management.success.description"),
 | 
						|
        type = "success",
 | 
						|
        position = Config.NotifyOptions.position
 | 
						|
    })
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:deleteOutfit", function(id)
 | 
						|
    TriggerServerEvent("illenium-appearance:server:deleteOutfit", id)
 | 
						|
    lib.notify({
 | 
						|
        title = _L("outfits.delete.success.title"),
 | 
						|
        description = _L("outfits.delete.success.description"),
 | 
						|
        type = "success",
 | 
						|
        position = Config.NotifyOptions.position
 | 
						|
    })
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:openJobOutfitsMenu", function(outfitsToShow)
 | 
						|
    OpenMenu(nil, "job-outfit", outfitsToShow)
 | 
						|
end)
 | 
						|
 | 
						|
local function InCooldown()
 | 
						|
    return (GetGameTimer() - reloadSkinTimer) < Config.ReloadSkinCooldown
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:reloadSkin", function(bypassChecks)
 | 
						|
    if not bypassChecks and InCooldown() or Framework.CheckPlayerMeta() or cache.vehicle or IsPedFalling(cache.ped) then
 | 
						|
        lib.notify({
 | 
						|
            title = _L("commands.reloadskin.failure.title"),
 | 
						|
            description = _L("commands.reloadskin.failure.description"),
 | 
						|
            type = "error",
 | 
						|
            position = Config.NotifyOptions.position
 | 
						|
        })
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    reloadSkinTimer = GetGameTimer()
 | 
						|
    BackupPlayerStats()
 | 
						|
 | 
						|
    lib.callback("illenium-appearance:server:getAppearance", false, function(appearance)
 | 
						|
        if not appearance then
 | 
						|
            return
 | 
						|
        end
 | 
						|
        client.setPlayerAppearance(appearance)
 | 
						|
        if Config.PersistUniforms then
 | 
						|
            LoadPlayerUniform(bypassChecks)
 | 
						|
        end
 | 
						|
        RestorePlayerStats()
 | 
						|
    end)
 | 
						|
end)
 | 
						|
 | 
						|
RegisterNetEvent("illenium-appearance:client:ClearStuckProps", function()
 | 
						|
    if InCooldown() or Framework.CheckPlayerMeta() then
 | 
						|
        lib.notify({
 | 
						|
            title = _L("commands.clearstuckprops.failure.title"),
 | 
						|
            description = _L("commands.clearstuckprops.failure.description"),
 | 
						|
            type = "error",
 | 
						|
            position = Config.NotifyOptions.position
 | 
						|
        })
 | 
						|
        return
 | 
						|
    end
 | 
						|
 | 
						|
    reloadSkinTimer = GetGameTimer()
 | 
						|
 | 
						|
    for _, v in pairs(GetGamePool("CObject")) do
 | 
						|
      if IsEntityAttachedToEntity(cache.ped, v) then
 | 
						|
        SetEntityAsMissionEntity(v, true, true)
 | 
						|
        DeleteObject(v)
 | 
						|
        DeleteEntity(v)
 | 
						|
      end
 | 
						|
    end
 | 
						|
end)
 |