Jump to content

How to: Plugin XPlane, versión receta de la abuela.


Recommended Posts

Plugin XPlane, versión receta de la abuela. :air_kiss:

Ingredientes mínimos para un plugin sabroso y sencillo.

- Un tío con mucho tiempo libre.
- Un ordenador, indispensable que tenga sistema operativo. *
- Un compilador para el sistema operativo que uses. *
- Un poco del SDK del XPlane.
- Algo de paciencia.

* Recordar que el XPlane funciona en Windows, Mac y en su distribución de GNU/Linux mas cercana. :windows:

El sistema operativo y el compilador lo dejo al gusto de cada uno. Pero para hacer esta receta, como es con el que mas me apaño, voy a usar GNU/Linux y el GCC.

Por ahora creo que te tienes que haber imaginado que el plato va a ser en C puro y duro, “oficialmente” el SDK solo soporta C, C++ y Delphi. Pero creo que hay variantes para soportar otros lenguajes, estilo LUA o Python.

Para preparar el SDK de XPlane, antes de comenzar con el plugin, lo descargamos de aquí: SDK

La ultima versión, a la fecha de hacer la receta, es la 2.1.2 y es la que da soporte para la creación de plugins en 64bits. Hacerlo en 64 o en 32 va al gusto del cocinero, por mi parte considero mas sabrosos los 64 bits y lo mas importante, la cocina que uso es en 64.

Una vez descargado el SDK, lo descomprimimos y lo guardamos en la carpeta donde vallamos a cocinar nuestro plugin.

Nota: Si por cualquier casualidad usas archlinux el SDK de xplane lo puedes instalar con un paquete que hay en AUR llamado xplane-sdk-devel.

Ya preparado el ingrediente principal, vamos a preparar el código antes de cocinarlo, lo mas sencillo posible, luego si quieres añadir algo ya es cosa tuya.

Con cualquier editor de texto creamos un fichero, acabado en .c :whistling: , en la carpeta donde vallamos a cocinar el plugin. En nuestro caso lo vamos a llamar cocido.c .

Y dentro de nuestro fichero cocido.c empezamos a añadir lo básico para que nuestro plugin funcione.


Lo primero lo básico para que el compilador reconozca las funciones del SDK, es añadir las librerías necesarias del SDK, la mas básica;

#include "XPLMDefs.h"



También vamos a tener que usar la librería string de C, por lo que la incluimos en el cocido.

#include <string.h>

La primera función imprescindible a meter en la cazuela es la siguiente:

PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc)


Esta función es la primera en ser llamada cuando el xplane carga los plugins y la encargada de dar nombre al plugin dentro de xplane. Cualquier código que incluyas dentro de esta sera ejecutado al iniciar el simulador.

Dentro de esta función hay dos cosas muy importantes; las variables outName, outSig, outDesc y que la variable tiene que devolver 1 para que el simulador entienda que la cosa esta bien cocida y no da problemas en su digestión.

La variable outName guarda el nombre que mostrara el plugin dentro del sim.

En outSig guardaremos una especie de firma que identificara nuestro plugin dentro del sim, con la idea de que si hay dos con el mismo nombre no entren en conflicto y le siente mal al comensal.

Y como no en outDesc sera una descripción de nuestro cocido plugin.

Para modificar las variables usamos la función strcpy, con lo que copiamos el string que queramos dentro de la variable.

La cosa mas o menos nos quedara así:

PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc)
{
strcpy(outName, "Cocido");
// El nombre del plugin.
strcpy(outSig, "escuadron69.blackleg.cocido");
//Firma plugin
strcpy(outDesc, "Plugin ");
//Descripción plugin.
 
return 1;
// Si no devuelve 1 no funciona el plugin.
}

Otra función a añadir a la cazuela es la siguiente:

PLUGIN_API void XpluginStop(void)


Esta función es llamada por el sim cuando cierra el plugin y dentro de esta tiene que estar el código que quieras que se ejecute antes de cerrar el sim.

Como a nosotros no vamos a necesitar nada la dejamos vaciá.

PLUGIN_API void XPluginStop(void)
{
 
}


Y vamos añadiendo mas funciones, que aun quedan.

La siguiente es la que el sistema llama cuando se habilita el plugin, que no es lo mismo que cargarlo, ya que dentro del sim puedes habilitar o deshabilitar el plugin pero este sigue cargado en el sim.

PLUGIN_API void XPluginEnable(void)


Esta función se ejecuta después de cargar el plugin y cada vez que se habilita por lo que ya sabes que código tienes que meter aquí.

Y como no la función contraria, que es la que se ejecuta antes de deshabilitar el plugin.

PLUGIN_API void XpluginDisable(void)


Como para nuestra receta no nos hacen falta las metemos a la cazuela vaciás.

PLUGIN_API void XPluginEnable(void)
{
}
 
PLUGIN_API void XPluginDisable(void)
{
}


Y la ultima función obligatoria en el código, con lo que nuestro ya tendría que funcionar nuestro plugin, aunque ya advierto que no hace gran cosa, bueno si cargarse en el sim.

PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFromWho, int inMessage, void *inParam)


Esta ultima función es la mas complicada y no me voy a meter mucho con ella.
Su función mas o menos comunicar nuestro plugin y el programa encargado de administrarlo.

A si que en nuestra receta lo vamos a dejar vació como los otros, que no estamos para complicarnos mucho.

PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFromWho, int inMessage, void *inParam)
{
}


Y nuestro cocido.c quedara así:

#include "XPLMDefs.h"
#include <string.h>
 
PLUGIN_API int XPluginStart(char *outName, char *outSig, char *outDesc)
{
strcpy(outName, "Cocido");
// El nombre del plugin.
strcpy(outSig, "escuadron69.blackleg.cocido");
//Firma plugin
strcpy(outDesc, "Plugin "); //Descripción plugin.
return 1;
// Si no devuelve 1 no funciona el plugin.
}
 
PLUGIN_API void XPluginStop(void)
{
}
 
PLUGIN_API void XPluginEnable(void)
{
}
 
PLUGIN_API void XPluginDisable(void)
{
}
 
PLUGIN_API void XPluginReceiveMessage(XPLMPluginID inFromWho, int inMessage, void *inParam)
{
}



Con la base de la receta en la cazuela y un poco del SDK, ya tenemos el plato listo para cocinar.

Antes de cocer el código con el GCC vamos a explicar un par de cosas.

Los plugins de XPlane son básicamente librerías dinámicas, lo que viene siendo una DLL para los ventaneros. Por lo que tienen que ser compiladas y enlazadas como tales.

Como estamos en mi querido linux, primero tenemos que compilar el código como un objeto.
Y luego generar el objeto como una librería.

Dentro de la carpeta donde tenemos el código y el SDK, ejecutamos en un terminal esto:

gcc -c -fPIC -I./SDK/CHeaders/XPLM -DLIN=1 cocido.c
gcc -shared cocido.o -o lin.xpl


Ejecutando lo anterior ya tendremos nuestro cocido listo para servir al xplane y disfrutar de el.

Como veis, al generar el plugin, le he dado el nombre de lin.xpl ya que el nombre de estos es según el sistema operativo al que van destinados seguidos de .xpl, lin.xpl para linux, mac.xpl para mac y win.xpl para windwos.


Para servir esta maravillosa receta al xplane, introducir nuestro plugin en una carpeta con el nombre de este y meter esta dentro de la carpeta de plugins del xplane. Si todo va bien, tendríamos que verlo dentro del administrador de plugins, aunque el pobre no va a hacer mucho por ahora. :aplauso-6:

 

scaled_full_40ee34cf4fce61b75317.png

En cuanto pueda ampliare mas la receta. :icon_mrgreen:

Edited by Blackleg
Link to comment
Share on other sites

  • 3 months later...

Oficialmente, Ningún Post Sin Respuesta, pero las malas lenguas dicen que es No Puedo Soñar y me dedico a Responder, hay una escisión rebelde que aboga por la NPSS, esto es, Ningún Post Sin Spam, pero sus miembros están bastante desconectados de la realidad.

 

Saludos!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

Some pretty cookies are used in this website