Ajouter une nouvelle compétence Metin2 ressemble à première vue à l'insertion d'une seule ligne dans un fichier, mais cela exige en réalité que deux mondes distincts restent synchronisés : le côté source (serveur) définit les calculs et les règles de la compétence, tandis que le côté client affiche au joueur l'icône, la description et l'effet. Si le vnum ne correspond pas des deux côtés, la compétence n'apparaît jamais ou se déclenche avec le mauvais effet. Dans ce guide, nous construisons une compétence de zéro, de la planification jusqu'aux tests.
Planifier d'abord : vnum, type et public
Chaque compétence est identifiée par un vnum unique. Avant d'ajouter une nouvelle capacité, décidez à quelle classe elle appartient (guerrier, ninja, sura, chamane), si elle est active ou passive, et quelle est sa cible. Les types de cible des compétences Metin2 sont en gros :
- SKILL_TARGET_TYPE_SELF — buff / amélioration personnelle.
- SKILL_TARGET_TYPE_TARGET — dégâts ou effet sur une cible unique.
- SKILL_TARGET_TYPE_AROUND — effet de zone sur les ennemis proches.
Choisir un vnum inutilisé est crucial. Pour voir la plage de compétences existante sans collision, vérifiez la table dans la base de données joueur :
SELECT dwVnum, szName FROM player.skill_proto ORDER BY dwVnum;
Côté source : skill_proto et constantes
Le serveur lit les données de compétence depuis la table player.skill_proto au démarrage. En ajoutant la nouvelle ligne, vous devez remplir au moins ces champs : dwVnum, szName, bType (classe/type), bMaxLevel, bLevelStep, ainsi que le coût en SP/HP et les colonnes de temps de recharge (cooldown). Les formules de dégâts ou de soins sont généralement stockées dans des colonnes de chaîne polynomiale (formule) comme szPointPoly et szDurationPoly ; elles sont évaluées en jeu à partir de k (le coefficient de niveau de compétence) et des statistiques du personnage.
Une colonne de formule typique suit cette logique :
-- exemple szPointPoly (formule de dégâts)
1.5 * atk + 3.0 * k * lv
Ici atk est la puissance d'attaque, lv le niveau du personnage et k un ratio de 0 à 1 lié au niveau de compétence. La règle la plus importante est de garder les formules équilibrées par rapport aux compétences existantes plutôt que de les surdoser ; sinon l'équilibre PvP est cassé.
Des modifications C++ supplémentaires dans la source ne sont généralement nécessaires que lorsque la compétence requiert une mécanique spéciale (par exemple un nouveau type d'affect, ou un effet additionnel par coup). Pour les compétences de dégâts/buff standard, le flux ComputeSkill existant dans char_skill.cpp suffit. Si vous utilisez un nouvel affect, pensez à définir votre constante dans length.h / affect.h et à maintenir serverproto et syncproto cohérents avec le client.
Lier à l'arbre de compétences et aux conditions d'apprentissage
Pour que la compétence apparaisse au joueur, elle doit être reliée à un chemin d'apprentissage. Sur la plupart des serveurs, cela se fait via le PNJ Maître des Compétences côté quête ou via un système de livre de compétence. Ajouter le nouveau vnum à la liste des compétences dans le lua de quête ressemble typiquement à ceci :
when 20309.chat."Apprendre la nouvelle capacité" begin
if pc.get_level() < 40 then
say("Tu dois être niveau 40 pour apprendre cette capacité.")
return
end
pc.give_skillbook(141) -- nouveau vnum de compétence
end
Vous pouvez ajouter ici des règles comme une vérification de niveau, une condition de points d'âme ou une consommation d'objet. Si vous utilisez le système de livre de compétence, vous devez aussi définir le livre côté item_proto.
Côté client : skilltable, description et icône
Même si le serveur connaît la compétence, le joueur voit une case vide tant que le client ne sait pas comment la dessiner. Il y a trois points essentiels à modifier côté client :
locale/<langue>/skilltable.txt— associe le vnum, le nom, le type de la compétence et les références motiongraph/effet qu'elle utilise.locale/<langue>/skilldesc.txt— le texte de description que le joueur voit au survol.icon/skill/— l'icône.tgade la compétence ; le chemin dansskilltable.txtdoit pointer vers ce fichier.
skilltable.txt est composé de colonnes séparées par des tabulations ; si l'ordre des colonnes est rompu, la compétence ne se charge pas. En ajoutant la nouvelle ligne, assurez-vous que le vnum est exactement le même que côté source. Vous indiquez aussi le chemin de l'icône ici :
icon/skill/warrior/new_skill.tga
Lier l'effet et la motion
L'effet visuel est le fichier de particules/animation qui se joue lorsque la compétence est utilisée. Dans Metin2, ces effets sont généralement liés via des fichiers .mse (effet) et, pour l'animation du personnage, via .msa/motiongraph. La colonne concernée dans skilltable.txt indique quelle motion et quel effet sont déclenchés. En ajoutant un nouveau fichier d'effet au projet, surveillez deux choses :
- Le fichier d'effet doit réellement exister dans la structure pack/index du client (par exemple dans le pack
effect) ; sinon rien ne se joue, en silence. - L'animation doit correspondre à un index de motion défini dans le motiongraph de la race concernée. Appeler une motion inexistante peut figer le personnage en T-pose.
Réutiliser un effet existant (référencer le .mse d'une compétence déjà en place) est la voie la plus sûre pour le premier test ; une fois tout le câblage confirmé, vous pouvez insérer votre propre effet.
Test et débogage
Après avoir appliqué les changements, testez dans cet ordre : redémarrez d'abord le serveur et vérifiez les logs de démarrage à la recherche d'une erreur de lecture skill_proto, puis empaquetez le client, apprenez la compétence et utilisez-la. Problèmes fréquents :
- Icône de compétence vide → mauvais chemin dans
skilltable.txtou.tgaabsent du pack. - Compétence impossible à apprendre → une condition de quête bloque, ou l'objet livre n'est pas défini.
- L'effet ne se joue pas → mauvaise référence
.mseou index de motion. - Dégâts à 0 → faute de frappe dans la chaîne de formule ; vérifiez les logs
syserr.
Gardez toujours syserr.txt ouvert ; la plupart des erreurs de compétence Metin2 y sont écrites silencieusement et ne donnent aucun symptôme en jeu.
Questions fréquentes
Dois-je toujours compiler la source pour une nouvelle compétence ?
Non. Les compétences de dégâts ou de buff standard peuvent être ajoutées avec seulement skill_proto et les fichiers client. Une compilation de la source n'est nécessaire que lorsque vous voulez un comportement absent du système existant, comme un nouveau type d'affect ou une mécanique personnalisée par coup.
Que se passe-t-il si le vnum client et source diffèrent ?
La compétence n'apparaît jamais ou se lie à la mauvaise icône/effet. Garder le vnum identique des deux côtés est la règle la plus critique ; c'est la racine de la plupart des problèmes « la compétence ne marche pas ».
Si l'effet ne se joue pas, où regarder en premier ?
Confirmez d'abord que le fichier d'effet .mse existe vraiment dans le pack client, puis que l'index de motion appelé est défini dans le motiongraph de la race concernée. Si l'un des deux manque, l'effet est ignoré en silence.
Vous construisez un système de compétences personnalisé sur votre propre serveur ? Si vous avez besoin d'aide pour le travail de compétences Metin2, de la conception de la mécanique côté source à l'intégration effet/icône côté client, contactez-moi.