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

Metin2 Mob AI Düzenleme: Saldırı ve Kaçma Davranışı

Metin2 mob AI düzenlemesi, bir canavarın oyuncuyu ne zaman fark edip saldıracağını, canı azalınca kaçıp kaçmayacağını ve etrafındaki diğer mobların ona yardım edip etmeyeceğini belirler. İyi haber şu: bu davranışların büyük kısmı C++ kaynağını derlemeden, sadece mob_proto tablosundaki birkaç kolonla yönetilebilir. Bu yazıda aggro (saldırganlık), kaçma ve grup tepkilerini hangi alanların kontrol ettiğini ve bunları güvenli şekilde nasıl değiştireceğini adım adım anlatıyorum.

Mob davranışı nerede saklanıyor?

Her canavarın temel ayarları mob_proto içinde bir satırdır. Çoğu serverda bu satırlar bir metin dosyasından (mob_proto.txt) yüklenir ve mob_proto.txt → mob_proto (binary/DB) dönüşümüyle oyuna girer. AI ile doğrudan ilgili kolonlar şunlardır:

  • AI_FLAG — saldırganlık, kaçma, yardımlaşma gibi davranış bayrakları (bunlar metinsel yazılır ve | ile birleştirilir).
  • RANK ve TYPE — mobun normal canavar mı, metin taşı mı, boss mı olduğunu belirler; bazı AI kararları bu sınıflamaya bakar.
  • AGGRESSIVE_HP_PCT ve AGGRESSIVE_SIGHT — bazı dağıtımlarda aggro eşiği ve görüş menzili için ayrı kolonlar bulunur.
  • DAMAGE_RANGE, ATT_SPEED, MOVE_SPEED — saldırının hissedilen agresifliğini etkiler.

Önemli not: kolon adları ve sırası dağıtıma (resmi, çeşitli "files" paketleri) göre değişebilir. Bu yüzden değişiklik yapmadan önce kendi kaynağındaki ReadMobProto ya da CMobManager kodundaki kolon eşlemesine bakman gerekir. Aşağıdaki bayrak isimleri yaygın olanlardır ama varlığı kaynağına bağlıdır.

AI_FLAG ile saldırganlığı ayarlamak

AI_FLAG kolonu, mobun temel kişiliğini belirleyen bayrakların birleşimidir. En çok kullanılanlar:

  • AGGRESSIVE — mob, menziline giren oyuncuya kendiliğinden saldırır. Bu bayrak yoksa mob ancak sen vurunca tepki verir (pasif).
  • COWARD — canı belli bir orana düşünce mob kaçar.
  • NOMOVE — mob yerinden hareket etmez; menzile gireni döver ama peşinden gitmez (kuleler, sabit nöbetçiler için).
  • HELPER — yakındaki bir mob saldırıya uğradığında bu mob da hedefe yönelir (grup yardımı).
  • BERSERK, STONESKIN, GODSPEED, DEATHBLOW — düşük canda öfke, hasar azaltma, hız veya kritik gibi boss yetenekleri.
  • NOATTSHINSU / NOATTCHUNJO / NOATTJINNO — mobun belirli bir imparatorluğa saldırmamasını sağlar (NPC köy muhafızları gibi).

Bir mob satırında AI_FLAG alanı tipik olarak şöyle görünür:

VNUM  NAME            ...  AI_FLAG
101   Wild Dog        ...  AGGRESSIVE
102   Guard           ...  NOMOVE
531   Captain Mob     ...  AGGRESSIVE|HELPER|BERSERK

Yani bir kurdu pasif yapmak için AGGRESSIVE bayrağını silmen, bir kapı bekçisini hem saldırgan hem sabit yapmak için AGGRESSIVE|NOMOVE yazman yeterli. Bayrakları | ile birleştirirsin; aralarına boşluk koyma.

Aggro menzilini değiştirmek

Bir mobun oyuncuyu kaç birim uzaktan fark edeceği, sunucu kaynağındaki AI döngüsünde hesaplanır. Idle (boşta) durumdaki agresif mob, periyodik olarak çevresini tarar; menzil içinde geçerli bir hedef bulursa BATTLE durumuna geçer. Bu tarama mantığı genelde char_state.cpp ve char_battle.cpp içindedir; aggro puanı ise char.cpp tarafındaki UpdateAggrPoint benzeri bir fonksiyonla yönetilir.

Menzili büyütmenin iki yolu var:

  • Veriyle: dağıtımında AGGRESSIVE_SIGHT gibi bir kolon varsa değerini artırmak en temiz yöntemdir; kaynağı derlemen gerekmez.
  • Kaynakla: böyle bir kolon yoksa, AI taramasındaki sabit menzil (çoğu kaynakta metre cinsinden sabit bir sayı) düzenlenir ve game binary'si yeniden derlenir.

Tavsiyem: aggro menzilini abartma. Çok geniş menzil, oyuncunun sürekli mob trenleri toplamasına ve düşük seviyelerde haksız ölümlere yol açar. Önce küçük bir artışla test et.

Kaçma (COWARD) davranışı

COWARD bayraklı bir mob, canı belli bir eşiğin altına düşünce hedeften uzaklaşmaya başlar. Eşik genelde kaynakta sabittir (örneğin canın belli bir yüzdesi). Bu yüzden "tavşan canı %30'a düşünce kaçsın, geyik %20'de kaçsın" gibi mob bazlı farklı eşikler istiyorsan, kaçma kontrolünü bir veri kolonuna (ör. AGGRESSIVE_HP_PCT alanını bu amaçla kullanmak) bağlayacak küçük bir kaynak düzenlemesi gerekir.

Pratikte sık yapılan ayar: toplama (farm) moblarını kaçırtmamaktır. Oyuncular yarı canlı kaçan mobların peşinden koşmaktan nefret eder. Bu mobların satırından COWARD bayrağını kaldırman yeterli.

Grup ve yardımlaşma davranışı

Tek bir mobun davranışı kadar, mobların birlikte nasıl tepki verdiği de önemlidir. Burada iki ayrı sistem devrede:

  • HELPER bayrağı: yakındaki bir dost mob saldırıya uğradığında bu mob da saldırgana döner. Boss korumaları ve "elit" gruplar için idealdir.
  • Grup spawn'ları: moblar haritaya tek tek değil, regen.txt ve mob_group / mob_group_group tablolarındaki gruplar halinde doğar. Bir grup tanımı, bir lider ve ona bağlı üyelerden oluşur; lidere vurunca tüm grubun tepki vermesi bu tanım + HELPER mantığıyla sağlanır.

Örnek bir grup tanımında şu mantık vardır:

Group  Bandit_Camp
{
    Vnum    1001
    Leader  "Bandit Chief"   531
    1       "Bandit"         530
    2       "Bandit"         530
    3       "Bandit Archer"  532
}

Lider ölünce bazı kurgularda grup dağılır ya da ödül lidere bağlanır. Grup zorluğunu üyelerin VNUM'larını veya sayısını değiştirerek ayarlarsın; üyelere HELPER verirsen birine vurulduğunda hepsi birden saldırır.

Güvenli düzenleme akışı

Canlı sunucuda denemeden önce şu sırayı izle:

  • Önce mob_proto.txt ve ilgili tabloların yedeğini al.
  • Sadece bir mobu değiştirip test sunucusunda doğrula (aggro, kaçma, grup).
  • Değişikliği uygula: mob_proto.txt → binary/DB dönüşümünü yap, sonra mobları yeniden yükle (çoğu serverda /reload p proto'yu yeniler; tam emin değilsen sunucu yeniden başlatma garanti yoldur).
  • Kaynak değiştirdiysen game binary'sini derleyip dağıt.

Bayrak yazımında en sık hata, var olmayan bir bayrak adı yazmak ya da | yerine boşluk koymaktır; bu durumda mob ya tamamen pasif kalır ya da proto yüklenmez. Şüphedeysen kaynaktaki bayrak tablosunu (genelde bir FN_* ya da aMobAIFlag dizisi) referans al.

Sık Sorulan Sorular

Mobu kaynağı derlemeden saldırgan yapabilir miyim?

Evet. mob_proto.txt satırının AI_FLAG alanına AGGRESSIVE ekleyip proto'yu yeniden yüklemen yeterli; C++ derlemesi gerekmez. Aggro menzilini değiştirmek içinse dağıtımında veri kolonu yoksa kaynak gerekir.

Aggro menzilini neden veriden değiştiremiyorum?

Çünkü her dağıtımda AGGRESSIVE_SIGHT gibi ayrı bir kolon yoktur. Yoksa menzil kaynakta sabit kodludur ve onu değiştirmek için game binary'sini yeniden derlemen gerekir.

Bir grubu nasıl yaparım da birine vurunca hepsi saldırsın?

Üyelere HELPER bayrağı ver ve onları regen.txt / mob_group içinde aynı grup altında doğur. Böylece bir üye hedef alındığında diğerleri yardıma gelir.

Mob AI'sini dengelemek hem veri hem kaynak bilgisi ister. Sunucunun mob davranışlarını, grup spawnlarını veya AI kaynağını birlikte düzenlememi istersen benimle iletişime geç — kurgunu birlikte çıkaralım.

Bu kategorideki tüm yazılar →

Devamı için