aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Metin2 Root Python : Personnaliser les Fenêtres de l'Interface

L'interface du client Metin2 est entièrement écrite en Python, et si tu veux façonner ces fenêtres autour de ton propre serveur, le point de départ ce sont les fichiers metin2 root python. Pas besoin de toucher au moteur pour déplacer l'inventaire, agrandir la fenêtre de chat ou ajouter un nouveau bouton : il suffit de trouver le bon fichier .py et d'y faire une modification sensée. Dans cet article, je t'explique comment fonctionne le paquet root, comment ouvrir et éditer les fichiers, et comment tester tes changements dans le client.

Le paquet root et l'architecture de l'interface

Le client assemble son interface à partir de trois parties distinctes, et sans comprendre cette séparation tu te perdras dans la masse de fichiers :

  • root — La véritable logique Python se trouve ici. ui.py définit le cadre de l'interface (des classes comme Window, Board, Button, TextLine), tandis que des fichiers comme uiInventory.py, uiCharacter.py, uiChat.py et interfaceModule.py contrôlent le comportement de chaque fenêtre.
  • uiscript — C'est ici qu'est conservée la disposition des fenêtres. Des fichiers comme inventorywindow.py ne sont pas du HTML ; ils décrivent la géométrie sous forme de dictionnaire Python : coordonnées, largeur, hauteur et éléments enfants.
  • locale — Les textes et les réglages dépendants de la langue (locale_string.txt et certaines étiquettes utilisées dans uiscript) se trouvent ici.

Donc l'apparence d'une fenêtre est en grande partie définie dans uiscript, tandis que son comportement réside dans root. Pour la plupart des ajustements visuels, toucher uniquement à uiscript suffit.

Décompresser les fichiers et préparer l'environnement

Le client stocke ces fichiers dans des paquets chiffrés : root.epk / root.eix et uiscript.epk / uiscript.eix. Pour les éditer, il faut d'abord les décompresser :

  • Utilise un outil comme EterNexus pour décompresser et recompresser. En ouvrant le fichier .eix, tu peux extraire la structure de dossiers qu'il contient.
  • Les fichiers arrivent généralement sous forme compilée .pyc. Si tu n'as pas la source .py, il te faut un décompilateur Python 2 (par exemple uncompyle2) pour les reconvertir. Comme le client repose sur Python 2.2, les outils Python 3 modernes ne conviennent souvent pas.
  • De nombreux serveurs privés configurent le client pour lire depuis des dossiers libres plutôt que des paquets, ce qui facilite le développement. Si c'est disponible, tu peux éditer directement les dossiers root et uiscript et sauter l'étape de recompression.

N'importe quel éditeur avec coloration syntaxique (VS Code, Notepad++) fera l'affaire. Enregistre les fichiers dans l'encodage attendu par le client et évite de mélanger tabulations et espaces dans l'indentation — Python est sensible à l'indentation.

Modifier la disposition d'une fenêtre avec uiscript

La tâche la plus courante est de déplacer ou redimensionner une fenêtre. Le fichier uiscript/inventorywindow.py a à peu près cette structure :

window = {
    "name" : "InventoryWindow",
    "x" : SCREEN_WIDTH - 176,
    "y" : SCREEN_HEIGHT - 37 - 565,
    "style" : ("movable", "float",),
    "width" : 176,
    "height" : 565,

    "children" : (
        {
            "name" : "board",
            "type" : "board",
            "x" : 0,
            "y" : 0,
            "width" : 176,
            "height" : 565,
            "children" : (
                # titre, onglets, emplacements...
            ),
        },
    ),
}

Pour décaler la fenêtre vers la gauche, modifie la valeur "x" ; pour l'élargir, modifie "width". Souviens-toi : si tu augmentes la largeur de la fenêtre extérieure, tu dois aussi ajuster la largeur de l'élément board intérieur pour qu'elles correspondent, sinon le graphisme d'arrière-plan déborde. Les constantes SCREEN_WIDTH et SCREEN_HEIGHT te permettent d'ancrer la fenêtre à un coin de l'écran ; les utiliser à la place de nombres fixes garde tout correct sur différentes résolutions.

Éditer la logique à l'intérieur de root

Quand la disposition ne suffit pas, tu modifies le comportement côté root. Par exemple, uiInventory.py charge le fichier de disposition ainsi :

import ui
import uiScriptLocale

class InventoryWindow(ui.ScriptWindow):
    def __LoadWindow(self):
        pyScrLoader = ui.PythonScriptLoader()
        pyScrLoader.LoadScriptFile(self, "uiscript/inventorywindow.py")

        self.wndItem = self.GetChild("ItemSlot")
        # ... références aux éléments

Le nom dans l'appel GetChild doit correspondre exactement au champ "name" du fichier uiscript. Si tu as ajouté un nouveau bouton, tu le définis d'abord dans uiscript, puis tu le récupères côté root avec GetChild("NouveauBouton") et tu le lies à une fonction via SetEvent. Si les noms ne correspondent pas, le client renvoie None et plante généralement avec une erreur 'NoneType' object has no attribute ....

Toucher à ui.py est une opération avancée : comme toutes les fenêtres partagent ce cadre, une seule erreur ici affecte toute l'interface. À moins d'avoir vraiment besoin d'un nouveau type de composant, laisse ui.py tel quel.

Recompression, cache et débogage

Une fois l'édition terminée, recompresse les fichiers (ou, en mode dossier libre, enregistre simplement) et redémarre le client. Quelques points pratiques :

  • Le client peut mettre en cache d'anciens paquets ; pour être sûr, mets à jour ensemble les fichiers .epk et .eix.
  • Si quelque chose ne marche pas, le premier endroit à consulter est le fichier syserr.txt dans le dossier du client. Les exceptions Python, avec le numéro de ligne fautif, y sont écrites.
  • Erreurs courantes : indentation incohérente (IndentationError), parenthèse non fermée, ou virgule manquante dans un dict uiscript. Dans les dictionnaires Python, n'oublie pas la virgule finale après chaque élément.

Erreurs courantes et astuces

  • Sauvegarde l'original. Avant de commencer, copie les paquets root et uiscript pour que revenir en arrière prenne des secondes, pas des minutes.
  • Une modification à la fois. Ne modifie pas dix fichiers avant de tester ; chercher le bug devient un supplice.
  • La cohérence des noms est essentielle. Le "name" dans uiscript et le GetChild dans root doivent être écrits à l'identique ; même la casse compte.
  • Pense à la résolution. Utilise SCREEN_WIDTH/SCREEN_HEIGHT au lieu de coordonnées fixes pour que la fenêtre reste en place aussi sur les écrans larges.

Questions fréquentes

Les fichiers root sont en .pyc — comment obtenir la source ?

Beaucoup de fichiers sont distribués sous forme compilée .pyc. Un décompilateur Python 2 (comme uncompyle2) peut les transformer en .py lisible. Certaines versions communautaires partagent déjà une source propre ; si possible, travaille directement avec la source plutôt que de décompiler.

Je veux seulement déplacer une fenêtre — dois-je toucher à root ?

Non. La position, la taille et la disposition des enfants sont entièrement du côté uiscript. Tant que tu ne changes pas le comportement des boutons, ne lies pas d'événements ni n'ajoutes de nouvelle logique, tu n'as jamais besoin d'ouvrir les fichiers root.

Ma modification n'apparaît pas dans le client — pourquoi ?

Généralement, soit le paquet n'a pas été mis à jour (rafraîchis la paire .eix/.epk ensemble), soit il y a une erreur Python. Regarde d'abord syserr.txt ; tu y trouveras souvent le problème avec le numéro de ligne exact.

Tu veux repenser l'interface autour de ton propre serveur de A à Z ? Si tu as besoin d'aide pour la personnalisation du client Metin2, l'édition du root ou un design d'interface sur mesure, contacte-moi — donnons vie à ton projet ensemble.

Bu kategorideki tüm yazılar →

Devamı için