Bonjour à tous, Bonjour à toutes
Comme vous avez pu le remarquer, je suis dans les tutos en se moment :D
Aujourd'hui c'est pour vous expliquer comme créer un plugin pour EuuBot.Relay en Vb.net
Voici le plan du tutoriel :
- Préambule et présentation du plugin
- Création de la library
- Implantation des interfaces
- Débogage
Let's Go :)
Préambule et présentation du plugin
Avant de commencer les choses sérieuses, il faut vous assurer d'être en possession de plusieurs choses:
- Avant tout il vous faut le Framework .Net 4.0
- Vous devez aussi vous procurer la version Beta de EuuBot.Relay ICI
- Il faut également savoir le configurer pour ceci, Mike nous a fait un beau tutoriel ICI
- Et enfin avoir également lu le guide de base pour la création de plugin : ICI
Tout ces tutoriel sont dans la partie C# du forum, pour y accéder, il faudra vous y inscrire (explication ICI)
Voilà, maintenant que vous êtes pret, je vais pouvoir présenter le plugin de démonstration que je vais réaliser durant ce tutoriel
Par manque d'inspiration, j'ai choisi un sujet totalement inutile, mais cependant il couvre une large palette de fonctionnalités:
- Gestion des packets
- Utilisation de delegate
- Utilisation de configurations
J'expliquerai une dernière fonctionnalité dans l'annexe : la communication entre plugin
Donc, pour en revenir à notre plugin, il va simplement :
- Ecrire dans une RichTextbox les logs du jeux
- Et va faire également office de gestionnaire de tâches
Création de la library
Pour commencer, on va crée un nouveau projet de type "Bibliothèque de classes" (.dll)
Ensuite nous allons ajouter des Références à ce projet :
Loading Image
- EuuBot.Core
- EuuBot.Data
- EuuBot.Debugging
- EuuBot.Packets
- EuuBot.Relay.PluginInterfaces
Une fois ceci fait, on va ajouter un évènement post-build à notre projet, ceci va nous faciliter la tâche : On va demander à Visual Studio qu'après chaque génération de la library, il nous la copie dans le dossier "EuuBot.Relay\Plugins".
C'est très utile, car sinon, on doit le faire manuellement, assez embêtant.
Voici la démarche à suivre :
Clique droit sur le projet -> "Propriétés" -> Onglet "Compiler" -> "Evenements de build" -> "Modifier post-build" -> Puis :
Loading Image
Voici le code, il n'est pas très visible sur l'image :
copy /Y "$(TargetPath)" "MonPath\EuuBot.Relay beta 0.0.4420.15105\Plugins"
$(TargetPath) Signifie le chemin complet jusqu’à votre .dll, il faut double clique sur le macro pour l’insérer
MonPath\EuuBot.Relay beta 0.0.4420.15105\Plugins c'est le chemin complet jusqu'au dossier, ici pas de macro, il faut le faire manuellement
Une fois ceci fait, validez puis faites un test, (clique droit sur le projet-> Générer), si tout se passe bien, vous aurez votre .dll dans le dossier désiré, sinon il y a une erreur dans votre code.
Implantation des interfaces
Dans cette partie, je vais reprendre plusieurs point du Guide de création de plugins
On commence par importer les interfaces :
Imports EuuBot.Relay.PluginInterfaces
Puis ajoute un attribut à notre class, PluginInformation, dans lequel on renseigne dans l'ordre :
- Le nom du plugin
- Sa description
- Son auteur ( vous :D )
- Et sa version
Tout ceci en String
<PluginInformation("SampleVisualBasicPlugin", "Example for develop EuuBot.Relay plugin in VB.Net", "EuuBot Staff", "1.0.0")>
Public Class SampleVisualBasicPlugin
Puis, une fois ceci fait, commence par implanter les interfaces :
IConnectionPlugin: plugin qui est chargée lors d'une connection initiale. Ce type de plugin permet d'envoyer et de recevoir des packets.
C'est ce dont on a besoin dans notre cas (du moins pour ce plugin)
IFormPlugin: permet de charger un formulaire en tant qu'enfant MDI à l'intérieur du logiciel.
Nous en avons aussi besoin car notre plugin va contenir une WindowsForm
Ce qui nous donne :
<PluginInformation("SampleVisualBasicPlugin", "Example for develop EuuBot.Relay plugin in VB.Net", "EuuBot Staff", "1.0.0")>
Public Class SampleVisualBasicPlugin
Implements IFormPlugin, IConnectionPlugin
Une fois ceci fait, en pressant "Entrer" sur la ligne des Implements, il y a plusieurs méthodes qui apparaisse.
Avant d'aller plus loin, comme nous avons utilisé IFormPlugin, c'est le moment de créer notre form.
Ici c'est elle qui va tout gérer, ce n'est pas forcement le cas dans tout les plugins.
Vous pouvez récupérer le code à la fin du tutoriel.
Private _form As SampleVisualBasicForm
La Property "ForceAutoLoad" ( Fonctionnel prochainement )
C'est elle qui va définir si le plugin est loadé automatique à chaque nouvelle connection.
- True : Dans ce cas le plugin est loadé à chaque nouvelle connection
- False : Dans ce cas, on laisse le choix à l'utilisateur d'activer ou non ce plugin (à travers le PluginManager accessible sur l'interface de l'exe)
Dans le cas du plugin de démonstration, je préfère laisser le choix à l'utilisateur :
Public ReadOnly Property ForceAutoLoad As Boolean Implements EuuBot.Relay.PluginInterfaces.IConnectionPlugin.ForceAutoLoad
Get
Return False
End Get
End Property
Le Sub Initiate
Méthode qui communique au plugin le host qui l'a chargé. Un plugin host est un objet défini par l'engin de plugin qui permet de communiquer avec cet engin. Il contient des méthode qui servent par exemple à obtenir une référence vers un autre plugin, envoyer des packets ou encore à sauvegarder une configuration spécifique au plugin.
Ici, je vais simplement créer un nouvelle instance pour ma form et lui passer en paramètre le IPluginHost
Public Sub Initiate(ByVal host As EuuBot.Relay.PluginInterfaces.Host.IPluginHost) Implements EuuBot.Relay.PluginInterfaces.IPlugin.Initiate
_form = New SampleVisualBasicForm(host)
End Sub
Les Function de ProccessPacket
Méthode appelée par le plugin host lorsqu'un packet est reçu du serveur ou du client. L'objet ClientPacket ou ServerPacket peut être converti en un type plus spécifique dépendemment du protocol id (par exemple il est possible de convertir en MapComplementaryInformationDataMessage). C'est ici que vous interprètez les packets recues du serveur ou envoyer par le client.
Dans notre cas, je me contente également le lancer le sub sur ma form :
Public Function ProcessClientPacket(ByVal packet As EuuBot.Packets.ClientPacket) As EuuBot.Relay.PluginInterfaces.PacketAction Implements EuuBot.Relay.PluginInterfaces.IConnectionPlugin.ProcessClientPacket
_form.ProcessClientPacket(packet)
Return EuuBot.Relay.PluginInterfaces.PacketAction.Keep
End Function
Public Function ProcessServerPacket(ByVal packet As EuuBot.Packets.ServerPacket) As EuuBot.Relay.PluginInterfaces.PacketAction Implements EuuBot.Relay.PluginInterfaces.IConnectionPlugin.ProcessServerPacket
_form.ProcessServerPacket(packet)
Return EuuBot.Relay.PluginInterfaces.PacketAction.Keep
End Function
Il ne faut pas oublier de retourner un PacketAction
Chaque fois qu'un packet est gérer par un plugin, le host demande à ce plugin quoi faire avec. Si vous retournez PacketAction.Drop, le packet ne sera pas envoyer vers le client (ou vers le serveur, dépendemment du cas). Il est alors possible d'empecher le client d'envoyer certains messages ainsi que d'empecher le serveur d'en recevoir.
Ici je "Keep" les packets.
La Function GetForm()
Comme son nom l'indique, cette function retourne la form de notre plugin donc :
Public Function GetPluginForm() As System.Windows.Forms.Form Implements EuuBot.Relay.PluginInterfaces.IFormPlugin.GetPluginForm
Return _form
End Function
La région IDisposable
On peu la laisser tel-qu'elle est, elle est utile lorsque l'on des ressources à libérer (Thread ou autre)
Voilà, notre class est terminée :
Cliquez pour révéler
Cliquez pour masquer
<PluginInformation("SampleVisualBasicPlugin", "Example for develop EuuBot.Relay plugin in VB.Net", "EuuBot Staff", "1.0.0")>
Public Class SampleVisualBasicPlugin
Implements IFormPlugin, IConnectionPlugin
Private _form As SampleVisualBasicForm
Public ReadOnly Property ForceAutoLoad As Boolean Implements EuuBot.Relay.PluginInterfaces.IConnectionPlugin.ForceAutoLoad
Get
Return False
End Get
End Property
Public Sub Initiate(ByVal host As EuuBot.Relay.PluginInterfaces.Host.IPluginHost) Implements EuuBot.Relay.PluginInterfaces.IPlugin.Initiate
_form = New SampleVisualBasicForm(host)
End Sub
Public Function ProcessClientPacket(ByVal packet As EuuBot.Packets.ClientPacket) As EuuBot.Relay.PluginInterfaces.PacketAction Implements EuuBot.Relay.PluginInterfaces.IConnectionPlugin.ProcessClientPacket
_form.ProcessClientPacket(packet)
Return EuuBot.Relay.PluginInterfaces.PacketAction.Keep
End Function
Public Function ProcessServerPacket(ByVal packet As EuuBot.Packets.ServerPacket) As EuuBot.Relay.PluginInterfaces.PacketAction Implements EuuBot.Relay.PluginInterfaces.IConnectionPlugin.ProcessServerPacket
_form.ProcessServerPacket(packet)
Return EuuBot.Relay.PluginInterfaces.PacketAction.Keep
End Function
Public Function GetPluginForm() As System.Windows.Forms.Form Implements EuuBot.Relay.PluginInterfaces.IFormPlugin.GetPluginForm
Return _form
End Function
#Region "IDisposable Support"
Private disposedValue As Boolean ' Pour détecter les appels redondants
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: supprimez l'état managé (objets managés).
End If
' TODO: libérez les ressources non managées (objets non managés) et substituez la méthode Finalize() ci-dessous.
' TODO: définissez les champs volumineux à null.
End If
Me.disposedValue = True
End Sub
' TODO: substituez Finalize() uniquement si Dispose(ByVal disposing As Boolean) ci-dessus comporte du code permettant de libérer des ressources non managées.
'Protected Overrides Sub Finalize()
' ' Ne modifiez pas ce code. Ajoutez du code de nettoyage dans Dispose(ByVal disposing As Boolean) ci-dessus.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' Ce code a été ajouté par Visual Basic pour permettre l'implémentation correcte du modèle pouvant être supprimé.
Public Sub Dispose() Implements IDisposable.Dispose
' Ne modifiez pas ce code. Ajoutez du code de nettoyage dans Dispose(ByVal disposing As Boolean) ci-dessus.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
Maintenant, on s’intéresse à la form, car c'est elle qui va tout gérer.
Je ne vais pas en parler ici, j'ai commenté mon code, je pense que vous pourrez le comprendre à la lecture
Debogage
Pour déboguer la dll, il va falloir l'attacher au processus de EuuBot.Relay.Interface :
1°) On lance EuuBot.Relay.Interface
2°) Dans Visual Studio, on se rend dans le menu "Outis", ensuite "Attacher au processus..."
3°) On sélectionne le processus EuuBot.Relay.Interface.exe et on valide
4°) On start le server de EuuBot
5°) On se connecte sur le jeux
Ainsi, on pourra contrôler tous ce qui se passe dans notre dll.
Annexe
Pour la communication entre plugins, on va également utiliser le IPluginHost :
_host.GetPlugin(Of T)()
T est le type du plugin, comme par exemple SampleVisualBasicPlugin
Ce code retourne le plugin du type spécifié
Pour envoyer un packet au server, on passe également par le IPluginHost :
_host.SendToServer(MonClientPacket)
On peu également simuler l'envoi d'un packet au client, pour obtenir quelque chose dans le même genre que ceci
Avec
_host.SendToClient(MonServerPacket)
Voilà, ce tutoriel est fini, si vous avez bien tout lu, je pense que vous pouvez vous lancer dans le développement de plugin pour EuuBot.Relay.
En cas de problème, n'hésitez pas à poser des questions, nous y répondrons au plus vite
Bonne journée