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

Ajouter une nouvelle classe Metin2 : est-ce possible et comment ?

Ajouter une nouvelle classe Metin2 est un rêve que presque chaque propriétaire de serveur caresse à un moment donné, sans réaliser à quel point la tâche est profonde. Depuis son lancement, le jeu repose sur quatre classes de personnage de base : Guerrier, Sura, Ninja et Chaman ; côté officiel, l'Homme-loup (Lycan) ajouté plus tard a porté ce nombre à cinq. Faire entrer une cinquième ou sixième classe en partant de zéro n'a rien à voir avec l'ajout d'un modèle ou d'une carte : l'identité de classe est gravée à la fois dans le client, le serveur et la base de données. Dans cet article, j'explique ce qui est réellement possible, ce qui frôle l'impossible en pratique, et les approches réalistes entre les deux.

Pourquoi ce n'est pas un simple « nouveau modèle »

Dans Metin2, la classe d'un personnage est représentée par un seul nombre, le job index. Dans la source serveur, ces valeurs sont définies comme constantes : JOB_WARRIOR = 0, JOB_ASSASSIN = 1, JOB_SURA = 2, JOB_SHAMAN = 3, et sur les builds avec Homme-loup JOB_WOLFMAN = 4. La valeur de « race » en jeu découle en gros de ce job combiné au sexe — chaque classe occupe donc un emplacement distinct pour ses variantes masculine et féminine. Ce nombre n'est pas qu'une étiquette ; il sert d'index de tableau partout dans le jeu. Le calcul des stats, les formules de vie et de mana, les points de départ, l'arbre de compétences, les autorisations d'équipement et bien plus consultent des tables via cet index. Dès que vous ajoutez un nouvel index, vous devez étendre chacune de ces tables.

Côté serveur : impossible sans la source

C'est la partie la plus critique. Définir un nouveau job index oblige à modifier et recompiler la game source (le cœur du jeu écrit en C++), car le nombre de classes est traité comme fixe à de nombreux endroits. Les zones que vous devez généralement toucher sont :

  • Les constantes — Les fichiers d'en-tête où sont définis les numéros de job et le nombre total de classes (du type JOB_MAX_NUM).
  • Les tables de points et de stats — Les tableaux qui contiennent la vie, le mana et les stats de départ par niveau de chaque classe (les tableaux d'info de job autour de constants.cpp). Sans ligne pour la nouvelle classe, le jeu plante ou le personnage naît avec des stats nulles.
  • Le système de compétences — Les structures qui associent les ID de skills propres à la classe à un job.
  • Les restrictions d'objets — Les classes autorisées à porter un objet sont stockées dans un masque de bits (Guerrier 1, Sura 2, Ninja 4, Chaman 8). Une cinquième classe utilise le bit suivant, et le cœur doit le reconnaître.

Le piège est le suivant : la plupart des paquets de « server files » qui circulent arrivent sous forme de binaires compilés, c'est-à-dire sans code source C++. Sans la source, vous ne pouvez pas modifier ces constantes — la seule option est de vivre avec les quatre (ou cinq) classes existantes. Si vous disposez réellement d'une source compilable, le travail est difficile mais possible ; sinon, une « vraie » nouvelle classe est tout simplement hors de portée.

La couche base de données

La classe d'un personnage est stockée dans une colonne job de la table des joueurs. Une nouvelle valeur de job ne requiert pas forcément un changement de schéma (la colonne est déjà numérique), mais les données proto de skills et d'objets doivent reconnaître la nouvelle classe. Par exemple, skill_proto définit à quels jobs chaque compétence est ouverte ; vous devez y ajouter les compétences de votre nouvelle classe. De même, côté item_proto, il faut mettre à jour le masque de restriction de classe des objets équipables pour que votre nouvelle classe ne se promène pas sans équipement.

Côté client : création de personnage et modèles

Même si le serveur reconnaît la nouvelle classe, cela ne sert à rien si le joueur ne peut pas la voir. Le côté client forme sa propre liste :

  • Écran de création de personnage — L'interface Python du pack root (les modules de sélection et de création) lit les races sélectionnables depuis une liste fixe. Vous devez y ajouter la nouvelle classe et lui donner une icône, un nom et un modèle d'aperçu.
  • Modèles de joueur — Chaque classe a des modèles .gr2, des squelettes et des jeux de mouvements complets distincts pour l'homme et la femme. Vous devez tous les préparer et les placer dans la bonne structure de dossiers.
  • Listes de mouvements (.msa) et machines à états — La marche, la course, l'attaque et les animations de skills sont liées via ces fichiers. Un mouvement manquant fige cette classe durant cette action.
  • Interface des compétences — Les fichiers de locale et les définitions de skills sont mis à jour pour que les fenêtres de compétences affichent l'arbre de la nouvelle classe avec les bonnes icônes et descriptions.

Le point clé : l'index de race côté client et le job index côté serveur doivent correspondre exactement. Si les deux côtés utilisent des numéros différents, le personnage apparaît avec le mauvais modèle, les skills ne tiennent pas, ou le client plante instantanément à la connexion.

Approches réalistes

Une cinquième classe à part entière est démesurée pour la plupart des projets. En pratique, trois voies sont bien plus courantes :

  • Re-thématiser une classe existante (reskin) — Par exemple présenter le Chaman comme une « nouvelle classe » avec des modèles, effets et visuels de skills entièrement neufs. Comme le job index reste le même, vous ne touchez jamais à la source ; vous changez seulement le contenu visuel et de compétences. C'est la méthode la moins risquée et la plus répandue.
  • Intégration de l'Homme-loup (Lycan) — Amener la cinquième classe officiellement existante dans votre projet avec ses fichiers prêts. C'est moins « nouvelle classe » que « compléter une classe manquante » ; cela demande tout de même un vrai travail sur les skills, l'équilibrage et les restrictions d'objets.
  • Une vraie nouvelle classe au niveau source — Si vous avez la source complète, étendre toutes les couches ci-dessus pour définir un cinquième ou sixième job. La voie la plus flexible mais la plus longue ; elle exige de solides connaissances en C++ et en équilibrage.

Une feuille de route pratique

Si vous partez vraiment au niveau source, l'ordre logique est : étendez d'abord les constantes de job et toutes les tables stats/skills/objets dans la source serveur, compilez, et créez la classe de façon invisible (sans modèle) dans la BDD pour confirmer que le cœur l'accepte. Ajoutez ensuite les données proto de skills et d'objets. Ce n'est qu'à la fin que vous passez au client : préparez les modèles, ajoutez la classe à la création et alignez les index de race sur le serveur. À chaque étape, lisez les journaux syserr — les débordements de tableau liés à la classe (out of range) s'y attrapent le plus souvent. Si vous bâclez tout en même temps, repérer la couche d'où vient l'erreur devient presque impossible.

Questions fréquentes

Peut-on ajouter une nouvelle classe sans la source ?

Pas au sens « réel ». Le job index et ses tables stats/skills/objets dépendantes sont fixes dans le cœur du jeu et ne s'étendent qu'en recompilant la source. Sans elle, la seule option est de re-thématiser une classe existante (reskin).

Ajouter l'Homme-loup compte-t-il comme une nouvelle classe ?

À moitié. L'Homme-loup est la cinquième classe officiellement définie ; l'ajouter, ce n'est pas créer une classe de zéro mais intégrer une classe qui existe et manque à votre projet. Cela reste un travail conséquent en skills, équilibrage et restrictions d'objets.

Quelle différence entre un reskin et une vraie nouvelle classe ?

Avec un reskin, le job index ne change pas ; le jeu voit toujours ce personnage comme l'ancienne classe, seuls les visuels et le contenu de skills diffèrent. Avec une vraie nouvelle classe, un job entièrement nouveau est défini au niveau du cœur, avec ses propres formules de stats, ses propres restrictions d'objets et un arbre de compétences indépendant.

Vous voulez une classe réellement nouvelle, ou un reskin malin ? Je peux examiner l'état de la source de votre projet et planifier la voie qui produit le plus d'impact avec le moins de risque. Contactez-moi et parlons des besoins de votre serveur.

Bu kategorideki tüm yazılar →

Devamı için