Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat Request: Clothing Metadata support #406

Open
MrMallenby opened this issue Mar 27, 2024 · 1 comment
Open

Feat Request: Clothing Metadata support #406

MrMallenby opened this issue Mar 27, 2024 · 1 comment
Labels
needs-triage Indicates an issue or PR lacks a `triage/foo` label and requires one.

Comments

@MrMallenby
Copy link

Hi there i was wondering if it would be possible to have a clothing metadata function added to the script as to work with the clothes as items scripts that are knocking around these days, such as the clothes as item system in the c8re inventory & clothing scripts which rely on being fed meta data when the clothes are purchased

@github-actions github-actions bot added the needs-triage Indicates an issue or PR lacks a `triage/foo` label and requires one. label Mar 27, 2024
@blugthek
Copy link

blugthek commented Sep 9, 2024

i just make an handler

On illenium side

client.startPlayerCustomization(function(appearance)
        if (appearance) then
            ...
            TriggerEvent('BX:appearanceBridge', appearance.components) -- add this line
            TriggerEvent('BX:appearanceBridge', appearance.props) -- add this line
            ...
        end
    end, config)

client

RegisterNetEvent('BX:appearanceBridge')
   AddEventHandler('BX:appearanceBridge', function(dataArgs)
       local skin = {}
       local newTable = {}
       local newTorso = 4
       for k, v in pairs(dataArgs) do
           if v.component_id then
               if v.component_id == 3 then
                   newTorso = v.drawable
               end
               v.permanent = true
               newTable[v.component_id] = v
           end
           if v.prop_id then
               v.permanent = true
               newTable[v.prop_id] = v
           end
       end
       for k in sPairs(newTable) do
           skin[#skin + 1] = k
       end
       for k, v in pairs(dataArgs) do
           for j, o in pairs(v) do
               print(("[%s] : %s = %s"):format(k, j, o))
           end
           if v.component_id == 11 then
               v.torso = newTorso
           end
           ClothesCreation(v)
       end
   end)

   local clothingMappings = {
       [1] = { name = 'mask', components = { mID = 1, wID = 1 } },
       [3] = { name = 'arm', components = { mID = 1, wID = 1 } },
       [4] = { name = 'pants', components = { mID = 4, wID = 4 } },
       [5] = { name = 'backpacks', components = { mID = 5, wID = 5 } },
       [6] = { name = 'shoes', components = { mID = 6, wID = 6 } },
       [7] = { name = 'accessory', components = { mID = 7, wID = 7 } },
       [8] = { name = 'tshirt', components = { mID = 8, wID = 8 } },
       [9] = { name = 'bodyarmor', components = { mID = 9, wID = 9 } },
       [10] = { name = 'badge', components = { mID = 10, wID = 10 } },
       [11] = { name = 'torso', components = { mID = 11, wID = 11 } }
   }

   local accessoryMappings = {
       [0] = { name = 'hat', components = { mPropID = 0, wPropID = 0 } },
       [1] = { name = 'glass', components = { mPropID = 1, wPropID = 1 } },
       [2] = { name = 'ear', components = { mPropID = 2, wPropID = 2 } },
       [6] = { name = 'watch', components = { mPropID = 6, wPropID = 6 } },
       [7] = { name = 'bracelet', components = { mPropID = 7, wPropID = 7 } },
   }

   local armHandlers = {}

   RegisterNetEvent('BX:skinBridge')
   AddEventHandler('BX:skinBridge', function(dataArgs)
       ClothesCreation(dataArgs)
   end)

   function ClothesCreation(dataArgs)
       -- Check if dataArgs is nil
       if not dataArgs then
           return
       end

       local clothingInfo, accessoryInfo

       -- Check if component_id exists in dataArgs
       if dataArgs.component_id then
           clothingInfo = clothingMappings[dataArgs.component_id]

           -- Handle 'arm' case
           if clothingInfo and clothingInfo.name == 'arm' then
               armHandlers.torso = dataArgs.model or dataArgs.drawable or 4
               return
           end
       end

       -- Check if prop_id exists in dataArgs
       if dataArgs.prop_id then
           accessoryInfo = accessoryMappings[dataArgs.prop_id]
       end

       -- Handle clothing case
       if clothingInfo then
           print("FOUND CLOTHES")
           local metadata = {
               mModel = dataArgs.model or dataArgs.drawable,
               mTexture = dataArgs.texture,
               wModel = dataArgs.model or dataArgs.drawable,
               wTexture = dataArgs.texture
           }

           if dataArgs.component_id == 11 then
               metadata.mTorso = dataArgs.torso or armHandlers.torso or dataArgs.model or dataArgs.drawable
               metadata.wTorso = dataArgs.torso or armHandlers.torso or dataArgs.model or dataArgs.drawable
           end

           for key, value in pairs(clothingInfo.components) do
               metadata[key] = value
           end

           TriggerServerEvent('BX:server:addClothesTemp', {
               name = clothingInfo.name,
               count = 1,
               metadata = metadata
           })

           return
       end

       -- Handle accessory case
       if accessoryInfo then
           print("FOUND ACCESSORY")
           local metadata = {
               mPropModel = dataArgs.model or dataArgs.drawable,
               mPropTexture = dataArgs.texture,
               wPropModel = dataArgs.model or dataArgs.drawable,
               wPropTexture = dataArgs.texture
           }

           for key, value in pairs(accessoryInfo.components) do
               metadata[key] = value
           end

           TriggerServerEvent('BX:server:addClothesTemp', {
               name = accessoryInfo.name,
               count = 1,
               metadata = metadata
           })

           return
       end
   end

Server

RegisterServerEvent('BX:server:addClothesTemp')
    AddEventHandler('BX:server:addClothesTemp', function(data)
        local _source = source;
        local xPlayer = ESX.GetPlayerFromId(_source)
        local name, count, metadata
        local IDC = xPlayer.identifier
        IDC = IDC:sub(#IDC - 4, #IDC)
        local serialNumber = genSerial(IDC)

        if data ~= nil then
            name = data.name or 'blank'
            count = data.count or 0
            metadata = data.metadata or {}
        end

        if not data.permanent then
            metadata.serial = serialNumber
            metadata.workClothes = true
            tClothesData[serialNumber] = 1
        end

        if name == 'blank' and count <= 0 or not ESX.Items[name] then
            print('^0[ERROR] Something is wrong',name)
            return false
        end

        local inventory = 'content-' .. xPlayer.coreIdentity
        local aI
        --aI = exports['core_inventory']:addItem(inventory, name, count, metadata, 'content')
        xPlayer.xpcall(function()
            aI = exports['core_inventory']:addItem(inventory, name, count, metadata, 'content')
        end)
        if not aI then
            print('SUM TING WONG')
        end
    end)
modify as you see fit, my code is very clunky but i am too lazy to fix it.
Hope this might help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
needs-triage Indicates an issue or PR lacks a `triage/foo` label and requires one.
Projects
None yet
Development

No branches or pull requests

2 participants