Documentation sur la création d'AddOn

Répondre
Partager Rechercher


https://jolstatic.fr/war/equipe/58156/logo_jol.png

Avec Warhammer Online, il est possible de créer ses propres Interfaces Personnalisées et ses propres Add-on. Cet article se propose de vous guider dans la création de votre propre Add-On en vous donnant les informations minimales pour y arriver.


Attention, il est indispensable d'avoir un minimum de connaissances en Informatique pour comprendre comment cela fonctionne. Cet article n'a pas pour but de vous apprendre à programmer ni de vous apprendre les termes techniques.

Afin de mieux comprendre l'article, vous devez avoir des connaissances en XML et dans le langage de script LUA. Des notions en anglais sont aussi indispensable si vous voulez vraiment avoir toutes les documentations nécessaires pour faire vos AddOns.

Il est à noter que les informations de ce sujet peuvent évoluer à tous moment suivant le bon vouloir de Mythic. En effet, Mythic va certainement retirer, modifier ou ajouter des API pour répondre, éviter tout abus et aider la communauté. De plus, Mythic n'a toujours pas donné la documentation de l'API Warhammer Online. Il peut donc y avoir des erreurs dans cet article.




Que peut-on faire avec un AddOn ?


C'est certainement la question la plus importante pour beaucoup de personnes !

Les exemples étant plus parlant qu'un long discours, je vais donner quelques exemples des choses qui sont possible et impossible à faire.

Les AddOn possible sont (liste non exhaustive) :
  • Modifier les fenêtres de l'UI
  • Faire des HUD
  • Modifier l'affichage des buffs/debuffs
  • Faire des textes de combats défilant
  • Modifier les fenêtres d'aide (tooltips)
  • Gérer les fenêtres de discussions
  • Auto-loot
  • Vendre automatique ses objets à un marchand en lui parlant
  • Faire/Modifier des barres d'actions (attention, les modifications ont des limitations pour éviter tout abus)
Les AddOn impossible sont (liste non exhaustive) :
  • Afficher la cible de la cible (pour un ennemi)
  • Obtenir des informations sur un ennemie (spécialisation, équipement, etc...)
  • Afficher la barre d'incantation d'un ennemi
  • Afficher des liens vers la description d'objet
  • Obtenir la position d'une personne sur la carte (sauf pour les personnes du groupe)
  • Changer le fait que les boutons ne sont cliquable que par le bouton gauche de la souris
  • Obtenir l'heure IRL
En parallèle de cela, des personnes travaillent pour essayer par des astuces de simuler des AddOn (obtenir l'heure IRL, obtenir la cible de la cible amie, etc...). Mais cela reste des astuces et l'API ne permet pas de le faire par défaut.



Comment s'organise un AddOn ?


Tout d'abord, il faut savoir qu'un AddOn est composé :
  • d'un fichier NomDeVotreAddOn.mod : ce fichier est obligatoire
  • de fichiers XML : ce sont les templates pour vos fenêtres
  • de fichiers LUA : ce sont les scripts
  • de tous les fichiers que vous voulez (audio, texture, etc.... tant que vous respectez les formats autorisés)
Un AddOn comporte plusieurs points obligatoires afin qu'il puisse fonctionner. Le répertoire où se situe les AddOns est par défaut : <répertoire d'installation War>\Interface\AddOns

Le premier de ces points concerne l'arborescence des fichiers et des répertoires. Votre AddOn doit respecter l'arborescence ci-dessous :

https://jolstatic.fr/upload/perso/111853/war/guide/ui/tree.jpg


Le second point concerne l'organisation du répertoire de votre AddOn : elle est pratiquement libre ! Les 3 seules choses obligatoires sont :
  • que le fichier NomDeVotreAddOn.mod se situe à la racine de votre répertoire NomDeVotreAddOn
  • que le nom du répertoire de votre AddOn soit identique à l'attribut name de la balise UiMod (dans le fichier NomDeVotreAddOn.mod).
  • que votre répertoire d'AddOn se situe dans le répertoire des AddOn !
Le répertoire de votre AddOn peut contenir des dossiers dans le cas où vous voudriez organiser proprement votre AddOn (un répertoire pour les textures, les sons, les scripts LUA, etc... par exemple). De même, vous pouvez mettre autant de fichiers que vous le voulez.


Le dernier point concerne la configuration générale des AddOns. Cette configuration se situe dans le fichier UserSetting.xml qui se trouve dans le répertoire <répertoire d'installation War>\user.
Dans ce fichier si vous allez vers la fin, vous trouverez une ligne qui ressemble à cela (à quelques valeurs près) :

Code:
    <Interface global_ui_scale="0.755005" lock_action_bars="1" mouse_sensitivity="0.50" save_settings_per_character="false" warn_on_sell="false" warn_on_buy="false">
        <MainUI path="Interface/Custom" enabled="false" />
        <AddOns path="Interface/AddOns" />
    </Interface>
Il est possible de modifier ces lignes pour modifier votre Interface Personnalisée ainsi que le répertoire où doivent se situer les AddOns (la raison pour laquelle j'explique ce fichier).

Les attributs de la balise Interface sont :
  • global_ui_scale qui permet d'indiquer l'échelle de l'UI.
  • lock_action_bars qui permet d'indiquer si les Compétences sur les barres d'actions sont bloquées ou pas. Les 2 valeurs possibles sont 0 (les barres de compétences ne sont pas bloquées) et 1 (les barres de compétences sont bloquées).
  • mouse_sensitivity qui permet d'indiquer la sensibilité de la souris.
  • save_settings_per_character qui permet d'indiquer si la configuration est commune à tous nos personnages ou pas. Les 2 valeurs possibles sont true (la configuration est différente pour les personnages) et false (la configuration est commune à tous les personnages).
  • warn_on_sell qui permet d'indiquer si on reçoit un avertissement quand on vend un objet. Les 2 valeurs possibles sont true (on reçoit l'avertissement) et false (on ne reçoit pas l'avertissement).
  • warn_on_buy qui permet d'indiquer si on reçoit un avertissement quand on achète un objet. Les 2 valeurs possibles sont true (on reçoit l'avertissement) et false (on ne reçoit pas l'avertissement).

Attention il est à noter que pendant la bêta, les AddOns fournis par Mythic n'étaient pas sous cette arborescence. En effet, l'arborescence était <répertoire d'installation War>\user\interface\AllCharacters.


Le fichier .mod



Ce fichier permet d'indiquer le nom de l'Add-On, sa description et quels sont les fichiers à charger lors des différents événements possibles (entre autre). Il faut voir ce fichier comme le chef d'orchestre de votre AddOn. C'est grâce à ce fichier que tous les éléments de votre AddOn seront coordonnés.


Le fichier .mod est basé sur une syntaxe XML. Un exemple de fichier .mod est indiqué ci-dessous (il n'y a pas toutes les balises et toutes les options possibles dans cet exemple):


Code:
 <?xml version="1.0" encoding="UTF-8"?>
   <ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <UiMod name="MonScrollText" version="3.2" date="01/09/2008" >
           <Author name="Jion" email="jion@JeuxOnLine.info" />
           <Description text="Mon AddOn permet de modifier le texte et la couleur affiché pour les ScrollText" />
           <Dependencies>
               <Dependency name="Tic" />
               <Dependency name="Tac" />
           </Dependencies>
         <Files>
               <File name="source\xml\Fichier1.xml" />
               <File name="source\xml\Fichier2.xml" />
               <File name="source\lua\script1.lua" />
           </Files>
         <SavedVariables>
              <SavedVariable name="mst_userParam" />
          </SavedVariables>
        <OnInitialize>
              <CallFunction name="MonScrollText.Initialize" />
          </OnInitialize>
          <OnUpdate/>
          <OnShutdown/>
       </UiMod>
   </ModuleFile>
Vous trouvez cela compliquer ? Alors lisez la suite et ce fichier vous paraîtra très clair à la fin de cette partie


Les balises disponibles


Voici l'arborescence valide pour les balises du fichier .mod (représentation graphique du schéma XSD):

https://jolstatic.fr/upload/perso/111853/war/guide/ui/schema_fileMod.jpg

Les balises entourées en trait plein sont obligatoires.
Les balises entourées en pointillé sont optionnelles.


Signification des balises


ModuleFile et UiMod

Ce sont les 2 balises mères du fichier XML .mod. Ces 2 balises sont obligatoires pour avoir un fichier valide.

La balise UiMod possède 3 attributs qui sont :
  • name qui correspond au nom de l'AddOn. Attention, comme indiqué plus haut, il est obligatoire d'avoir le nom de votre AddOn identique au nom du répertoire que vous avez créer dans Interface\Addons
  • version qui correspond à la version de l'AddOn
  • date qui correspond à la date de la création de l'AddOn ou de sa dernière mise à jour. La date doit être au format DD/MM/YYYY.
Par exemple, si vous en êtes à la version 3.2 de votre AddOn MonScrollText et que vous ayez modifié cet AddOn le 1 septembre 2008, vous aurez quelque chose de ce genre :

Code:
<?xml version="1.0" encoding="UTF-8"?>
<ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <UiMod name="MonScrollText" version="3.2" date="01/09/2008" >        
    </UiMod>
</ModuleFile>
Il faut aussi savoir que les attributs de la balise UiMod seront visible dans le jeu sur la fenêtre de votre AddOn.

Author
et Description


La balise Author permet de spécifier des informations sur l'auteur de l'AddOn.

Cette balise possède 2 attributs qui sont :
  • name qui correspond au nom de l'auteur (ou à son pseudo)
  • email qui correspond à l'adresse mail de l'auteur
La balise Description sert quant à elle à donner des informations sur la nature de l'AddOn.

Cette balise possède 1 attribut qui est :
  • text qui correspond à la description de l'AddOn
Les attributs de la balise Author ainsi que l'attribut de la balise Description sont visibles dans le jeu sur la fenêtre de votre AddOn.


En reprenant mon exemple précédent, vous aurez quelque chose de ce genre :

Code:
<?xml version="1.0" encoding="UTF-8"?>
<ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <UiMod name="MonScrollText" version="3.2" date="01/09/2008" >
        <Author name="Jion" email="jion@JeuxOnLine.info" />
        <Description text="Mon AddOn permet de modifier le texte et la couleur affiché pour les ScrollText" />
    </UiMod>
</ModuleFile>


Dependencies et Dependency


La balise Dependencies va servir à indiquer les AddOns qui sont nécessaires au bon fonctionnement de votre AddOn. Ces AddOns seront chargés avant le votre : c'est en quelque sorte un pré-requis pour le bon fonctionnement de votre AddOn. Il est possible d'y mettre tous les AddOns même ceux proposés par défaut par Mythic.
Chaque dépendance d'AddOn doit être indiqué par la balise Dependency.

La balise Dependency possède 1 attribut qui est :
  • name qui correspond au nom de l'AddOn qui doit être chargé
Il faut mettre autant de balise Dependency que le nombre d'AddOn dont vous avez besoin.

En reprenant mon exemple précédent, vous aurez quelque chose de ce genre si on suppose que vous avez besoin de l'AddOn Tic et de l'AddOn Tac:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <UiMod name="MonScrollText" version="3.2" date="01/09/2008" >
        <Author name="Jion" email="jion@JeuxOnLine.info" />
        <Description text="Mon AddOn permet de modifier le texte et la couleur affiché pour les ScrollText" />
        <Dependencies>
            <Dependency name="Tic" />
            <Dependency name="Tac" />
        </Dependencies>
    </UiMod>
</ModuleFile>


Files et File


La balise Files permet d'indiquer la liste des fichiers qui sont inclus dans votre AddOn. Cette balise permet de charger en mémoire tous les fichiers qui sont nécessaires au fonctionnement de votre AddOn. Lors du chargement en mémoire, il y a 2 possibilités :
  • si le fichier est un fichier XML alors le fichier est parser par le parser XML
  • si le fichier est un fichier LUA alors le fichier sera exécuté en tant que script LUA
Chaque fichier doit être indiquer par la balise File. Il est important de noter que le chargement des fichiers prendra en compte l'ordre indiqué dans la balise Files.

La balise File possède 1 attribut qui est :
  • name qui correspond au chemin relatif du fichier par rapport au répertoire de l'AddOn. Ce paramètre ne prend en charge qu'un seul fichier.
En reprenant mon exemple précédent, vous aurez quelque chose de ce genre si on suppose que vous avez besoin des fichiers Fichier1.xml, Fichier2.xml, script1.lua qui se trouvent respectivement dans le répertoire source\xml, source\xml et source\lua :

Code:
<?xml version="1.0" encoding="UTF-8"?>
 <ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <UiMod name="MonScrollText" version="3.2" date="01/09/2008" >
         <Author name="Jion" email="jion@JeuxOnLine.info" />
         <Description text="Mon AddOn permet de modifier le texte et la couleur affiché pour les ScrollText" />
         <Dependencies>
             <Dependency name="Tic" />
             <Dependency name="Tac" />
         </Dependencies>
        <Files>
             <File name="source\xml\Fichier1.xml" />
             <File name="source\xml\Fichier2.xml" />
             <File name="source\lua\script1.lua" />
         </Files>
     </UiMod>
 </ModuleFile>
Un petit conseil de ma part sur cela. Je vous conseille de bien répartir vos fichiers dans différents répertoires et sous-répertoire. Vous verrez, il sera beaucoup plus simple par la suite pour pouvoir chercher/ajouter/supprimer/modifier des fichiers dans vos AddOns.


SavedVariables et SavedVariable

La balise SavedVariables va servir à indiquer toutes les variables que vous voulez sauvegarder. Cette balise est très importante car c'est grâce à elle que vous pourrez sauvegarder des informations et que votre AddOn pourra ré-utiliser ces informations lors de son prochain chargement. C'est avec ce procédé que l'on peut sauvegarder les paramètres utilisateurs de l'AddOn par exemple.
Avec ce procédé, on ne peut sauvegarder que des variables globales LUA. Il est à noter que la variable peut être un tableau.

Au sein de la balise SavedVariables, il faudra utiliser la balise SavedVariable pour indiquer les variables que vous souhaitez sauvegarder. Il faudra autant de balise SavedVariable que de variable à sauvegarder.

La balise SavedVariable possède 1 attribut qui est :
  • name qui correspond au nom de la variable globale LUA à sauvegarder. Il est à noter que si cette variable ne contient pas de valeur, la valeur NIL sera mis par défaut lors du chargement de cette variable.
En reprenant mon exemple précédent, vous aurez quelque chose de ce genre si on suppose que vous avez besoin de sauvegarder la variable mst_userParam qui est un tableau contenant tous les paramètres utilisateurs de votre AddOn :

Code:
<?xml version="1.0" encoding="UTF-8"?>
  <ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <UiMod name="MonScrollText" version="3.2" date="01/09/2008" >
          <Author name="Jion" email="jion@JeuxOnLine.info" />
          <Description text="Mon AddOn permet de modifier le texte et la couleur affiché pour les ScrollText" />
          <Dependencies>
              <Dependency name="Tic" />
              <Dependency name="Tac" />
          </Dependencies>
        <Files>
              <File name="source\xml\Fichier1.xml" />
              <File name="source\xml\Fichier2.xml" />
              <File name="source\lua\script1.lua" />
          </Files>
        <SavedVariables>
             <SavedVariable name="mst_userParam" />
         </SavedVariables>
      </UiMod>
  </ModuleFile>
Trois petits conseils de ma part sur ce sujet.
Le premier conseil concerne le nommage de vos variables. Je vous conseille de trouver une abréviation pour votre AddOn et de préfixer tous les noms de vos variables par cette abréviation suivi d'un underscore. Donc si je prend le nom de mon AddOn de l'exemple MonScrollText, l'abréviation serait mst. Si j'ai besoin d'avoir une variable nommé var alors je la nommerai mst_var. Pourquoi faire cela ? Tout simplement pour ne pas mélanger les variables entre les différents AddOn. Vu que certaines variables sont globales, cela évite d'entrer en conflit dans le cas où une autre personne aurait eu l'idée d'appeler une variable avec le même nom.
Le deuxième conseil qui peut vous être utile et le fait d'utiliser des tableaux pour sauvegarder vos variables. D'une part cela vous simplifiera la gestion de votre fichier .mod et d'autre part cela permet de rassembler toutes les variables dans un même endroit.
Le troisième conseil est de toujours vérifier la valeur de la variable ! Si la valeur est NIL c'est que la variable n'a jamais été renseigné/utilisé. Cela vous évitera bien des erreurs par la suite.


OnInitialize, OnUpdate et OnShutdown

Ces 3 balises servent à lancer des actions à certains moments spécifiques. Ce n'est pas vous qui décidez quand ces actions seront appelées mais le programme lui-même qui sait quand il doit appelé ces actions.

La balise OnInitialize permet d'indiquer les actions à effectuer lors du chargement de votre AddOn (typiquement quand la personne active votre AddOn directement en jeu ou quand la personne se connecte avec son personnage). A l'inverse la balise OnShutdown permet d'indiquer les actions à effectuer lors de la fermeture de votre AddOn (typiquement quand la personne désactive votre AddOn directement en jeu ou quand la personne se déconnecte avec son personnage). La balise OnUpdate permet d'indiquer les actions à effectuer périodiquement.

Pour indiquer les actions à faire, il existe 2 balises qui sont : CallFunction et CreateWindow. Vous pouvez utiliser autant de balises que nécessaires pour indiquer les actions à faire.

La balise CallFunction permet d'appeler des fonctions LUA. Cette balise possède 1 attribut qui est :
  • name qui correspond au nom de la fonction LUA à lancer. Il faut indiquer le nom complet de la fonction (mais sans mettre les parenthèses).
Il est à noter que si l'appel de la balise CallFunction se fait dans la balise OnUpdate, la fonction recevra en paramètre un nombre qui indiquera le nombre de seconde écoulé depuis le dernier appel de la balise OnUpdate.


La balise CreateWindow permet d'ajouter une action qui crée un fenêtre. Cette balise possède 2 attribut qui est :
  • name qui correspond au nom de la fenêtre spécifié dans le fichier XML décrivant les fenêtres.
  • show qui permet d'indiquer si la fenêtre doit être visible ou pas. Les 2 valeurs possibles sont true (la fenêtre est visible) et false (la fenêtre n'est pas visible).
En reprenant mon exemple précédent, vous aurez quelque chose de ce genre si on suppose que vous avez une fonction Initialize a appelé lors du chargement de votre UI et aucun autre événement :

Code:
<?xml version="1.0" encoding="UTF-8"?>
  <ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <UiMod name="MonScrollText" version="3.2" date="01/09/2008" >
          <Author name="Jion" email="jion@JeuxOnLine.info" />
          <Description text="Mon AddOn permet de modifier le texte et la couleur affiché pour les ScrollText" />
          <Dependencies>
              <Dependency name="Tic" />
              <Dependency name="Tac" />
          </Dependencies>
        <Files>
              <File name="source\xml\Fichier1.xml" />
              <File name="source\xml\Fichier2.xml" />
              <File name="source\lua\script1.lua" />
          </Files>
        <SavedVariables>
             <SavedVariable name="mst_userParam" />
         </SavedVariables>
        <OnInitialize>
             <CallFunction name="MonScrollText.Initialize" />
         </OnInitialize>
         <OnUpdate/>
         <OnShutdown/>
      </UiMod>
  </ModuleFile>
Un conseils de ma part sur ce sujet. Pour la clarté de votre fichier .mod et de votre code, je vous conseille de ne faire qu'une seule fonction d'initialisation, de mise à jour et de fermeture. Il est beaucoup simple de se relire ensuite plutôt que de devoir chercher à 5-6 endroits différents pour avoir toutes les actions que l'on fait lors d'une phase.


La liste des AddOns d'EA Mythic


Comme indiqué dans la partie précédente, il est possible avec la balise Dependencies de spécifier les AddOns que l'on veut utiliser pour le bon fonctionnement de notre AddOn. Vu qu'il est possible d'inclure les AddOn de Mythic, voici la liste complète des AddOns par défaut du jeu :
  • EASystem_ActionBarClusterManager
  • EASystem_DialogManager
  • EASystem_EventText
  • EASystem_LayoutEditor
  • EASystem_ResourceFrames
  • EASystem_Strings
  • EASystem_TargetInfo
  • EASystem_ThreePartBar
  • EASystem_Tooltips
  • EASystem_Utils
  • EASystem_WindowUtils
  • EATemplate_DefaultWindowSkin
  • EATemplate_Icons
  • EATemplate_ParchmentWindowSkin
  • EATemplate_UnitFrames
  • EA_AbilitiesWindow
  • EA_ActionBars
  • EA_AlertTextWindow
  • EA_AlertTrackerWindow
  • EA_AppealWindow
  • EA_AuctionHouseWindow
  • EA_BackpackWindow
  • EA_BankWindow
  • EA_BattleGroupHUD
  • EA_BattlegroupWindow
  • EA_BugReportWindow
  • EA_CareerResourcesWindow
  • EA_CastTimerWindow
  • EA_CharacterWindow
  • EA_ChatSystem
  • EA_ChatWindow
  • EA_CityInstanceSelecionWindow
  • EA_ContextMenu
  • EA_CraftingWindow
  • EA_CultivationWindow
  • EA_Cursor
  • EA_CustomizeUiWindow
  • EA_DeathWindow
  • EA_FeedbackWindow
  • EA_GrantedAbilityWindow
  • EA_GroupWindow
  • EA_GuildWindow
  • EA_HelpWindow
  • EA_InspectionWindow
  • EA_InteractionWindow
  • EA_InternalBuffs
  • EA_ItemEnhancementWindow
  • EA_ItemStackingWindow
  • EA_KeyMappingWindow
  • EA_LegacyTemplates
  • EA_LoadingScreen
  • EA_LootWindow
  • EA_MacroWindow
  • EA_MailWindow
  • EA_MainMenuWindow
  • EA_MenuBarWindow
  • EA_ModifyItem
  • EA_MoraleWindow
  • EA_MouseOverTargetWindow
  • EA_OpenPartyWindow
  • EA_OverheadMapWindow
  • EA_PlayerMenu
  • EA_PlayerStatusWindow
  • EA_PQLootWindow
  • EA_PublicQuestTracker
  • EA_QuestTrackerWindow
  • EA_RpBarWindow
  • EA_ScenarioGroupWindow
  • EA_ScenarioLobbyWindow
  • EA_ScenarioSummaryWindow
  • EA_ScreenFlashWindow
  • EA_SettingsWindow
  • EA_SiegeWeaponWindow
  • EA_SocialWindow
  • EA_SurveyWindow
  • EA_TacticsWindow
  • EA_TargetWindow
  • EA_TomeAlertWindow
  • EA_TomeOfKnowledge
  • EA_TradeWindow
  • EA_UiDebugTools
  • EA_UiModWindow
  • EA_VoiceWindow
  • EA_WorldMapWindow
  • EA_WorldTargetWindow
  • EA_XpBarWindow
Je n'ai pas fait la correspondance avec leur utilisation car les noms sont très clairs.


Les fichiers XML


Les fichiers XML servent à décrire le template de vos fenêtres. Dans les API de Warhammer Online, il n'existe pas de fenêtre par défaut. Il y a seulement 2 fonctions que l'on peut utiliser :
- CreateWindow(window, visible)
- CreateWindowFromTemplate(src_window, template_window, parent_window)

C'est cette deuxième fonction qui est le plus souvent utilisé. En effet, de cette façon on peut créer très rapidement plusieurs fenêtres ayant la même forme/propriété (par exemple, pour les warband au lieu de créer une grosse fenêtre, on en crée une par joueur)

Les fichiers XML sont basés sur une syntaxe XML. Un exemple de fichier .xml est indiqué ci-dessous (il n'y a pas toutes les balises et toutes les options possibles dans cet exemple):

Code:
<Interface xmlns:xsi="http://wutf-8.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Interface.xsd">
    <Scripts>
        <Script file="CleanGroupWindow.lua" />
    </Scripts>
    <Windows>
        <Window name="CleanGroupWindow" skipinput="true" >
            <Size>
                <AbsPoint x="200" y="520" />
            </Size>
            <Anchors>
                <Anchor point="bottomleft" relativePoint="topleft" relativeTo="CleanPlayerWindow">
                    <AbsPoint x="0" y="48" />
                </Anchor>
            </Anchors>
        </Window>
    </Windows>
</Interface>

Les balises disponibles


Voici l'arborescence valide pour les balises du fichier .xml (représentation graphique du schéma XSD):

https://jolstatic.fr/upload/perso/111853/war/guide/ui/schema_fichierXML.jpg

Les balises entourées en trait plein sont obligatoires.
Les balises entourées en pointillé sont optionnelles.
Il est à noter aussi que certaines balises (par exemple EventHandlers) sont communes à plusieurs balises.
De même, il est à noter que la balise Window peut contenir la balise Windows qui elle-même peut contenir la balise Window, etc...

Attention, il existe apparemment d'autres balises depuis la création de ce diagramme. Je les ai ajouté dans la partie traitant des balises sans avoir modifier le schéma ci-dessus.

Base du fichier XML


Tous les fichiers XML doivent au minimum avoir le texte suivant :

Code:
<?xml version="1.0" encoding="UTF-8"?>
<Interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="../../Interface.xsd">

</Interface>
Les différentes balises que vous utiliserez seront à ajouter dans la balise Interface.


Signification des balises


Je vais commencer ma description par les 3 conteneurs de bases qui sont : Windows, Scripts et Assets. Je continuerais pas les balises qui sont utilisées pour créer vos fenêtres.


Windows

Cette balise permet de décrire le template de vos fenêtres. Ces fenêtres étant chargées dans l'interface en jeu. Il est possible de faire des sous-fenêtre avec cette balise (en imbriquant les balises Windows)

Cette balise ne prend aucun paramètre.

Cette balise est utilisable dans la balise suivante : Interface.


Scripts et Script

La balise Scripts permet d'indiquer les script LUA dont vous avez besoin pour ce fichier XML. Ces scripts seront chargés au moment du chargement de votre fichier XML. Chaque script dont vous avez besoin devront être appeler à l'aide de la balise Script.

La balise Scripts ne prend aucun paramètre.

La balise Scripts est utilisable dans la balise suivante : Interface.



La balise Script permet d'indiquer les scripts LUA dont vous avez besoin pour ce fichier XML. Ces scripts seront chargés au moment du chargement de votre fichier XML. Vous devez utiliser autant de balise Script que le nombre de fichiers dont vous avez besoin.

La balise Script possède 1 paramètre qui est :
  • file qui correspond au chemin du fichier LUA à charger. Le chemin possède pour base le répertoire de votre AddOn.
La balise Script est utilisable dans la balise suivante : Scripts.


Il est à noter que l'utilisation de la balise Scripts n'est pas obligatoire. En effet, ilest possible de spécifier les scripts dont vous avez besoin de votre fichier .mod (voir la partie traitant du fichiers .mod pour plus de détails).


Un exemple de l'utilisation de la balise Scripts est :

Code:
<?xml version="1.0" encoding="UTF-8"?>
<Interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="../../Interface.xsd">
<Scripts>
   <Script file="source/MonFichier.lua"/>
</Scripts>
</Interface>


Assets


Cette balise permettait de charger des textures et des icônes pour votre AddOn. Depuis la fin de la bêta, cette balise ne fonctionne plus (désactiver par Mythic ou un bug) : les textures sont bien chargées par le jeu mais c'est la texture "no texture" (en rose/violet) qui apparait dans le jeu ! Je décrit donc vite fait les différentes balises que l'on pouvait y trouver dès fois qu'un jour la balise Assets refonctionne. Cette balise pouvait contenir les balises suivantes : Icon, Texture et Slice.

La balise Assets ne prend aucun paramètre.

La balise Assets est utilisable dans la balise suivante : Interface.


La balise Icon possède 3 paramètres qui sont :
  • id qui est numérique.
  • texture qui fait référence au fichier .dds.
  • name qui est une chaîne de caractère.
Cette balise permettait de charger des icônes.
La balise Icon est utilisable dans la balise suivante : Assets.


La balise Texture possède 2 paramètres qui sont :
  • name qui est une chaîne de caractères.
  • file qui fait référence au fichier .dds.
Cette balise permettait de charger des textures.
La balise Icon est utilisable dans la balise suivante : Assets.


La balise Slice possède 5 paramètres qui sont :
  • id qui est le nom utilisé pour cette texture.
  • left qui est numérique.
  • top qui est numérique.
  • width qui est numérique.
  • height qui est numérique.
Cette balise permettait d'indiquer les coordonnées (left, top, width, height) de la texture à charger dans le fichier .dds.
La balise Slice est utilisable dans la balise suivante : Texture.



Window
La balise Window permet de définir une fenêtre. Cette fenêtre sera visible en jeu (contrairement à la balise Windows qui n'affiche rien en soit).


La balise Window possède 9 paramètres qui sont :
  • name qui correspond au nom de la fenêtre. Ce paramètre est obligatoire.
  • handleinput. Ce paramètre est optionnel.
  • skipinput. Ce paramètre est optionnel.
  • layer. Ce paramètre est optionnel.
  • sticky. Ce paramètre est optionnel.
  • savesettings. Ce paramètre est optionnel.
  • movable permet d'indiquer si l'on peut bouger la fenêtre ou pas. Ce paramètre est optionnel.
  • popable permet d'indiquer si la fenêtre est de type pop-up ou pas. Ce paramètre est optionnel.
  • inherits permet d'indiquer de quel fenêtre elle dépend. Ce paramètre est optionnel.

La balise Window est utilisable dans la balise suivante : Windows.



Size
La balise Size permet d'indiquer la taille de la fenêtre parent. En général, elle est souvent utilisé en association avec la balise AbsPoint.


La balise Size ne possède pas de paramètres.


La balise Size est utilisable dans les balises suivantes : Window et les balises qui sont utilisables dans Window.


AbsPoint
La balise Window permet d'indiquer les valeurs x et y pour les balises qui en ont besoin (comme par exemple la balise Size).


La balise AbsPoint possède 2 paramètres qui sont :
  • x qui correspond à la valeur horizontale. Ce paramètre est obligatoire.
  • y qui correspond à la valeur verticale. Ce paramètre est obligatoire.

La balise AbsPoint est utilisable dans les balises suivantes : Size
et Anchor.


Anchors
La balise Anchors permet de créer un conteneur de balise Anchor. Cela permet d'indiquer où la fenêtre sera positionné en jeu. Une fenêtre peut avoir une ou deux Anchors. S'il y en a un seul, la taille de la fenêtre est généralement fixe. Tandis que s'il y en a 2, la fenêtre sera redimensionné pour ajuster à l'Anchors. La deuxième solution étant utilisée principalement pour attacher une fenêtre à côté d'une autre fenêtre.


La balise Anchors ne possède pas de paramètres.
La balise Anchors est utilisable dans les balises suivantes : Window et les balises qui sont utilisables dans Window.


Anchor


La balise Anchor possède 3 paramètres qui sont :
  • point. permet d'indiquer où l'Anchor sera attaché dans le fenêtre spécifié avec le paramètre relativeTo. Ce paramètre est obligatoire.
  • relativePoint permet d'indiquer si l'on veux utiliser un offset (décalage) pour l'affichage de cet Anchor. C'est un paramètre optionnel. A noter qu'il est aussi possible de spécifier un offset en utilisant la balise AbsPoint.
  • relativeTo. permet d'indiquer à quel fenêtre cet Anchor est associé. C'est un paramètre optionnel. Si ce paramètre n'est pas spécifié, c'est la fenêtre parent qui est attribuée.

La balise Anchor est utilisable dans la balise suivante :
Anchors.


EventHandlers
Cette balise permet de définir des handlers. Pour plus de détails, vous pouvez aussi vous référer à la partie concernant le fichier .mod.


La balise EventHandlers ne possède pas de paramètres.
La balise EventHandlers est utilisable dans les balises suivantes : Window et les balises qui sont utilisables dans Window.


EventHandler
La balise EventHandler permet d'associer des fonctions LUA aux différents événements qui peuvent arriver dans le jeu. Pour plus de détails, vous pouvez aussi vous référer à la partie concernant le fichier .mod.


La balise EventHandler possède 2 paramètres qui sont :
  • event qui correspond au nom de l'événement auquel on veut souscrire. Ce paramètre est obligatoire.
  • function qui permet d'indiquer quel fonction LUA doit être exécuter quand l'événement arrive. Ce paramètre est obligatoire.

La balise EventHandler est utilisable dans la balise suivante : EventHandlers
.


A titre d'information, voici la liste des événements disponibles :
  • OnInitialize
  • OnInitializeCustomSettings
  • OnShutdown
  • OnUpdate
  • OnLButtonDown
  • OnLButtonUp
  • OnLButtonDblClk
  • OnRButtonDown
  • OnRButtonUp
  • OnRButtonDblClk
  • OnMButtonDown
  • OnMButtonUp
  • OnMButtonDblClk
  • OnMouseOver
  • OnMouseOverEnd
  • OnMouseDrag
  • OnMouseWheel
  • OnKeyEnter
  • OnKeyTab
  • OnKeyEscape
  • OnRawDeviceInput
  • OnGamepadInput
  • OnShown
  • OnHidden
  • OnTweenComplete
  • OnDock
  • OnUnDock
  • OnPositionTabs
  • OnSizeUpdated
  • OnSetTopDockWindow
  • OnSetMoving

Sounds

Cette balise permet de définir une liste de sons qui sera jouable.


La balise Sounds ne possède pas de paramètres.
La balise Sounds est utilisable dans les balises suivantes : Window et les balises qui sont utilisables dans Window.


Sound
La balise Sound permet d'associer un son aux différents événements qui peuvent arriver dans le jeu..


La balise Sound possède 2 paramètres qui sont :
  • event qui correspond au nom de l'événement auquel on veut souscrire. Ce paramètre est obligatoire.
  • script qui permet d'indiquer quel son doit être exécuter quand l'événement arrive. Ce paramètre est obligatoire.

La balise Sound est utilisable dans la balise suivante : Sounds
.

A titre d'information, voici la liste des événements disponibles :
  • OnInitialize
  • OnInitializeCustomSettings
  • OnShutdown
  • OnUpdate
  • OnLButtonDown
  • OnLButtonUp
  • OnLButtonDblClk
  • OnRButtonDown
  • OnRButtonUp
  • OnRButtonDblClk
  • OnMButtonDown
  • OnMButtonUp
  • OnMButtonDblClk
  • OnMouseOver
  • OnMouseOverEnd
  • OnMouseDrag
  • OnMouseWheel
  • OnKeyEnter
  • OnKeyTab
  • OnKeyEscape
  • OnRawDeviceInput
  • OnGamepadInput
  • OnShown
  • OnHidden
  • OnTweenComplete
  • OnDock
  • OnUnDock
  • OnPositionTabs
  • OnSizeUpdated
  • OnSetTopDockWindow
  • OnSetMoving
Exemple d'utilisation :

Code:
<Sound event="OnShown" script="Sound.Play( Sound.WINDOW_OPEN )" /> 
  <Sound event="OnHidden" script="Sound.Play( Sound.WINDOW_CLOSE )" />
TexDims
La balise TexDims permet d'indiquer la portion que l'on doit utiliser sur une texture.


La balise TexDims possède 2 paramètres qui sont :
  • x qui correspond à la valeur horizontale. Ce paramètre est obligatoire.
  • y qui correspond à la valeur verticale. Ce paramètre est obligatoire.

La balise TexDims est utilisable dans la balise suivante : DynamicImage
.



TexCoords
La balise TexCoords permet d'indiquer les coordonnées des différents images du bouton dans la texture. En effet, chaque état d'un boutton peut afficher une image différente pour ce bouton.


La balise TexCoords ne possède pas de paramètres. Mais on peut indiquer la portion de texture à utiliser suivant l'état du bouton avec les 2 balises suivantes :
  • <Normal x="" y="" />
  • <Pressed x="" y="" />
La balise TexCoords est utilisable dans la balise suivante : Button.


Color
La balise Color permet de spécifier une couleur.


La balise Color possède 4 paramètres qui sont :
  • r qui correspond à la valeur rouge comprise entre 0 et 255. Ce paramètre est obligatoire.
  • g qui correspond à la valeur verte comprise entre 0 et 255. Ce paramètre est obligatoire.
  • b qui correspond à la valeur bleue comprise entre 0 et 255. Ce paramètre est obligatoire.
  • a qui correspond à la valeur alpha comprise entre 0 et 255 (pour la transparence). Ce paramètre est obligatoire.

La balise Color est utilisable dans la balise suivante : Label
.


CircleImage
La balise CircleImage permet de spécifier des images qui sont modifié lorsqu'on les survole avec la souris. La taille de l'image ainsi que la texture (et la taille de la texture) pour l'image sont spécifiés par les balises Size et TexDims.


La balise CircleImage possède 14 paramètres qui sont :
  • name. Ce paramètre est obligatoire.
  • textureScale. Ce paramètre est optionnel.
  • numsegments. Ce paramètre est obligatoire.
  • texture. Ce paramètre est obligatoire.
  • handleinput. Ce paramètre est optionnel.
  • popable. Ce paramètre est optionnel.
  • layer. Ce paramètre est optionnel.
  • slice. Ce paramètre est optionnel.
  • flitering. Ce paramètre est optionnel.
  • skipinput. Ce paramètre est optionnel.
  • sticky. Ce paramètre est optionnel.
  • savesettings. Ce paramètre est optionnel.
  • movable. Ce paramètre est optionnel.
  • inherits. Ce paramètre est optionnel.

La balise CircleImage est utilisable dans la balise suivante : Windows
.


DynamicImage
La balise DynamicImage permet de spécifier des images qui sont modifié lorsqu'on les survole avec la souris. La taille de l'image ainsi que la texture (et la taille de la texture) pour l'image sont spécifiés par les balises Size et TexDims.


La balise DynamicImage possède 12 paramètres qui sont :
  • name. Ce paramètre est obligatoire.
  • texture. Ce paramètre est obligatoire.
  • handleinput. Ce paramètre est optionnel.
  • popable. Ce paramètre est optionnel.
  • layer. Ce paramètre est optionnel.
  • slice. Ce paramètre est optionnel.
  • flitering. Ce paramètre est optionnel.
  • skipinput. Ce paramètre est optionnel.
  • sticky. Ce paramètre est optionnel.
  • savesettings. Ce paramètre est optionnel.
  • movable. Ce paramètre est optionnel.
  • inherits. Ce paramètre est optionnel.

La balise DynamicImage est utilisable dans la balise suivante : Windows
.
HorizontalResizeImage
La balise HorizontalResizeImage permet de spécifier les images qui sont utilisés pour les barre de status (par exemple la barre d'XP et de RP sur l'UI de base). Il faut utiliser la balise TexSlices pour spécifer les images de droite, de gauche et du centre.


La balise HorizontalResizeImage possède 12 paramètres qui sont :
  • name. Ce paramètre est obligatoire.
  • texture. Ce paramètre est obligatoire.
  • handleinput. Ce paramètre est optionnel.
  • popable. Ce paramètre est optionnel.
  • layer. Ce paramètre est optionnel.
  • slice. Ce paramètre est optionnel.
  • flitering. Ce paramètre est optionnel.
  • skipinput. Ce paramètre est optionnel.
  • sticky. Ce paramètre est optionnel.
  • savesettings. Ce paramètre est optionnel.
  • movable. Ce paramètre est optionnel.
  • inherits. Ce paramètre est optionnel.

La balise HorizontalResizeImage est utilisable dans la balise suivante : Windows
.

Statusbar
La balise StatusBar permet de créer une barre de status basique (même principe que la barre d'XP ou de RP de l'UI de base). La valeur courant de la barre ainsi que la valeur maximal sont spécifiés à l'aide d'appel aux API LUA.


La balise StatusBar possède 13 paramètres qui sont :
  • name. Ce paramètre est obligatoire.
  • background. Ce paramètre est obligatoire.
  • foreground. Ce paramètre est optionnel.
  • reverseFill. Ce paramètre est optionnel.
  • interpolate. Ce paramètre est optionnel.
  • handleinput. Ce paramètre est optionnel.
  • skipinput. Ce paramètre est optionnel.
  • layer. Ce paramètre est optionnel.
  • sticky. Ce paramètre est optionnel.
  • savesettings. Ce paramètre est optionnel.
  • movable. Ce paramètre est optionnel.
  • popable. Ce paramètre est optionnel.
  • inherits. Ce paramètre est optionnel.

La balise StatusBar est utilisable dans la balise suivante : Windows
.



Label
La balise Label permet de définir une zone de texte basique. La valeur du texte est spécifié à l'aide d'appel aux API LUA. Cette balise peut utilisé les balises Size, Anchors et Color pour spécifier les attributs dont elle a besoin.


La balise Label possède 15 paramètres qui sont :
  • name. Ce paramètre est obligatoire.
  • font qui permet de spécifier la police utilisée. Ce paramètre est obligatoire.
  • textalign qui permet de spécifier l'alignement du texte. Ce paramètre est optionnel.
  • maxchars qui permet de spécifier le nombre maximum de caractères. Ce paramètre est optionnel.
  • autoresize. Ce paramètre est optionnel.
  • wordwrap. Ce paramètre est optionnel.
  • warnOnTextCropped. Ce paramètre est optionnel.
  • handleinput. Ce paramètre est optionnel.
  • skipinput. Ce paramètre est optionnel.
  • layer. Ce paramètre est optionnel.
  • sticky. Ce paramètre est optionnel.
  • savesettings. Ce paramètre est optionnel.
  • movable. Ce paramètre est optionnel.
  • popable. Ce paramètre est optionnel.
  • inherits. Ce paramètre est optionnel.

La balise Label est utilisable dans la balise suivante : Windows
.


Button
La balise Button permet de créer un boutton qui est utilisable avec la souris.


La balise Button possède 15 paramètres qui sont :
  • name. Ce paramètre est obligatoire.
  • font qui permet de spécifier la police utilisée. Ce paramètre est obligatoire.
  • backgroundtexture. Ce paramètre est optionnel.
  • texturescale. Ce paramètre est optionnel.
  • textalign qui permet de spécifier l'alignement du texte. Ce paramètre est optionnel.
  • drawchildrenfirst. Ce paramètre est optionnel.
  • id. Ce paramètre est optionnel.
  • handleinput. Ce paramètre est optionnel.
  • skipinput. Ce paramètre est optionnel.
  • layer. Ce paramètre est optionnel.
  • sticky. Ce paramètre est optionnel.
  • savesettings. Ce paramètre est optionnel.
  • movable. Ce paramètre est optionnel.
  • popable. Ce paramètre est optionnel.
  • inherits. Ce paramètre est optionnel.

La balise Button est utilisable dans la balise suivante : Windows
.




Les fichiers LUA


Ces fichiers représentent le coeur de votre AddOn. C'est dans ces fichiers que vous indiquez tous les traitements que doivent faire votre AddOn.

Les fichiers LUA servent à écrire des scripts LUA (d'où leur extension !). Je vous invite à lire le sujet des liens utiles.

Si le besoin est réel, je ferais un tutoriel LUA en français.


Exemple d'AutoLoot : la création de votre premier AddOn


Pour finir en beauté, vous allez créer votre propre AddOn ! Le but de cet AddOn sera d'avoir un AutoLoot sur votre personnage quand vous fouillez les corps.

Cela vous parait compliquer ? Vous allez voir c'est tout simple ! Surtout si vous avez lu en entier cet article


1. Première étape : Choix du nom de votre AddOn

Comme indiqué dans l'article, il faut choisir le nom de votre AddOn en premier lieu pour créer l'arborescence et les différents fichiers ! Histoire de faire très compliqué, le nom de notre AddOn sera.... AutoLoot.


2. Deuxième étape : Création de l'arborescence de l'AddOn

Dans le répertoire des AddOn (par défaut <répertoire d'installation War>\Interface\AddOns), il faut créer un répertoire AutoLoot.


3. Troisième étape : Création du fichier AutoLoot.mod

Dans le répertoire de votre AddOn, il faut créer un nouveau fichier texte ayant pour nom AutoLoot.mod.

En reprenant la description du contenu d'un fichier .mod, je vais expliquer ce que l'on a besoin pour notre AddOn ou pas :
- les balises ModuleFile et UiMod : obligatoire pour tous les fichiers donc pas de question à se poser.
- les balises Author et UiMod : on va les remplir pour la postérité ! Vous pouvez bien sur mettre vos propres informations.
- les balises Dependencies et Dependency : je veux que mon AddOn fonctionne tout seul et je n'ai pas besoin de choses spécifiques donc pas besoin de renseigner ces balises.
- les balises Files et File : je vais avoir besoin d'un fichier LUA pour indiquer comment marche mon AddOn. Donc je les utiliserai pour indiquer mon fichier LUA
- les balises SavedVariables et SavedVariable : je n'ai pas donner de configuration utilisateur possible et je n'ai pas besoin de sauvegarder des variables. Donc pas besoin de les renseigner.
- les balises OnInitialize, OnUpdate et OnShutdown : j'aurais juste besoin de la balise OnInitialize (voir la quatrième étape pour plus de détails).


Donc, le fichier AutoLoot.mod doit être rempli de cette façon :

Code:
<?xml version="1.0" encoding="UTF-8"?>
<ModuleFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <UiMod name="AutoLoot" version="1.0" date="06/09/2008" >

        <Author name="Jion" email="jion@JeuxOnLine.info" />
        <Description text="Mon AutoLoot perso !" />
        
        <Dependencies/>
        
        <Files>
            <File name="AutoLoot.lua" />
        </Files>
        
        <OnInitialize>
            <CallFunction name="AutoLootInitialize" />
        </OnInitialize>
        <OnUpdate/>
        <OnShutdown/>
        
    </UiMod>
</ModuleFile>
4. Quatrième étape : Création du script AutoLoot.lua

Maintenant que l'on a renseigné le fichier AutoLoot.mod, on doit créer un fichier texte AutoLoot.lua au même endroit que le fichier AutoLoot.mod (vu ce que l'on a mis dans l'attribut name de la balise File).

Les choses dont on a besoin pour faire fonctionner l'AddOn sont :
- savoir quand la personne fouille un corps (et l'indiquer à notre AddOn)
- ramassez tous les objets quand on a reçu l'information que le joueur fouille un corps.

Cela vous parait compliquer ? C'est pourtant très simple à faire.

En recherchant dans les API, on peut voir qu'il existe un événement SystemData.Events.INTERACT_SHOW_LOOT qui est déclenché lorsqu'un joueur fouille un corps. Il suffit donc de demander à War d'appeler notre AddOn quand cet événement se produit.
De même, toujours en recherchant dans les API, on peut voir qu'il existe une fonction RegisterEventHandler qui permet d'indiquer à War quelle fonction il doit lancer quand un événement se produit.

C'est pour cela qu'on a besoin lors de l'initialisation de notre AddOn de l'indiquer au programme War. D'où l'utilisation de la balise OnInitialize dans le fichier AutoLoot.mod ! Si on n'avais pas utilisé OnInitialize, on aurait eu aucun moyen de pouvoir enregistrer cet événement vu que notre AddOn n'aurait jamais été appelé par quelque chose (la balise OnInitialize permettant d'appeler des fonctions)

Code:
function AutoLootInitialize()
    RegisterEventHandler("AutoLoot", SystemData.Events.INTERACT_SHOW_LOOT, "AutoLootOnShowLoot")
end
Avec cette ligne, on indique au programme War qu'à chaque fois que l'événement SystemData.Events.INTERACT_SHOW_LOOT se produit, il doit lancer la fonction AutoLootOnShowLoot.


Maintenant, il ne reste plus qu'à créer cette fonction AutoLootOnShowLoot et le tour sera joué.
En recherchant dans les API, on voit qu'il existe une méthode LootAllItems qui fait exactement ce que l'on recherche. Il suffit donc de l'appeler.

Premier problème : Comment faire lorsque l'on fouille un coffre d'une QP qui n'autorise qu'un choix entre plusieurs objets ?

Je suis sur que vous n'y aviez même pas pensé à ce problème ! Afin de faire simple, on ne fera rien si on est dans ce cas. Notre AddOn AutoLoot ne sera utilisé uniquement dans le cas où l'on n'a pas une fenêtre de choix de loot. Ainsi le joueur pourra choisir librement son loot lors d'une QP. Les API de War nous aide encore grâce à la fonction WindowGetShowing("ChooseOneLootWindow") qui permet de savoir si la fenêtre de loot est une fenêtre normal ou une fenêtre dans laquelle on doit faire un choix.

Code:
function AutoLootOnShowLoot()
    if not WindowGetShowing("ChooseOneLootWindow") then
        LootAllItems()
    end
end
Au final, notre fichier AutoLoot.lua doit donc ressembler à cela :

Code:
function AutoLootInitialize()
    RegisterEventHandler("AutoLoot", SystemData.Events.INTERACT_SHOW_LOOT, "AutoLootOnShowLoot")
end

function AutoLootOnShowLoot()
    if not WindowGetShowing("ChooseOneLootWindow") then
        LootAllItems()
    end
end
5. Cinquième étape : Connectez-vous en jeu pour le tester !

Il ne vous reste plus qu'à vous connecter en jeu pour tester votre premier AddOn.
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés