Cette page a été traduite par machine, elle peut contenir quelques inexactitudes. Tu peux aider en contribuant à une traduction, ou tu peux aussi passer à la version anglaise.

Interface de l’API V1#

Cette page détaille toutes les exigences et fonctionnalités du SDK fournies. Un exemple complet de plugin peut être trouvé ici.

Fonctionnalités#

Point d’entrée#

La partie la plus importante de votre plugin est la mise en place du point d’entrée. Sans une implémentation correcte, votre plugin ne pourra pas se charger. L’extrait de code suivant peut être utilisé comme exemple minimum pour configurer le point d’entrée.

#include "plutonium-sdk/plutonium_sdk.hpp"

std::unique_ptr<plutonium::sdk::plugin> plugin_;
class plugin_impl : public plutonium::sdk::plugin
{
public:
    const char* plugin_name() override
    {
        return "Plutonium SDK Example";
    }

    void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override
    {
        // startup code
    }

    void on_shutdown() override
    {
        // shutdown code
    }
};

PLUTONIUM_API plutonium::sdk::plugin* on_initialize()
{
    return (plugin_ = std::make_unique<plugin_impl>()).get();
}

BOOL APIENTRY DllMain(HMODULE, DWORD, LPVOID)
{
    return TRUE;
}

Le plugin_name(), on_startup() et on_shutdown() Des méthodes doivent être implémentées pour que votre plugin soit considéré comme valide par Plutonium.

  • on_startup: Exécuté après l’application de tous les patchs de Plutonium, avant que la WinMain du jeu ne soit appelée
  • on_shutdown: Exécuté lorsque le plugin est déchargé

Le on_initialize est utilisé comme point d’entrée de votre plugin. Cette fonction permet à Plutonium de découvrir l’implémentation du SDK du plugin. Votre implémentation doit suivre cette signature exacte.

L’interface du plugin dispose également d’un is_game_supported() méthode. Par défaut, tous les jeux pris en charge par Plutonium essaieront de charger le plugin. Vous pouvez utiliser cette méthode pour choisir de charger ou non votre plugin s’il ne prend en charge qu’un seul titre.

Exploitation forestière#

L’interface de journalisation est utilisée pour imprimer les messages dans la fenêtre de la console Plutonium.

void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override
{
    interface_ptr->logging()->info("Plugin Starting Up!");
}
  • info : imprime un message d’information sans coloration
  • Avertir : imprime les messages d’avertissement avec du texte jaune
  • Erreur : affiche le message d’erreur avec du texte rouge

SGC#

L’interface GSC est utilisée pour enregistrer des commandes internes de méthode et de fonction personnalisées sur la machine virtuelle GSC. Ces méthodes peuvent ensuite être facilement appelées à partir d’un script GSC chargé sur le serveur.

DÉMENTI: S’il est utilisé sur IW5, le déchargement de votre plugin provoquera probablement le plantage du jeu. Le déchargement est pris en charge sur T4, T5 et T6 avec des composants intégrés GSC personnalisés.

void test_method_builtin(plutonium::sdk::types::entref entity)
{

}

void test_function_builtin()
{

}

void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override
{
    interface_ptr->gsc()->register_function("testFunction", test_function_builtin);
    interface_ptr->gsc()->register_method("testMethod", test_method_builtin);
}

Utilisation de GSC :

init()
{
    testFunction();

    level thread onPlayerConnect();
}

onPlayerConnect()
{
    for(;;)
    {
        level waittill( "connected", player );

        player testMethod();
    }
}

Commandes#

L’interface de commande client permet d’enregistrer un gestionnaire personnalisé pour une commande spécifique envoyée par un client au serveur.

void client_command_function_test(int client_num)
{

}

void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override
{
    interface_ptr->client_command()->register_client_command("testClientCommand", client_command_function_test);
}

Rappels#

L’interface de callbacks permet à votre plugin d’être averti lorsque des événements de jeu génériques se produisent. Ces événements peuvent ensuite être utilisés pour ajouter une logique personnalisée qui doit être exécutée à un moment précis.

  • on_dvar_init() - Le système dvar du jeu est initialisé et prêt à enregistrer les dvars
  • on_after_dvar_init() - La plupart des dvars du jeu ont été enregistrés et la boucle du thread principal est sur le point de commencer
  • on_game_init(int levelTime, int restart) - Le serveur de jeu est en cours d’initialisation
    • levelTime : durée d’exécution du serveur
    • restart - Indique si cette initialisation est le résultat du redémarrage du serveur (c’est-à-dire map_restart)
  • on_game_shutdown(int freeScripts) - Le serveur de jeu s’arrête
    • freeScripts - Indique si les scripts du jeu seront libérés (c’est-à-dire pas un map_restart)
  • on_player_pre_connect(int numClient) - Un client se connecte au serveur pour la première fois
  • on_player_connect(int numClient) - Un client se connecte au serveur
    • Cet événement est déclenché lorsqu’un client se reconnecte après une map_restart !
  • on_player_disconnect(int numClient) - Un client se déconnecte du serveur
  • on_scripts_load() - Le serveur commence à charger les scripts GSC
  • on_scripts_execute() - Le serveur commence à exécuter des scripts GSC

Programmateur#

L’interface du planificateur permet à votre plugin de programmer l’exécution du code sur un thread de jeu spécifique à un moment précis.

Bobine:

  • main - Le thread principal de l’exécutable du jeu. Ce thread est toujours actif
  • game - Le thread jeu/serveur. Ce thread ne s’exécute que lorsqu’une carte est en cours de chargement et de lecture

Horaires:

  • on_frame - Ce rappel sera exécuté sur chaque image du thread choisi.
  • once - Ce rappel sera exécuté une fois sur l’image suivante du thread choisi.
  • delay - Ce rappel sera exécuté sur le thread choisi après un nombre spécifié de millisecondes
  • every - Ce rappel sera exécuté sur le thread choisi après un nombre spécifié de millisecondes et reprogrammé pour être exécuté à nouveau en fonction de l’évaluation du rappel.
scheduler::evaluation callback()
{
    // code
    return scheduler::reschedule;
}

void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override
{
    // execute a callback on the game thread every 1000ms
    interface_ptr->scheduler()->every(callback, 1000, scheduler::thread::game);
}