L'édition de l'IA des mobs Metin2 décide quand un monstre repère et attaque un joueur, s'il prend la fuite quand ses PV baissent, et si les mobs autour viennent l'aider. La bonne nouvelle : l'essentiel de ce comportement se contrôle avec quelques colonnes de la table mob_proto, sans recompiler la source C++. Dans ce guide, je détaille quels champs gèrent l'agro, la fuite et les réactions de groupe, et comment les modifier en toute sécurité, pas à pas.
Où le comportement des mobs est-il stocké ?
Les réglages de base de chaque monstre tiennent dans une ligne de mob_proto. Sur la plupart des serveurs, ces lignes sont chargées depuis un fichier texte (mob_proto.txt) et entrent en jeu via une conversion mob_proto.txt → mob_proto (binaire/BDD). Les colonnes directement liées à l'IA sont :
AI_FLAG— drapeaux de comportement comme l'agressivité, la fuite et l'entraide (écrits en texte et reliés par|).RANKetTYPE— définissent si le mob est un monstre normal, une pierre metin ou un boss ; certaines décisions d'IA s'appuient sur ce classement.AGGRESSIVE_HP_PCTetAGGRESSIVE_SIGHT— certaines distributions ajoutent des colonnes distinctes pour le seuil d'agro et la portée de vue.DAMAGE_RANGE,ATT_SPEED,MOVE_SPEED— influencent l'agressivité ressentie de l'attaque.
Note importante : les noms de colonnes et leur ordre varient selon la distribution (officielle, divers packs « files »). Avant toute modification, vérifie donc le mappage des colonnes dans ta propre source — généralement dans ReadMobProto ou le code de CMobManager. Les noms de drapeaux ci-dessous sont les plus courants, mais leur présence dépend de ta source.
Régler l'agressivité avec AI_FLAG
La colonne AI_FLAG est une combinaison de drapeaux qui définissent la personnalité de base d'un mob. Les plus utilisés :
AGGRESSIVE— le mob attaque de lui-même tout joueur qui entre dans sa portée. Sans ce drapeau, le mob ne réagit que lorsqu'on le frappe (passif).COWARD— le mob fuit dès que ses PV passent sous un certain ratio.NOMOVE— le mob ne bouge pas de sa place ; il frappe ceux qui entrent dans sa portée mais ne poursuit pas (utile pour les tours, les sentinelles fixes).HELPER— quand un mob proche est attaqué, ce mob se tourne aussi vers la cible (entraide de groupe).BERSERK,STONESKIN,GODSPEED,DEATHBLOW— capacités de boss comme la rage à bas PV, la réduction de dégâts, la vitesse ou les coups critiques.NOATTSHINSU/NOATTCHUNJO/NOATTJINNO— empêchent le mob d'attaquer un empire précis (comme les gardes PNJ des villages).
Dans une ligne de mob, le champ AI_FLAG ressemble typiquement à ceci :
VNUM NAME ... AI_FLAG
101 Wild Dog ... AGGRESSIVE
102 Guard ... NOMOVE
531 Captain Mob ... AGGRESSIVE|HELPER|BERSERK
Pour rendre un loup passif, tu supprimes donc le drapeau AGGRESSIVE ; pour qu'un garde de porte soit à la fois agressif et immobile, tu écris AGGRESSIVE|NOMOVE. Tu relies les drapeaux par | sans espace entre eux.
Modifier la portée d'agro
La distance à laquelle un mob repère un joueur est calculée dans la boucle d'IA de la source serveur. Un mob agressif en état d'inactivité scanne périodiquement son environnement ; s'il trouve une cible valide à portée, il passe à l'état BATTLE. Cette logique de scan se trouve généralement dans char_state.cpp et char_battle.cpp, tandis que le point d'agro est géré par une fonction du type UpdateAggrPoint côté char.cpp.
Il y a deux façons d'élargir la portée :
- Par les données : si ta distribution a une colonne comme
AGGRESSIVE_SIGHT, augmenter sa valeur est la méthode la plus propre — pas de recompilation. - Par la source : sans une telle colonne, tu modifies la portée fixe du scan d'IA (un nombre codé en dur, en mètres dans la plupart des sources) et tu recompiles le binaire
game.
Mon conseil : n'exagère pas la portée d'agro. Une portée trop large pousse les joueurs à amasser des trains de mobs en permanence et provoque des morts injustes à bas niveau. Commence par une petite augmentation et teste.
Comportement de fuite (COWARD)
Un mob avec le drapeau COWARD commence à s'éloigner de sa cible dès que ses PV tombent sous un certain seuil. Ce seuil est généralement codé en dur dans la source (par exemple un pourcentage fixe de PV). Donc, si tu veux des seuils par mob — « le lapin fuit à 30 % de PV, le cerf à 20 % » — il te faudra une petite modif de source pour lier le contrôle de fuite à une colonne de données (par exemple en réutilisant le champ AGGRESSIVE_HP_PCT).
Un réglage pratique fréquent : empêcher les mobs de farm de fuir. Les joueurs détestent courir après des mobs à moitié morts qui s'enfuient. Il suffit de retirer le drapeau COWARD de la ligne de ces mobs.
Comportement de groupe et d'entraide
La façon dont les mobs réagissent ensemble compte autant que le comportement d'un seul mob. Deux systèmes distincts entrent ici en jeu :
- Le drapeau HELPER : quand un mob ami proche est attaqué, ce mob se retourne aussi contre l'attaquant. Idéal pour les gardes de boss et les packs « élite ».
- Les apparitions de groupe : les mobs ne sont pas apparus un par un mais en groupes définis dans
regen.txtet les tablesmob_group/mob_group_group. Une définition de groupe, c'est un chef plus ses membres ; faire réagir tout le groupe quand on frappe le chef vient de cette définition combinée à la logique HELPER.
Un exemple de définition de groupe suit cette logique :
Group Bandit_Camp
{
Vnum 1001
Leader "Bandit Chief" 531
1 "Bandit" 530
2 "Bandit" 530
3 "Bandit Archer" 532
}
À la mort du chef, dans certaines configurations le groupe se disperse ou la récompense est liée au chef. Tu règles la difficulté du groupe en changeant les VNUM ou le nombre de membres ; donne HELPER aux membres et ils attaquent tous d'un coup quand l'un d'eux est frappé.
Un flux d'édition sûr
Avant de tester sur un serveur live, suis cet ordre :
- Sauvegarde d'abord
mob_proto.txtet les tables associées. - Modifie un seul mob et vérifie-le sur un serveur de test (agro, fuite, groupe).
- Applique la modif : exécute la conversion
mob_proto.txt→ binaire/BDD, puis recharge les mobs (sur la plupart des serveurs,/reload precharge le proto ; en cas de doute, un redémarrage du serveur est la voie garantie). - Si tu as modifié la source, compile et déploie le binaire
game.
Les erreurs de drapeau les plus fréquentes : écrire un nom de drapeau inexistant, ou mettre un espace au lieu de | ; dans ce cas le mob reste totalement passif ou le proto ne se charge pas. En cas de doute, réfère-toi à la table des drapeaux dans la source (généralement un tableau FN_* ou aMobAIFlag).
Questions fréquentes
Puis-je rendre un mob agressif sans recompiler la source ?
Oui. Il suffit d'ajouter AGGRESSIVE au champ AI_FLAG de la ligne mob_proto.txt et de recharger le proto ; aucune compilation C++ nécessaire. Modifier la portée d'agro exige en revanche la source si ta distribution n'a pas de colonne de données dédiée.
Pourquoi ne puis-je pas changer la portée d'agro par les données ?
Parce que toutes les distributions n'ont pas une colonne distincte comme AGGRESSIVE_SIGHT. Sans elle, la portée est codée en dur dans la source, et la changer implique de recompiler le binaire game.
Comment faire qu'un groupe attaque tout entier quand on frappe un seul mob ?
Donne le drapeau HELPER aux membres et fais-les apparaître sous le même groupe dans regen.txt / mob_group. Ainsi, quand un membre est ciblé, les autres viennent à la rescousse.
Équilibrer l'IA des mobs demande des connaissances en données et en source. Si tu veux que je règle ensemble le comportement des mobs, les apparitions de groupe ou la source d'IA de ton serveur, contacte-moi — élaborons ton concept ensemble.