> ## Documentation Index
> Fetch the complete documentation index at: https://docs.humalike.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Construire un pont personnalisé

> Créez une ressource FiveM distincte qui relie votre framework à Humalike.

Cet exemple enregistre un fournisseur joueur personnalisé et un fournisseur
d'interaction client. N'ajoutez que les domaines que votre serveur possède.

## Répertoire

```text theme={null}
resources/
├── humalike/
└── my-humalike-bridge/
    ├── fxmanifest.lua
    ├── server.lua
    └── client.lua
```

## Manifeste

```lua theme={null}
fx_version 'cerulean'
game 'gta5'
lua54 'yes'

name 'my-humalike-bridge'
version '1.0.0'

dependency 'humalike'

server_script 'server.lua'
client_script 'client.lua'
```

Démarrez-le après Humalike :

```cfg theme={null}
ensure humalike
ensure my-humalike-bridge
```

## Fournisseur serveur

```lua theme={null}
local function registerProviders()
    local ok, err = exports.humalike:RegisterProvider('player', {
        name = 'my_framework',
        apiVersion = 1,
        priority = 100,

        Available = function()
            return GetResourceState('my-core') == 'started'
        end,

        GetCharacterId = function(source)
            local player = exports['my-core']:GetPlayer(source)
            return player and player.characterId or nil
        end,

        GetCharacterName = function(source)
            local player = exports['my-core']:GetPlayer(source)
            return player and player.fullName or nil
        end,

        IsCharacterLoaded = function(source)
            return exports['my-core']:GetPlayer(source) ~= nil
        end,

        HasJob = function(source, jobNames, requireDuty)
            local player = exports['my-core']:GetPlayer(source)
            if not player then return false end

            for _, name in ipairs(jobNames) do
                if player.job.name == name then
                    return not requireDuty or player.job.onDuty == true
                end
            end
            return false
        end,

        Notify = function(source, message, kind)
            TriggerClientEvent('my-ui:notify', source, message, kind)
        end,
    })

    if not ok then
        print(('[my-humalike-bridge] player provider failed: %s'):format(err))
    end
end

AddEventHandler('onResourceStart', function(resource)
    if resource == GetCurrentResourceName() then registerProviders() end
end)

AddEventHandler('humalike:integration:ready', registerProviders)
```

Ne mettez pas en cache un objet joueur d'un callback à l'autre. Résolvez le
personnage actif à partir de `source` à chaque fois, afin que les reconnexions et
les changements de personnage soient gérés correctement.

## Fournisseur d'interaction client

```lua theme={null}
local entries = {}

local function registerInteraction()
    exports.humalike:RegisterInteractionProvider({
        name = 'my_target',
        apiVersion = 1,
        priority = 100,

        Available = function()
            return GetResourceState('my-target') == 'started'
        end,

        watchedResources = { 'my-target' },

        Add = function(id, entity, options)
            entries[id] = { entity = entity, options = options }
            exports['my-target']:AddEntity(entity, options)
            return true
        end,

        Remove = function(id)
            local entry = entries[id]
            if not entry then return end
            exports['my-target']:RemoveEntity(entry.entity)
            entries[id] = nil
        end,

        Progress = function(durationMs, label)
            return exports['my-progress']:Run(durationMs, label) == true
        end,
    })
end

AddEventHandler('onClientResourceStart', function(resource)
    if resource == GetCurrentResourceName() then registerInteraction() end
end)

AddEventHandler('humalike:integration:ready', registerInteraction)
```

Chaque option contient `text`, un `icon` facultatif, `canInteract(entity)` et
`onSelect(entity)`. Conservez ces callbacks lorsque vous adaptez l'option à
votre système de ciblage.

## Sélectionner et vérifier

```cfg theme={null}
set humalike_player my_framework
set humalike_interaction my_target
```

Exécutez `humalike_status` dans la console serveur et dans la console client.
Les deux domaines doivent afficher `selected`, le nom de fournisseur attendu et
le pont comme propriétaire.

Consultez l'[API des fournisseurs](/fr/ai-npc/integrations/provider-api) pour
chaque descripteur et chaque valeur de retour.

## Suite

* [Ajouter des événements joueur neutres](/fr/ai-npc/integrations/world-events).
* [Vérifier l'état des fournisseurs](/fr/ai-npc/operations#états-des-fournisseurs).
* [Revoir la sécurité des intégrations](/fr/ai-npc/security#frontières-de-confiance).
