Aller au contenu

Interfaces remote

Ce guide montre les patterns remote.add_interface utilisés dans les mods RitnLib : dispatch GUI, communication inter-mods, et conventions de nommage.

Pourquoi remote

Factorio utilise remote.add_interface / remote.call pour la communication entre mods. C'est le seul moyen propre pour un mod A d'appeler une fonction d'un mod B sans couplage fort.

Dans RitnLib, les interfaces remote servent principalement au dispatch GUI : RitnLibGui appelle remote.call(mod_name, "gui_action_<gui_name>", ...) pour router les clics.

Structure d'une interface

-- mon-mod/control.lua
remote.add_interface("mon-mod", {
    ma_fonction = function(arg1, arg2)
        -- logique
        return resultat
    end,

    autre_fonction = function()
        -- ...
    end
})

remote.add_interface prend un nom (le nom de l'interface, souvent le nom du mod) et une table de fonctions. Enregistre au moment où le fichier s'exécute.

Interface GUI — dispatch de clics

Le pattern gui_action_<gui_name> est une convention RitnLib. RitnLibGui cherche exactement ce nom :

remote.add_interface("mon-mod", {
    -- gui_name = "ma-gui" → gui_action_ma_gui (tirets → underscores)
    gui_action_ma_gui = function(player_index, element_name)
        local player = game.get_player(player_index)

        if element_name == "btn-ok" then
            -- Bouton OK cliqué
        elseif element_name == "btn-fermer" then
            if player and player.gui.center["ma-gui-root"] then
                player.gui.center["ma-gui-root"].destroy()
            end
        end
    end,
})

element_name est le nom de l'élément cliqué sans le préfixe "gui_name-".

Plusieurs GUIs dans le même mod

Tu peux avoir plusieurs interfaces GUI dans la même table remote.add_interface :

remote.add_interface("mon-mod", {
    gui_action_inventaire = function(player_index, element_name)
        -- dispatch pour la GUI "inventaire"
    end,

    gui_action_options = function(player_index, element_name)
        -- dispatch pour la GUI "options"
    end,

    -- fonctions utilitaires pour d'autres mods
    get_version = function()
        return "1.0.0"
    end,
})

Appeler l'interface d'un autre mod

-- Vérifier si l'interface existe avant d'appeler
if remote.interfaces["autre-mod"] and remote.interfaces["autre-mod"]["get_version"] then
    local version = remote.call("autre-mod", "get_version")
    log("autre-mod version : " .. version)
end

Toujours vérifier remote.interfaces["nom-mod"] avant d'appeler — le mod peut être absent ou désactivé.

Règle de nommage

Cas Nom de la fonction
Dispatch GUI pour gui_name = "mon-panel" gui_action_mon_panel
Dispatch GUI pour gui_name = "lobby-main" gui_action_lobby_main
API publique pour autres mods nom descriptif libre

La règle : remplace les tirets par des underscores dans gui_name pour obtenir le nom de la fonction.

Déclarer une seule interface par mod

remote.add_interface ne peut être appelé qu'une seule fois par nom. Si tu appelles deux fois avec le même nom, Factorio lève une erreur. Regroupe toutes tes fonctions dans un seul appel.

-- ✅ Un seul appel avec toutes les fonctions
remote.add_interface("mon-mod", {
    gui_action_panel  = function(...) ... end,
    gui_action_options = function(...) ... end,
    get_data          = function() ... end,
})

-- ❌ Deux appels séparés → erreur Factorio
remote.add_interface("mon-mod", { gui_action_panel = ... })
remote.add_interface("mon-mod", { gui_action_options = ... })  -- ERREUR

Voir aussi