Das Bearbeiten der Metin2 Mob-KI entscheidet, wann ein Monster einen Spieler bemerkt und angreift, ob es flieht, sobald seine HP sinken, und ob die Mobs in der Umgebung zu Hilfe kommen. Die gute Nachricht: Der Großteil dieses Verhaltens lässt sich allein über ein paar Spalten der Tabelle mob_proto steuern, ohne die C++-Quelle neu zu kompilieren. In diesem Leitfaden gehe ich Schritt für Schritt durch, welche Felder Aggro, Flucht und Gruppenreaktionen steuern und wie du sie sicher änderst.
Wo wird das Mob-Verhalten gespeichert?
Die Grundeinstellungen jedes Monsters stehen in einer Zeile von mob_proto. Auf den meisten Servern werden diese Zeilen aus einer Textdatei (mob_proto.txt) geladen und gelangen über eine Konvertierung mob_proto.txt → mob_proto (binär/DB) ins Spiel. Die direkt KI-relevanten Spalten sind:
AI_FLAG— Verhaltensflags wie Aggressivität, Flucht und Hilfe (als Text geschrieben und mit|verbunden).RANKundTYPE— legen fest, ob der Mob ein normales Monster, ein Metin-Stein oder ein Boss ist; manche KI-Entscheidungen schauen auf diese Einstufung.AGGRESSIVE_HP_PCTundAGGRESSIVE_SIGHT— manche Distributionen ergänzen eigene Spalten für die Aggro-Schwelle und die Sichtreichweite.DAMAGE_RANGE,ATT_SPEED,MOVE_SPEED— beeinflussen, wie aggressiv sich der Angriff anfühlt.
Wichtiger Hinweis: Spaltennamen und ihre Reihenfolge unterscheiden sich je nach Distribution (offiziell, diverse "files"-Packs). Prüfe daher vor jeder Änderung die Spaltenzuordnung in deiner eigenen Quelle — meist in ReadMobProto oder im Code von CMobManager. Die Flag-Namen unten sind die gängigen, ihre Existenz hängt aber von deiner Quelle ab.
Aggressivität mit AI_FLAG einstellen
Die Spalte AI_FLAG ist eine Kombination von Flags, die die Grundpersönlichkeit eines Mobs bestimmen. Die am häufigsten genutzten:
AGGRESSIVE— der Mob greift von sich aus jeden Spieler an, der in seine Reichweite kommt. Ohne dieses Flag reagiert der Mob nur, wenn man ihn trifft (passiv).COWARD— der Mob flieht, sobald seine HP unter ein bestimmtes Verhältnis fallen.NOMOVE— der Mob bewegt sich nicht von seinem Platz; er schlägt, wer in Reichweite kommt, verfolgt aber nicht (gut für Türme, feste Wächter).HELPER— wird ein naher Mob angegriffen, wendet sich auch dieser Mob dem Ziel zu (Gruppenhilfe).BERSERK,STONESKIN,GODSPEED,DEATHBLOW— Boss-Fähigkeiten wie Wut bei niedrigen HP, Schadensreduktion, Tempo oder kritische Treffer.NOATTSHINSU/NOATTCHUNJO/NOATTJINNO— verhindern, dass der Mob ein bestimmtes Königreich angreift (wie NPC-Dorfwachen).
In einer Mob-Zeile sieht das Feld AI_FLAG typischerweise so aus:
VNUM NAME ... AI_FLAG
101 Wild Dog ... AGGRESSIVE
102 Guard ... NOMOVE
531 Captain Mob ... AGGRESSIVE|HELPER|BERSERK
Um einen Wolf passiv zu machen, entfernst du also das Flag AGGRESSIVE; um einen Torwächter sowohl aggressiv als auch ortsfest zu machen, schreibst du AGGRESSIVE|NOMOVE. Du verbindest Flags mit | und setzt keine Leerzeichen dazwischen.
Die Aggro-Reichweite ändern
Wie weit ein Mob einen Spieler bemerkt, wird in der KI-Schleife der Serverquelle berechnet. Ein aggressiver Mob im Idle-Zustand scannt periodisch seine Umgebung; findet er ein gültiges Ziel in Reichweite, wechselt er in den Zustand BATTLE. Diese Scan-Logik liegt meist in char_state.cpp und char_battle.cpp, während der Aggro-Punkt von einer Funktion wie UpdateAggrPoint auf der char.cpp-Seite verwaltet wird.
Es gibt zwei Wege, die Reichweite zu vergrößern:
- Über Daten: Hat deine Distribution eine Spalte wie
AGGRESSIVE_SIGHT, ist das Erhöhen ihres Werts die sauberste Methode — kein Neukompilieren nötig. - Über die Quelle: Fehlt eine solche Spalte, bearbeitest du die feste Reichweite im KI-Scan (eine hartkodierte Zahl, in den meisten Quellen in Metern) und kompilierst die
game-Binary neu.
Mein Rat: Übertreibe die Aggro-Reichweite nicht. Eine zu große Reichweite führt dazu, dass Spieler ständig Mob-Züge ansammeln, und verursacht unfaire Tode auf niedrigen Stufen. Beginne mit einer kleinen Erhöhung und teste.
Fluchtverhalten (COWARD)
Ein Mob mit dem Flag COWARD beginnt sich von seinem Ziel zu entfernen, sobald seine HP unter eine bestimmte Schwelle fallen. Diese Schwelle ist meist in der Quelle hartkodiert (zum Beispiel ein fester HP-Prozentsatz). Willst du also Schwellen pro Mob — "der Hase flieht bei 30 % HP, der Hirsch bei 20 %" — brauchst du eine kleine Quellanpassung, um die Fluchtprüfung an eine Datenspalte zu binden (zum Beispiel indem du das Feld AGGRESSIVE_HP_PCT dafür umnutzt).
Ein häufiger praktischer Eingriff: Farm-Mobs am Fliehen hindern. Spieler hassen es, halbtoten Mobs hinterherzulaufen, die davonrennen. Entferne einfach das Flag COWARD aus der Zeile dieser Mobs.
Gruppen- und Helferverhalten
Wie Mobs gemeinsam reagieren, zählt ebenso viel wie das Verhalten eines einzelnen Mobs. Hier sind zwei getrennte Systeme im Spiel:
- Das HELPER-Flag: Wird ein naher befreundeter Mob angegriffen, wendet sich auch dieser Mob gegen den Angreifer. Ideal für Boss-Wachen und "Elite"-Packs.
- Gruppen-Spawns: Mobs werden nicht einzeln, sondern in Gruppen gespawnt, die in
regen.txtund den Tabellenmob_group/mob_group_groupdefiniert sind. Eine Gruppendefinition besteht aus einem Anführer plus seinen Mitgliedern; dass die ganze Gruppe reagiert, wenn der Anführer getroffen wird, ergibt sich aus dieser Definition zusammen mit der HELPER-Logik.
Eine beispielhafte Gruppendefinition folgt dieser Logik:
Group Bandit_Camp
{
Vnum 1001
Leader "Bandit Chief" 531
1 "Bandit" 530
2 "Bandit" 530
3 "Bandit Archer" 532
}
Stirbt der Anführer, löst sich die Gruppe in manchen Aufbauten auf oder die Belohnung ist an den Anführer gebunden. Die Gruppenschwierigkeit stellst du ein, indem du die VNUMs oder die Anzahl der Mitglieder änderst; gib den Mitgliedern HELPER, und sie greifen alle gleichzeitig an, sobald eines getroffen wird.
Ein sicherer Bearbeitungsablauf
Bevor du auf einem Live-Server testest, halte diese Reihenfolge ein:
- Sichere zuerst
mob_proto.txtund die zugehörigen Tabellen. - Ändere einen einzelnen Mob und prüfe ihn auf einem Testserver (Aggro, Flucht, Gruppe).
- Wende die Änderung an: Führe die Konvertierung
mob_proto.txt→ binär/DB aus und lade dann die Mobs neu (auf den meisten Servern lädt/reload pdas Proto neu; bist du unsicher, ist ein Server-Neustart der garantierte Weg). - Hast du die Quelle geändert, kompiliere und deploye die
game-Binary.
Die häufigsten Flag-Fehler sind ein nicht existierender Flag-Name oder ein Leerzeichen statt |; in dem Fall bleibt der Mob völlig passiv oder das Proto lädt nicht. Im Zweifel ziehe die Flag-Tabelle in der Quelle heran (meist ein FN_*- oder aMobAIFlag-Array).
Häufige Fragen
Kann ich einen Mob aggressiv machen, ohne die Quelle neu zu kompilieren?
Ja. Füge einfach AGGRESSIVE zum Feld AI_FLAG der mob_proto.txt-Zeile hinzu und lade das Proto neu; kein C++-Build nötig. Die Aggro-Reichweite zu ändern erfordert dagegen die Quelle, wenn deine Distribution keine Datenspalte dafür hat.
Warum kann ich die Aggro-Reichweite nicht über Daten ändern?
Weil nicht jede Distribution eine eigene Spalte wie AGGRESSIVE_SIGHT besitzt. Ohne sie ist die Reichweite in der Quelle hartkodiert, und sie zu ändern bedeutet, die game-Binary neu zu kompilieren.
Wie bringe ich eine Gruppe dazu, gemeinsam anzugreifen, wenn einer getroffen wird?
Gib den Mitgliedern das Flag HELPER und spawne sie unter derselben Gruppe in regen.txt / mob_group. So kommen die anderen zu Hilfe, sobald ein Mitglied ins Visier genommen wird.
Mob-KI auszubalancieren erfordert Wissen über Daten und Quelle. Wenn ich das Mob-Verhalten, die Gruppen-Spawns oder die KI-Quelle deines Servers gemeinsam einstellen soll, melde dich — lass uns dein Konzept zusammen ausarbeiten.