Skip to content
Timorem edited this page Oct 13, 2012 · 1 revision

BiM utilise une méthode dynamique pour créer des fichiers de configurations qui permettent de modifier des valeurs en général statique depuis un fichier .xml

On différencie deux choses :

  • La configuration du programme en général (BiM.Core.Config)
  • Les préférences associés à un personnage (BiM.Behaviors.Settings)

Configuration du bot

Au démarrage le bot une nouvelle instance de la class Config est créé. Celle-ci va enregistrer dans toutes les assemblies chargés les champs statiques ayant un attribut [Configurable]. Il associe chaque champ à une clé donnée par [Configurable]. Ensuite il charge le fichier config.xml, ce fichier contient des clés associés à des clés. A partir des clés il va retrouver les champs correspondant à chaque entrée du fichier xml et leur assigne la valeur lu depuis le fichier.

La configuration est ensuite sauvegardé à l'appel de la méthode Save() (à l'arrêt du bot)

Ainsi un champ configurable se présente sous la forme

[Configurable("DefaultBotTick", "The interval (ms) between two message dispatching")]
public static int DefaultBotTick = 100;

Et dans le xml

<Key name="DefaultBotTick" comment="The interval (ms) between two message dispatching">
  <int>100</int>
</Key>

Rien de compliqué

Les préférences

Les préférences (ou settings en anglais) servent à garder les préférences de l'utilisateur pour la configuration d'un personnage. Par exemple un plugin de combat doit retrouver la configuration de l'I.A. pour un même personnage.

Pour cela il existe la classe BotSettings qui est initialisé au moment de la séléction du personnage (CharacterSelectedSuccessMessage). Cette classe charge un fichier xml dans un dossier au nom du compte et un fichier au nom du personnage (configurable depuis l'entrée SettingsFile). Cette classe va charger de la même manière des valeurs associés à des clés, mais cette fois ci les clés désignent une classe unique.

Le principe est que qu'un plugin dispose d'un classe héritant de SettingsEntry et qui surcharge la propriété EntryName qui doit donner une clé unique (le nom du plugin en général). Cette classe contient des propriétés diverses qui désignent les préférences de l'utilisateur. Pour récupérer ces préférences il faut appeler la méthode GetEntry() de BotSettings. T désigne la classe héritant SettingsEntry. A ce moment là BotSettings va chercher dans les valeurs préalablement chargés du fichier xml une entrée ayant pour clé la valeur d'EntryName et si elle est trouvé, elle sera désérialisé, sinon une nouvelle instance est créé en appelant le constructeur par défaut. A l'arrêt du bot, les valeurs sont sauvegardés.

De cette manière les préférences sont gardés d'une connexion à l'autre et sont dépendantes d'un personnage, non du programme.

Petit exemple

public class Settings : SettingsEntry
{
    public Settings()
    {
        WelcomeMessage = "Welcome";
    }
    public override string EntryName
    {
       get
       {
           return "SimplePlugin";
       }
    }

    public string WelcomeMessage
    {
       get;
       set;
    }
}

public class WelcomeMessage
{
    private bool m_messageSent;
    [MessageHandler(typeof(GameContextCreateMessage))]
    public void HandleGameContextCreateMessage(Bot bot, GameContextCreateMessage message)
    {
        if (!m_messageSent)
        {
            var settings = bot.Settings.GetEntry<Settings>();

            bot.Character.SendMessage(settings.WelcomeMessage);

            if (settings.WelcomeMessage.EndsWith("!"))
                settings.WelcomeMessage = settings.WelcomeMessage.Remove(settings.WelcomeMessage.Length - 1, 1);
            else
                settings.WelcomeMessage += "!";

            m_messageSent = true;
        }
    }
}

Clone this wiki locally