Interfaz de API V1#
En esta página se detallan todos los requisitos y funciones del SDK que se proporcionan. Se puede encontrar un plugin de ejemplo completo aquí.
Funciones#
- Interfaz de registro
- Registro de funciones y métodos GSC
- Registro de comandos de cliente
- Devoluciones de llamada de eventos
- Programador de subprocesos
Punto de entrada#
La parte más importante de tu plugin es configurar el punto de entrada. Sin una implementación correcta, su complemento no se cargará. El siguiente fragmento de código se puede usar como ejemplo mínimo para configurar el punto de entrada.
#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;
}
El plugin_name()
, on_startup()
y on_shutdown()
Se requiere que se implementen métodos para que su complemento sea considerado válido por Plutonium.
on_startup
: Se ejecuta después de que se aplican todos los parches de plutonio, antes de que se llame al WinMain del juegoon_shutdown
: Se ejecuta cuando se descarga el complemento
El on_initialize
se utiliza como punto de entrada a su complemento. Esta función es la forma en que Plutonium descubre la implementación del SDK del complemento. La implementación debe seguir esta firma exacta.
La interfaz del complemento también tiene un is_game_supported()
método. De forma predeterminada, todos los juegos compatibles con Plutonium intentarán cargar el complemento. Puedes usar este método para elegir si cargar o no tu plugin si solo admite un título.
Registro#
La interfaz de registro se utiliza para imprimir mensajes en la ventana de la consola de Plutonium.
void on_startup(plutonium::sdk::iinterface* interface_ptr, plutonium::sdk::game game) override
{
interface_ptr->logging()->info("Plugin Starting Up!");
}
- info: imprime un mensaje informativo sin colorear
- ADVERTIR: imprime mensajes de advertencia con texto amarillo
- Error: Imprime un mensaje de error con texto rojo
SGC#
La interfaz GSC se utiliza para registrar métodos y funciones personalizados incorporados en la máquina virtual GSC. Estos métodos se pueden llamar fácilmente desde un script GSC cargado en el servidor.
RENUNCIA: Si se usa en IW5, descargar su complemento probablemente hará que el juego se bloquee. La descarga es compatible con T4, T5 y T6 con incorporados GSC personalizados.
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);
}
Uso de GSC:
init()
{
testFunction();
level thread onPlayerConnect();
}
onPlayerConnect()
{
for(;;)
{
level waittill( "connected", player );
player testMethod();
}
}
Comandos#
La interfaz de comandos de cliente se utiliza para registrar un controlador personalizado para un comando específico enviado por un cliente al servidor.
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);
}
Callbacks#
La interfaz de devoluciones de llamada permite que su complemento sea notificado cuando ocurren eventos genéricos del juego. Estos eventos se pueden usar para agregar lógica personalizada que debe ejecutarse en un momento específico.
- on_dvar_init() - El sistema de dvars del juego está inicializado y listo para registrar dvars
- on_after_dvar_init() - La mayoría de los dvars del juego se han registrado y el bucle del hilo principal está a punto de comenzar
- on_game_init(int levelTime, int restart) - El servidor del juego se está inicializando
- levelTime - Cantidad de tiempo que el servidor ha estado funcionando
- restart: indica si esta inicialización es el resultado del reinicio del servidor (es decir, map_restart)
- on_game_shutdown(int freeScripts) - El servidor del juego se está apagando
- freeScripts - Indica si los scripts del juego serán libres (es decir, no un map_restart)
- on_player_pre_connect(int clientNum) - Un cliente se conecta al servidor por primera vez
- on_player_connect(int clientNum) - Un cliente se está conectando al servidor
- Este evento se genera cuando un cliente se vuelve a conectar después de una map_restart!
- on_player_disconnect(int clientNum) - Un cliente se está desconectando del servidor
- on_scripts_load() - El servidor está comenzando a cargar scripts GSC
- on_scripts_execute() - El servidor está comenzando a ejecutar scripts GSC
Programador#
La interfaz del programador permite que su complemento programe el código para que se ejecute en un hilo de juego específico en un momento específico.
Hilos:
- main: el hilo principal del ejecutable del juego. Este subproceso siempre está activo
- game - El hilo del juego/servidor. Este hilo solo se ejecuta cuando un mapa está cargado y reproduciéndose
Horarios:
- on_frame - Esta devolución de llamada se ejecutará en cada fotograma del hilo elegido.
- once: esta devolución de llamada se ejecutará una vez en el siguiente fotograma del subproceso elegido.
- delay: esta devolución de llamada se ejecutará en el subproceso elegido después de un número especificado de milisegundos
- ever: esta devolución de llamada se ejecutará en el subproceso elegido después de un número especificado de milisegundos y se reprogramará para que se vuelva a ejecutar en función de la evaluación de la devolución de llamada.
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);
}