Bir özel sunucu kurarken er ya da geç kendi yaratıklarını eklemek istersin, ve işin kalbinde metin2 mob proto dosyası durur. Mob proto, sunucudaki her canavarın, NPC'nin ve patronun "kimlik kartıdır": seviye, can, hasar, ırk, direnç ve düşürdüğü eşyaların bir arada tutulduğu büyük bir tablodur. Bu yazıda alanları sade bir dille açıklayacak, ardından boş bir VNUM üzerinden kendi canavarımızı oluşturup hem sunucuya hem istemciye doğru şekilde tanıtacağız.
Mob proto nedir, nerede durur?
Resmi ve eski 40k tabanlı serverfiles'larda mob bilgileri iki biçimde tutulur. Klasik yöntemde insan tarafından okunabilen bir mob_proto.txt dosyası vardır; modern kurulumlarda ise aynı veriler MySQL'deki player.mob_proto tablosunda durur ve dump_proto aracı bu tablodan istemcinin okuyabileceği şifreli mob_proto dosyasını üretir. Hangi sistemde olursan ol mantık aynıdır: her satır bir canavarı, her sütun o canavarın bir özelliğini temsil eder.
İki ayrı taraf olduğunu unutma. Sunucu, savaş hesaplarını (can, hasar, direnç, AI) yapmak için protoyu okur. İstemci ise canavarın adını, modelini ve klasörünü bilmek için kendi proto kopyasına ihtiyaç duyar. İki taraf da aynı VNUM'u tanımıyorsa ya canavar görünmez ya da istemci çöker.
En önemli alanlar
Proto satırı onlarca sütundan oluşur, ama bir canavarın karakterini belirleyen birkaç tanesi başı çeker:
- VNUM — Benzersiz kimlik numarası. Tüm sistem bu numara üzerinden konuşur; çakışma olmamalı.
- NAME / LOCALE_NAME — Oyuncunun gördüğü ad. Yerelleştirme için ayrıca
mob_names.txtkullanılır. - RANK —
PAWN,S_PAWN,KNIGHT,S_KNIGHT,BOSS,KING. Patron mu sıradan mı olduğunu belirler. - TYPE —
MONSTER,NPC,STONE(metin taşı),WARP,DOORgibi. Canavar içinMONSTER. - BATTLE_TYPE —
MELEE,RANGE,MAGICgibi saldırı tarzı. - LEVEL, MAX_HP, ST/DX/HT/IQ, DAMAGE_MIN/MAX, DEF — Temel savaş istatistikleri.
- AI_FLAG —
AGGRESSIVE(saldırgan),COWARD(kaçak),NOMOVE(yerinde durur) gibi davranış bayrakları. - RACE_FLAG —
ANIMAL,UNDEAD,DEVIL,ORCgibi ırk. Bazı eşya ve becerilerin ek hasarı buna göre işler. - IMMUNE_FLAG —
STUN,SLOW,POISONgibi bağışıklıklar. - RESIST_* / ENCHANT_* — Silah türlerine ve sihre karşı direnç ile saldırıya eklenen efektler (zehir, sersemletme, kritik).
- EXP, GOLD_MIN/MAX, DROP_ITEM — Ödüller ve düşürdüğü eşya grubunun bağı.
- FOLDER — İstemcideki model klasörünün adı. Burası yanlışsa istemci modeli bulamaz.
Yeni canavarın için boş bir VNUM seç
İlk kural çakışmayı önlemektir. Var olan bir VNUM'u ezmek, o canavara bağlı tüm regen ve quest'leri bozar. Genellikle 20000 ve üzeri aralık özel içerik için boştur. Mevcut tabloda numaranın gerçekten boş olduğunu doğrula:
-- MySQL tabanlı kurulumda
SELECT vnum, locale_name FROM player.mob_proto WHERE vnum = 20801;
Sonuç boşsa o numarayı kullanabilirsin. Metin dosyasıyla çalışıyorsan mob_proto.txt içinde aynı VNUM'u aratıp olmadığından emin ol.
Satırı oluştur
Pratik bir yol, kendine benzeyen var olan bir canavarın satırını kopyalayıp üzerinde oynamaktır; böylece bütün sütunları sıfırdan doldurmazsın. Örneğin sıradan bir kurt türünü temel alıp güçlendirilmiş bir "Gölge Kurdu" yapalım. Metin dosyasında satır sekmeyle (TAB) ayrılır ve başlık satırındaki sıraya birebir uymak zorundadır:
# VNUM NAME RANK TYPE BATTLE_TYPE LEVEL ... MAX_HP ... EXP GOLD_MIN GOLD_MAX ...
20801 Golge_Kurdu KNIGHT MONSTER MELEE 42 ... 18500 ... 9200 500 1400 ...
Sütun sayısı ve sırası serverfiles sürümüne göre değiştiği için, gerçek satırı her zaman aynı dosyadaki bir başka canavardan türet; uydurma sütun ekleme. MySQL tarafındaysan aynı işi bir INSERT ile yaparsın:
INSERT INTO player.mob_proto (vnum, name, locale_name, rank, type, battle_type, level, max_hp, exp, gold_min, gold_max)
VALUES (20801, 'Golge_Kurdu', 'Gölge Kurdu', 'KNIGHT', 'MONSTER', 'MELEE', 42, 18500, 9200, 500, 1400);
-- diğer sütunlar tablonun varsayılanlarıyla dolar; gerektikçe UPDATE ile ayarla
Adın yerelleştirilmesi için mob_names.txt dosyasına da VNUM ve görünen adı ekle. Düşürdüğü eşyaları ise mob_drop_item.txt / common_drop_item.txt içinde ilgili VNUM'a bağlayarak ya da bir quest ile tanımla.
İstemci tarafını unutma
Sunucu canavarı bilse bile, oyuncunun ekranında görünmesi için istemcinin de aynı VNUM'u tanıması gerekir. Bunun için dump_proto ile yeni bir istemci mob_proto üretip oyuncu istemcisine dağıtırsın. Ayrıca FOLDER alanında belirtilen model klasörü, istemcinin paketlerinde (genelde .gr2 model ve dokuları) gerçekten bulunmalıdır. Yeni bir model eklemiyorsan, mevcut bir kurt modelinin klasörünü göstermen en güvenli yoldur.
Yükle ve test et
Değişiklik bittikten sonra protonun sunucuda taze okunması için ilgili çekirdekleri (db ve game/ch katmanları) yeniden başlat. Sonra oyun içinde bir GM hesabıyla test et:
// GM komutuyla canavarı yanına çağır (serverfiles'a göre)
/m 20801
Canavar doğru ad, doğru model ve makul istatistiklerle çıkıyorsa proto tarafı tamamdır. Kalıcı olarak haritada belirmesi için ise harita sunucusunun regen.txt (ya da patronlar için boss.txt) dosyasına bir doğma kaydı eklersin. Test sırasında sık karşılaşılan iki hata: istemcide görünmemesi (FOLDER yanlış veya istemci proto eski) ve sunucunun açılışta çökmesi (satırdaki sütun sayısı başlıkla uyuşmuyor).
Sık Sorulan Sorular
mob_proto.txt mı yoksa MySQL mi kullanmalıyım?
Serverfiles'ının hangi sistemi okuduğuna bağlı. Yeni nesil dosyalar genellikle player.mob_proto tablosunu temel alır ve istemci protosunu dump_proto ile üretir. İkisini birden kullanan kurulumlarda kaynak hep aynı olmalı; yoksa sunucu ve istemci farklı veri görüp çakışır.
Yeni canavar çıkıyor ama eşya düşürmüyor, neden?
Mob proto eşya düşüşünü doğrudan tutmaz; düşüşler mob_drop_item.txt, common_drop_item.txt gibi ayrı dosyalarda ya da quest'lerde tanımlıdır. Yeni VNUM'u bu sistemlerden birine bağlamadıysan canavar boş düşer.
Sunucu açılışta neden çöküyor?
En yaygın sebep, eklediğin satırdaki sütun sayısının ya da bir alanın türünün (örneğin sayı beklenen yere metin) başlık satırıyla uyuşmamasıdır. Satırı her zaman var olan bir canavardan kopyalayarak başla ve sekme hizalamasını boz.
Kendi sunucun için özel canavarlar, patronlar veya dengeli bir mob ekonomisi mi kurmak istiyorsun? Metin2 proto, quest ve sistem düzenlemelerinde yardıma ihtiyacın olursa benimle iletişime geç — projeni birlikte sağlam temellere oturtalım.