Het bewerken van de Metin2 mob-AI bepaalt wanneer een monster een speler opmerkt en aanvalt, of het vlucht zodra zijn HP daalt, en of de mobs eromheen te hulp schieten. Het goede nieuws: het grootste deel van dit gedrag regel je met slechts een paar kolommen in de tabel mob_proto, zonder de C++-source te hercompileren. In deze gids loop ik stap voor stap door welke velden aggro, vluchten en groepsreacties besturen, en hoe je ze veilig wijzigt.
Waar wordt mobgedrag opgeslagen?
De kerninstellingen van elk monster staan in één rij van mob_proto. Op de meeste servers worden deze rijen geladen uit een tekstbestand (mob_proto.txt) en komen ze in het spel via een conversie mob_proto.txt → mob_proto (binary/DB). De kolommen die direct met AI te maken hebben:
AI_FLAG— gedragsvlaggen zoals agressie, vluchten en helpen (als tekst geschreven en gekoppeld met|).RANKenTYPE— bepalen of de mob een normaal monster, een metin-steen of een boss is; sommige AI-beslissingen kijken naar deze classificatie.AGGRESSIVE_HP_PCTenAGGRESSIVE_SIGHT— sommige distributies voegen aparte kolommen toe voor de aggro-drempel en het zichtbereik.DAMAGE_RANGE,ATT_SPEED,MOVE_SPEED— beïnvloeden hoe agressief de aanval aanvoelt.
Belangrijke noot: kolomnamen en hun volgorde verschillen per distributie (officieel, diverse "files"-packs). Controleer dus voordat je iets wijzigt de kolomtoewijzing in je eigen source — meestal in ReadMobProto of de code van CMobManager. De vlagnamen hieronder zijn de gangbare, maar hun aanwezigheid hangt af van je source.
Agressie afstellen met AI_FLAG
De kolom AI_FLAG is een combinatie van vlaggen die de basispersoonlijkheid van een mob bepalen. De meest gebruikte:
AGGRESSIVE— de mob valt uit zichzelf elke speler aan die binnen zijn bereik komt. Zonder deze vlag reageert de mob alleen wanneer je hem raakt (passief).COWARD— de mob vlucht zodra zijn HP onder een bepaalde verhouding zakt.NOMOVE— de mob beweegt niet van zijn plek; hij slaat wie binnen bereik komt maar achtervolgt niet (handig voor torens, vaste wachters).HELPER— wanneer een nabije mob wordt aangevallen, keert deze mob zich ook tegen het doelwit (groepshulp).BERSERK,STONESKIN,GODSPEED,DEATHBLOW— bossvaardigheden zoals woede bij lage HP, schadereductie, snelheid of kritieke treffers.NOATTSHINSU/NOATTCHUNJO/NOATTJINNO— beletten dat de mob een specifiek rijk aanvalt (zoals NPC-dorpswachters).
In een mobrij ziet het veld AI_FLAG er doorgaans zo uit:
VNUM NAME ... AI_FLAG
101 Wild Dog ... AGGRESSIVE
102 Guard ... NOMOVE
531 Captain Mob ... AGGRESSIVE|HELPER|BERSERK
Om een wolf passief te maken verwijder je dus de vlag AGGRESSIVE; om een poortwachter zowel agressief als stilstaand te maken schrijf je AGGRESSIVE|NOMOVE. Je koppelt vlaggen met | en zet er geen spaties tussen.
Het aggro-bereik wijzigen
Hoe ver een mob een speler opmerkt, wordt berekend in de AI-lus van de serversource. Een agressieve mob in de idle-toestand scant periodiek zijn omgeving; vindt hij een geldig doelwit binnen bereik, dan schakelt hij over naar de toestand BATTLE. Deze scanlogica staat meestal in char_state.cpp en char_battle.cpp, terwijl het aggro-punt wordt afgehandeld door een functie als UpdateAggrPoint aan de char.cpp-kant.
Er zijn twee manieren om het bereik te verbreden:
- Via data: heeft je distributie een kolom als
AGGRESSIVE_SIGHT, dan is de waarde verhogen de schoonste methode — geen hercompilatie nodig. - Via source: bestaat zo'n kolom niet, dan bewerk je het vaste bereik in de AI-scan (een hard-coded getal, in de meeste sources in meters) en hercompileer je de
game-binary.
Mijn advies: overdrijf het aggro-bereik niet. Een te ruim bereik laat spelers voortdurend mob-treinen verzamelen en veroorzaakt oneerlijke sterfgevallen op lage levels. Begin met een kleine verhoging en test.
Vluchtgedrag (COWARD)
Een mob met de vlag COWARD begint zich van zijn doelwit weg te bewegen zodra zijn HP onder een bepaalde drempel zakt. Die drempel is meestal hard-coded in de source (bijvoorbeeld een vast HP-percentage). Wil je dus drempels per mob — "het konijn vlucht bij 30% HP, het hert bij 20%" — dan heb je een kleine source-aanpassing nodig om de vluchtcontrole aan een datakolom te koppelen (bijvoorbeeld door het veld AGGRESSIVE_HP_PCT daarvoor te hergebruiken).
Een veelgebruikte praktische tweak: voorkomen dat farm-mobs vluchten. Spelers haten het om halfdode mobs achterna te zitten die wegrennen. Verwijder gewoon de vlag COWARD uit de rij van die mobs.
Groeps- en helpergedrag
Hoe mobs samen reageren is even belangrijk als het gedrag van een enkele mob. Hier zijn twee aparte systemen in het spel:
- De HELPER-vlag: wanneer een nabije bevriende mob wordt aangevallen, keert deze mob zich ook tegen de aanvaller. Ideaal voor bosswachters en "elite"-packs.
- Groepsspawns: mobs worden niet één voor één gespawnd maar in groepen die zijn gedefinieerd in
regen.txten de tabellenmob_group/mob_group_group. Een groepsdefinitie is een leider plus zijn leden; de hele groep laten reageren wanneer de leider geraakt wordt komt uit deze definitie gecombineerd met HELPER-logica.
Een voorbeeld van een groepsdefinitie volgt deze logica:
Group Bandit_Camp
{
Vnum 1001
Leader "Bandit Chief" 531
1 "Bandit" 530
2 "Bandit" 530
3 "Bandit Archer" 532
}
Wanneer de leider sterft, valt de groep in sommige opstellingen uiteen of is de beloning aan de leider gekoppeld. Je stelt de groepsmoeilijkheid af door de VNUM's of het aantal leden te wijzigen; geef de leden HELPER en ze vallen allemaal tegelijk aan zodra er één wordt geraakt.
Een veilige bewerkingsworkflow
Volg deze volgorde voordat je op een live server test:
- Maak eerst een back-up van
mob_proto.txten de bijbehorende tabellen. - Wijzig één mob en verifieer hem op een testserver (aggro, vluchten, groep).
- Pas de wijziging toe: voer de conversie
mob_proto.txt→ binary/DB uit en herlaad daarna de mobs (op de meeste servers herlaadt/reload pde proto; twijfel je, dan is een serverherstart de gegarandeerde weg). - Heb je de source gewijzigd, compileer en deploy dan de
game-binary.
De meest voorkomende vlagfouten zijn een niet-bestaande vlagnaam schrijven, of een spatie zetten in plaats van |; in dat geval blijft de mob volledig passief of laadt de proto niet. Twijfel je, raadpleeg dan de vlagtabel in de source (meestal een FN_*- of aMobAIFlag-array).
Veelgestelde vragen
Kan ik een mob agressief maken zonder de source te hercompileren?
Ja. Voeg gewoon AGGRESSIVE toe aan het veld AI_FLAG van de mob_proto.txt-rij en herlaad de proto; geen C++-build nodig. Het aggro-bereik wijzigen vereist echter source als je distributie er geen datakolom voor heeft.
Waarom kan ik het aggro-bereik niet via data wijzigen?
Omdat niet elke distributie een aparte kolom als AGGRESSIVE_SIGHT heeft. Zonder die kolom is het bereik hard-coded in de source, en het wijzigen betekent de game-binary hercompileren.
Hoe laat ik een groep allemaal tegelijk aanvallen wanneer er één wordt geraakt?
Geef de leden de vlag HELPER en spawn ze onder dezelfde groep in regen.txt / mob_group. Zo komen de anderen te hulp wanneer één lid wordt aangevallen.
Mob-AI balanceren vraagt kennis van zowel data als source. Wil je dat ik het mobgedrag, de groepsspawns of de AI-source van je server samen afstel, neem dan contact op — dan werken we je concept samen uit.