Si tu gères un serveur Metin2, tôt ou tard tu voudras ajouter une nouvelle arme, armure ou tenue, et au cœur de tout cela se trouve la donnée metin2 item proto. L'item proto est la table qui stocke l'identité, le type, les dégâts, la défense, les conditions de port et les bonus de chaque objet. Ajouter un objet correctement, c'est mettre à jour cette donnée de façon cohérente côté serveur et côté client. Dans ce guide, on ajoute un nouvel objet de bout en bout : choix du vnum, enregistrement serveur, fichiers client, icône et modèle, puis test.
Qu'est-ce que l'item proto et où se trouve-t-il ?
L'item proto existe à deux endroits distincts, et les deux doivent correspondre exactement :
- Côté serveur : le cœur du jeu (game core) lit les définitions d'objets. Selon la version de ta source, cette donnée vient soit de la table
item_protodans la base MySQLplayer, soit d'un fichier texte/binaireitem_proto. Le core la charge en mémoire au démarrage. - Côté client : le dossier
packdu client contient un fichieritem_protochiffré/packé. Le client y lit les données visuelles et de gameplay de l'objet. Souslocalese trouvent aussiitem_names.txt(noms affichés),item_list.txt(chemins d'icône et de modèle) etitemdesc.txt(descriptions).
Si un objet n'est défini que sur le serveur, le client ne peut pas le dessiner (il apparaît manquant ou cassé) ; s'il n'existe que sur le client, le serveur ne peut pas le générer. Les deux côtés doivent porter le même vnum et des valeurs compatibles.
Avant de commencer : sauvegardes et choix du vnum
Première règle : fais une sauvegarde. Garde un dump de la table MySQL item_proto et des copies de chaque fichier .txt/pack que tu vas modifier. Une seule ligne corrompue peut empêcher le core de charger les objets.
L'étape suivante est de choisir un vnum (numéro d'objet). Chaque objet a un vnum unique. Choisis une plage inutilisée pour éviter les collisions. Les armes standard se situent en général dans la bande 0–8000 ; pour les objets custom, une plage haute et vide (par exemple 30000+) réduit le risque de conflit. Pour trouver un vnum libre dans MySQL :
SELECT vnum FROM player.item_proto WHERE vnum BETWEEN 30000 AND 30100 ORDER BY vnum;
Si aucune ligne n'est renvoyée dans cette plage, elle peut être utilisée en toute sécurité.
Côté serveur : ajouter un nouvel objet à l'item proto
Plutôt que de définir un objet à partir de zéro, la méthode la plus fiable est de copier un objet existant du même type comme modèle. Si tu ajoutes une épée, prends la ligne d'une épée existante, change le vnum et le nom, puis modifie uniquement les champs qui doivent différer (dégâts, niveau de port, bonus). La raison : le sens des champs value0–value5 change selon le type d'objet, donc partir d'un exemple correct élimine la plupart des erreurs.
Colonnes clés :
vnum: numéro unique.name/locale_name: nom interne au serveur.typeetsubtype: ex. pour une armeITEM_WEAPON+WEAPON_SWORD; pour une armureITEM_ARMOR+ARMOR_BODY.antiflags: quelles classes/sexes ne peuvent pas l'utiliser (ex.ANTI_WARRIOR).wearflags: où l'objet se porte (WEAR_WEAPON,WEAR_BODY, etc.).limittype0/limitvalue0: la condition de port, le plus souventLIMIT_LEVELet une valeur de niveau.applytype0..2 / applyvalue0..2: les bonus accordés par l'objet (ex.APPLY_ATT_SPEED,APPLY_MAX_HP).value0..value5: valeurs propres au type. Correspondance courante pour les armes :value3= dégâts physiques min,value4= dégâts physiques max,value5= attaque magique/supplémentaire ; pour les armuresvalue1porte la défense. Malgré tout, copie depuis un objet correct du même type et compare.price,refined_vnum(chaîne d'amélioration),socket0..2(emplacements),addon_type.
Dans MySQL, le plus rapide est de dupliquer une épée existante :
INSERT INTO player.item_proto
SELECT * FROM player.item_proto WHERE vnum = 19; -- une épée d'exemple
-- puis édite la nouvelle ligne :
UPDATE player.item_proto
SET vnum = 30001, name = 'Nouvelle Epee', value3 = 60, value4 = 90
WHERE vnum = 19; -- assure-toi de cibler la bonne ligne
En pratique, il est plus propre d'exporter la ligne existante, de la modifier et de l'insérer comme nouvelle ligne avec vnum = 30001. Si ta source lit un fichier texte, tu ouvres le txt item_proto avec un convertisseur, ajoutes la nouvelle ligne séparée par des tabulations, puis repackes. Pour que le changement prenne effet, redémarre le core ; le proto est chargé en mémoire au démarrage.
Côté client : item proto, item_names et item_list
Pour les fichiers client, tu utilises un outil de conversion de proto (les outils communautaires transforment l'item_proto packé en .txt éditable, puis le repackent). Le flux :
item_proto(client) → convertis en txt à tabulations, ajoute la nouvelle ligne avec les mêmes vnum et valeurs que le serveur, repacke et place le tout danspack.locale/<langue>/item_names.txt→ format de lignevnum[TAB]Nom affiché. Ajoute le nouveau vnum et le nom visible en jeu. Conserve ce fichier dans le bon encodage (généralement celui de la langue du serveur).locale/<langue>/item_list.txt→ associe chaque vnum à un chemin d'icône et de modèle :vnum[TAB]ITEM[TAB]icon/item/xxxx.tga[TAB]d:/ymir work/item/.../xxxx.gr2. Définis ici les chemins d'icône et de modèle de ton nouvel objet.locale/<langue>/itemdesc.txt→ texte de description optionnel.
Ajouter l'icône et le modèle
Pour que l'objet apparaisse en main et dans l'inventaire, il faut deux ressources : une icône (.tga, généralement 32×32, affichée dans la case d'inventaire) et un modèle 3D (sur la main/le corps du personnage). Place l'icône dans le chemin icon/item/ du client et pointe vers elle dans item_list.txt. Si tu n'as pas encore créé de nouveaux visuels, tu peux réutiliser au départ les chemins d'icône et de modèle d'un objet similaire — l'objet fonctionne, il montre simplement un visuel existant. S'il te faut un modèle unique, place le fichier .gr2 dans le bon dossier et référence le chemin dans item_list.txt. Un mauvais chemin d'icône affiche une case vide/rouge dans l'inventaire ; c'est le signe le plus courant qu'il faut corriger le chemin.
Test, rechargement et erreurs fréquentes
Après avoir redémarré le serveur, connecte-toi avec un compte GM et génère l'objet :
/item 30001
# ou par nom (si item_names est correct) :
/item Nouvelle_Epee
Si l'objet tombe dans l'inventaire, affiche le bon nom et la bonne icône, et qu'à l'équipement ses dégâts/défense et bonus correspondent à la table, c'est terminé. Erreurs fréquentes :
- Décalage de vnum serveur/client : le problème le plus fréquent. Les deux côtés doivent porter le même vnum.
- Le core ne démarre pas : une ligne corrompue dans le proto (colonne manquante, nom de type erroné). Consulte les logs syserr.
- Objet invisible/case vide : un mauvais chemin d'icône/modèle dans
item_list.txt. - Nom vide ou affiché comme une clé : ligne manquante dans
item_names.txtou encodage cassé.
Questions fréquentes
Dois-je éditer l'item proto depuis MySQL ou depuis un fichier txt ?
Cela dépend de ta source. Les sources modernes lisent généralement la table MySQL player.item_proto ; dans ce cas tu édites directement la table et tu redémarres le core. Certaines versions lisent un fichier txt/binaire. Si tu n'es pas sûr, vérifie la configuration de démarrage du core et la sortie syserr. Le côté client est un fichier packé dans tous les cas.
Faut-il vraiment redémarrer le serveur pour le changement ?
Comme l'item proto est chargé en mémoire au démarrage, une nouvelle définition d'objet nécessite en pratique un redémarrage du core pour apparaître. Certaines installations ont des commandes de rechargement partiel, mais la voie sûre et propre est de redémarrer le cœur du jeu. Pour les changements client, les joueurs doivent recevoir les fichiers pack/locale mis à jour.
Pourquoi commencer un nouvel objet en copiant un objet existant ?
Parce que le sens de champs comme value0–value5, wearflags et antiflags change selon le type d'objet. Prendre un objet fonctionnel du même type comme modèle te donne une structure valide pour démarrer ; tu ne changes que les champs qui doivent différer, et tu évites largement les erreurs silencieuses.
Tu veux ajouter des objets custom, des sets ou un tout nouveau système à ton serveur ? De l'édition d'item proto au développement de quêtes et de systèmes, je peux t'aider sur les travaux de serveur Metin2. Contacte-moi pour me parler de ton projet.