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

Édition de bonus Metin2 : tables attr et types apply

Ces lignes vertes qu'un joueur voit en survolant un objet — « PV max +500 », « Vitesse d'attaque +8 » — sont l'âme d'un serveur. L'édition de bonus Metin2 est l'art de décider quel bonus peut apparaître sur quel objet, avec quelle probabilité et à quelle valeur. Tout cela se trouve dans deux tables de la base player et dans les types apply du cœur de jeu. Dans ce guide, je détaille la logique des tables, le système de probabilité et l'ajout d'un bonus entièrement neuf, avec la configuration de mon propre serveur, Runa2.

Deux tables : item_attr et item_attr_rare

Le réservoir de bonus se trouve dans deux tables de la base player :

  • item_attr — le réservoir d'où sortent les lignes de bonus normales (1re à 4e).
  • item_attr_rare — un réservoir séparé pour la 5e/6e ligne (rare), ajoutée en général par un objet spécial.

Chaque ligne contient un type apply, une valeur prob (poids de probabilité), des paliers de valeur lv1lv5, et des colonnes oui/non indiquant sur quels types d'objets elle peut apparaître :

SELECT apply, prob, lv1, lv2, lv3, lv4, lv5
FROM item_attr
WHERE weapon = 1
ORDER BY prob DESC;

Les colonnes d'emplacement sont en général weapon, body, wrist, foots, neck, head, shield et ear. Un 1 signifie que le bonus peut apparaître sur ce type d'objet ; un 0 qu'il ne le peut pas.

Comment fonctionne prob : un poids, pas un pourcentage

Idée fausse fréquente : prob n'est pas un pourcentage. Quand le cœur attribue un bonus à un objet, il additionne les valeurs prob de toutes les lignes marquées pour cet emplacement (par ex. weapon=1) et tire dans ce total. La chance d'une ligne est donc son propre prob / la somme de tous les prob de cet emplacement. Par conséquent :

  • Pour voir un bonus plus souvent, augmentez son prob.
  • Multiplier toutes les valeurs proportionnellement ne change pas les probabilités relatives — seul le total grandit.
  • Pour retirer complètement un bonus d'un emplacement, mettre sa colonne d'emplacement à 0 est plus sûr que supprimer la ligne.

lv1–lv5 : les paliers de valeur

Quand un bonus est ajouté à un objet, la valeur tirée provient des colonnes lv1lv5, lv1 étant le palier le plus faible et lv5 le plus fort. Par exemple, pour renforcer le bonus de vol de PV sur les armes :

UPDATE item_attr
SET lv1 = 1, lv2 = 2, lv3 = 3, lv4 = 4, lv5 = 6
WHERE apply = 'STEAL_HP';

Attention : la colonne apply stocke le type sans le préfixe « APPLY_ » — c'est-à-dire MAX_HP, ATT_SPEED, STEAL_HP. Ces noms doivent correspondre à la table du cœur de jeu.

Les types apply : d'où viennent les noms ?

Chaque type apply est lié à un nombre et à un type point (statistique) dans le cœur de jeu. Ce mappage se trouve dans le tableau aApplyInfo de srcs/game/src/constants.cpp :

const TValueName aApplyInfo[MAX_APPLY_NUM] =
{
    { "NONE",       APPLY_NONE,       POINT_NONE },
    { "MAX_HP",     APPLY_MAX_HP,     POINT_MAX_HP },
    { "STR",        APPLY_STR,        POINT_ST },
    { "ATT_SPEED",  APPLY_ATT_SPEED,  POINT_ATT_SPEED },
    { "STEAL_HP",   APPLY_STEAL_HP,   POINT_STEAL_HP },
    // ...
};

La première colonne ("MAX_HP") est exactement la valeur apply en base. La deuxième est l'énumération APPLY_ de length.h, et la troisième le type POINT_ qui indique sur quelle statistique la valeur est écrite. Pour ajouter un bonus existant, une ligne en base suffit — son nom est déjà défini dans cette table.

Ouvrir un bonus existant à un nouveau type d'objet

Supposons que vous vouliez que le vol de PV apparaisse aussi sur les bracelets. Il suffit de mettre à jour la colonne d'emplacement de cette ligne :

UPDATE item_attr
SET wrist = 1
WHERE apply = 'STEAL_HP';

Ajouter un nouveau bonus au réservoir n'est qu'un INSERT :

INSERT INTO item_attr
  (apply, prob, lv1, lv2, lv3, lv4, lv5,
   weapon, body, wrist, foots, neck, head, shield, ear)
VALUES
  ('CRITICAL_PCT', 250, 1, 2, 3, 4, 5,
   1, 0, 0, 0, 0, 0, 0, 0);

Ajouter un bonus vraiment NOUVEAU (apply)

Si vous voulez définir un effet entièrement neuf, absent du réservoir, la base ne suffit pas ; il faut toucher au code serveur et client. L'ordre est :

  • length.h — ajoutez le nouveau type à l'énumération APPLY_ et mettez à jour MAX_APPLY_NUM.
  • constants.cpp — ajoutez la ligne { "NOM", APPLY_NOM, POINT_NOM } à aApplyInfo.
  • char.cpp / char_battle.cpp — implémentez la logique PointChange / d'application de l'effet pour le nouveau type POINT_ (s'il s'agit d'un nouveau type de point).
  • Client — les numéros apply dans item_length.h doivent être identiques au serveur ; sinon l'infobulle affiche le mauvais bonus. Ajoutez ensuite le nouveau texte au dictionnaire des noms d'apply dans root/uiToolTip.py et aux fichiers locale.

Si les numéros divergent entre serveur et client, un bonus que le serveur appelle « +5 FOR » apparaît en jeu comme « +5 autre chose » — d'où l'importance de garder les deux côtés synchronisés.

Déployer la modification

Les tables item_attr sont lues par le cœur DB au démarrage puis envoyées au cœur de jeu ; modifier le SQL seul n'a donc aucun effet immédiat. Le flux habituel : appliquez la modification, puis redémarrez les cœurs db et game. Si vous avez touché au code (nouveau type apply), il faut aussi recompiler et déployer le nouveau binaire. Avant la mise en production, rafraîchissez toujours quelques objets sur un serveur de test pour confirmer que les bonus sortent correctement.

Questions fréquentes

Augmenter prob garantit-il l'apparition du bonus ?

Non. prob est un poids ; la chance est le prob de votre ligne divisé par la somme de tous les prob de cet emplacement. Pour une garantie, il faudrait baisser le prob des autres lignes ou réduire les options de cet emplacement.

J'ai modifié le SQL mais rien n'a changé en jeu, pourquoi ?

Parce que les tables attr ne sont pas relues en cours d'exécution. Il faut redémarrer les cœurs db et game ; ce n'est qu'ensuite que les bonus nouvellement attribués utilisent le réservoir mis à jour.

Quelle est la différence entre item_attr et item_attr_rare ?

item_attr sert aux lignes de bonus normales (1re à 4e), tandis que item_attr_rare est un réservoir séparé pour la ligne rare (5e/6e). Elles sont déclenchées par des objets/actions différents.

Vous voulez un système de bonus équilibré pour votre serveur ? Des tables attr aux nouveaux types apply, je peux concevoir et équilibrer votre système de bonus de zéro — contactez-moi.

Bu kategorideki tüm yazılar →

Devamı için