V1 API Interface#
Cette page détaille toutes les exigences et fonctionnalités du SDK fournies. Un exemple complet de plugin peut être trouvé ici.
Fonctionnalités#
- Interface de journalisation
- Enregistrement des fonctions et des méthodes GSC
- Enregistrement de la commande client
- Rappels d’événements
- Planificateur de threads
Point d’entrée#
La partie la plus importante de votre plugin est la configuration du point d’entrée. Sans une implémentation correcte, votre plugin ne se chargera pas. L’extrait de code suivant peut être utilisé comme exemple minimum pour la configuration du 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()
méthodes doivent être mises en œuvre pour que votre plugin soit considéré comme valide par Plutonium.
on_startup
: Exécuté après l’application de tous les correctifs de Plutonium, avant l’appel du WinMain du jeuon_shutdown
: Exécuté lors du déchargement du plugin
Le on_initialize
function est utilisée comme point d’entrée de votre plugin. C’est ainsi que Plutonium découvre 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 ré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 : affiche les messages d’avertissement en jaune
- Erreur : Imprime le message d’erreur avec du texte rouge
SGC#
L’interface GSC est utilisée pour enregistrer les méthodes et fonctions personnalisées intégrées à 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 intégrations GSC personnalisées.
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 la 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 de dvars du jeu est initialisé et prêt à enregistrer les dvars.
- on_after_dvar_init() - La plupart des dvars de jeu ont été enregistrées et la boucle du fil 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 clientNum) - Un client se connecte au serveur pour la première fois
- on_player_connect(int clientNum) - 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 clientNum) - 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 fil conducteur de l’exécutable du jeu. Ce fil de discussion est toujours actif
- game - Le fil de discussion jeu/serveur. Ce fil de discussion 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 trame du thread choisi.
- once - Ce callback sera exécuté une fois sur la trame 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);
}