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

Item proto Metin2 : modifier et ajouter un objet

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_proto dans la base MySQL player, soit d'un fichier texte/binaire item_proto. Le core la charge en mémoire au démarrage.
  • Côté client : le dossier pack du client contient un fichier item_proto chiffré/packé. Le client y lit les données visuelles et de gameplay de l'objet. Sous locale se trouvent aussi item_names.txt (noms affichés), item_list.txt (chemins d'icône et de modèle) et itemdesc.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 value0value5 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.
  • type et subtype : ex. pour une arme ITEM_WEAPON + WEAPON_SWORD ; pour une armure ITEM_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 souvent LIMIT_LEVEL et 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 armures value1 porte 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 dans pack.
  • locale/<langue>/item_names.txt → format de ligne vnum[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.txt ou 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 value0value5, 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.

Devamı için