Bir Metin2 sunucusu işletiyorsan eninde sonunda yeni bir silah, zırh ya da kuşam eklemek isteyeceksin ve bunun kalbinde metin2 item proto verisi yatar. Item proto, oyundaki her eşyanın kimliğini, türünü, hasarını, savunmasını, kuşanma şartlarını ve bonuslarını tutan tablodur. Bir eşyayı düzgün eklemek demek, bu veriyi hem sunucu hem de istemci tarafında tutarlı şekilde güncellemek demektir. Bu rehberde sıfırdan yeni bir eşyayı baştan sona ekliyoruz: vnum seçimi, sunucu kaydı, istemci dosyaları, ikon ve model, ardından test.
Item proto nedir ve nerede durur?
Item proto iki ayrı yerde yaşar ve bu ikisi birebir aynı olmak zorundadır:
- Sunucu tarafı: Oyun çekirdeği (game core) eşya tanımlarını okur. Kaynak sürümüne göre bu veri ya MySQL'deki
playerveritabanındaitem_prototablosundan ya da biritem_protometin/binary dosyasından gelir. Çekirdek açılışta bu veriyi belleğe yükler. - İstemci tarafı: İstemcinin
packklasöründe şifreli/paketli biritem_protodosyası bulunur. İstemci eşyanın görsel ve oynanış bilgisini buradan okur. Ayrıcalocalealtında eşya adlarını tutanitem_names.txt, ikon ve model yollarını eşleyenitem_list.txtve açıklamaları tutanitemdesc.txtvardır.
Bir eşya yalnızca sunucuda tanımlıysa istemci onu çizemez (görünmez/hatalı görünür); yalnızca istemcide tanımlıysa sunucu onu üretemez. Her iki tarafta da aynı vnum ve uyumlu değerler bulunmalıdır.
Başlamadan önce: yedek ve vnum seçimi
İlk kural: yedek al. Hem MySQL item_proto tablosunun bir dump'ını, hem de düzenleyeceğin tüm .txt/pack dosyalarının kopyasını bir kenara koy. Tek bir bozuk satır çekirdeğin eşya yüklemesini durdurabilir.
İkinci adım vnum (eşya numarası) seçmek. Her eşyanın benzersiz bir vnum'ı olur. Çakışma olmaması için kullanılmayan bir aralık seç. Standart silahlar genelde 0–8000 bandındadır; özel/custom eşyalar için yüksek ve boş bir aralık (örneğin 30000+) kullanmak çakışma riskini azaltır. MySQL'de boşta vnum bulmak için:
SELECT vnum FROM player.item_proto WHERE vnum BETWEEN 30000 AND 30100 ORDER BY vnum;
Bu aralıkta hiç satır dönmüyorsa orası güvenle kullanılabilir.
Sunucu tarafı: item proto'ya yeni eşya eklemek
Yeni eşyayı sıfırdan tanımlamak yerine, aynı türden mevcut bir eşyayı şablon olarak kopyalamak en güvenilir yöntemdir. Yeni bir kılıç ekliyorsan var olan bir kılıcın satırını al, vnum ve adını değiştir, sonra yalnızca farklı olması gereken alanları (hasar, kuşanma seviyesi, bonuslar) düzenle. Bunun nedeni: value0–value5 alanlarının anlamı eşya türüne göre değişir, dolayısıyla doğru türden bir örnekten gitmek hata payını ortadan kaldırır.
Önemli sütunlar:
vnum: benzersiz numara.name/locale_name: sunucu içi ad.typevesubtype: örn. silah içinITEM_WEAPON+WEAPON_SWORD; zırh içinITEM_ARMOR+ARMOR_BODY.antiflags: hangi sınıfların/cinsiyetlerin kullanamayacağı (örn.ANTI_WARRIOR).wearflags: eşyanın nereye kuşanıldığı (WEAR_WEAPON,WEAR_BODYvb.).limittype0/limitvalue0: kuşanma şartı, çoğunluklaLIMIT_LEVELve seviye değeri.applytype0..2 / applyvalue0..2: eşyanın verdiği bonuslar (örn.APPLY_ATT_SPEED,APPLY_MAX_HP).value0..value5: türe özel değerler. Silahlarda yaygın eşleme:value3= minimum fiziksel hasar,value4= maksimum fiziksel hasar,value5= büyü/ek saldırı; zırhlardavalue1savunmayı taşır. Yine de doğru türden bir eşyadan kopyalayıp karşılaştırarak ilerle.price,refined_vnum(yükseltme zinciri),socket0..2(yuva sayısı),addon_type.
MySQL'de en hızlı yol, mevcut bir kılıcı çoğaltmaktır:
INSERT INTO player.item_proto
SELECT * FROM player.item_proto WHERE vnum = 19; -- örnek bir kılıç
-- sonra yeni satırı düzenle:
UPDATE player.item_proto
SET vnum = 30001, name = 'Yeni Kilic', value3 = 60, value4 = 90
WHERE vnum = 19 AND price = (SELECT ... ); -- doğru satırı hedeflediğinden emin ol
Pratikte daha temiz olan, mevcut satırı dışa aktarıp düzenleyip vnum = 30001 olarak yeni satır olarak eklemektir. Eğer kaynağın metin dosyasından okuyorsa, item_proto txt'sini bir dönüştürücüyle açıp tab ile ayrılmış yeni satırı ekler, sonra tekrar paketlersin. Değişikliğin etkili olması için çekirdeği yeniden başlat; proto belleğe açılışta yüklenir.
İstemci tarafı: item proto, item_names ve item_list
İstemci dosyaları için bir proto dönüştürme aracı (community araçları paketli item_proto'yu düzenlenebilir .txt'ye çevirir, sonra geri paketler) kullanırsın. Akış:
item_proto(istemci) → tab ayrımlı txt'ye dönüştür, sunucudakiyle aynı vnum ve değerlerde yeni satırı ekle, geri paketle vepackiçine koy.locale/<dil>/item_names.txt→ satır biçimivnum[TAB]Görünen Ad. Yeni vnum ve oyunda görünecek adı ekle. Bu dosya UTF olmadan, doğru kodlamada (genelde sunucu diline göre) tutulmalı.locale/<dil>/item_list.txt→ her vnum'ı ikon ve model yoluna eşler:vnum[TAB]ITEM[TAB]icon/item/xxxx.tga[TAB]d:/ymir work/item/.../xxxx.gr2. Yeni eşyanın ikon ve model yollarını burada tanımla.locale/<dil>/itemdesc.txt→ isteğe bağlı açıklama metni.
İkon ve model eklemek
Eşyanın elde/envanterde görünmesi için iki varlık gerekir: ikon (.tga, genelde 32×32, envanter karesinde görünen) ve 3D model (karakterin elindeki/üstündeki). İkonu istemcinin icon/item/ yoluna koy ve item_list.txt'te bu yola işaret et. Yeni bir görsel hazırlamadıysan, başlangıç olarak benzer bir eşyanın ikon ve model yolunu yeniden kullanabilirsin — eşya çalışır, sadece mevcut bir görsel gösterir. Özgün bir model gerekiyorsa .gr2 dosyasını uygun klasöre koyup yolu item_list.txt'te tanımlarsın. İkon yolu yanlışsa envanterde boş/kırmızı kutu görürsün; bu, yolu düzeltmen gerektiğinin en yaygın işaretidir.
Test, reload ve sık yapılan hatalar
Sunucuyu yeniden başlattıktan sonra GM hesabıyla içeri gir ve eşyayı üret:
/item 30001
# veya ad ile (item_names doğruysa):
/item Yeni_Kilic
Eşya envantere düşüyor, doğru adı ve ikonu gösteriyor, kuşanılınca hasar/savunma ve bonuslar tabloyla uyuşuyorsa iş tamamdır. Sık karşılaşılan hatalar:
- Sunucu ve istemci vnum uyuşmazlığı: en yaygın sorun. İki tarafta da aynı vnum olmalı.
- Çekirdek açılmıyor: proto'da bozuk satır (eksik sütun, yanlış tip adı). Syserr loglarına bak.
- Eşya görünmüyor/boş kutu:
item_list.txt'teki ikon/model yolu hatalı. - Ad boş/anahtar gibi görünüyor:
item_names.txt'te satır yok ya da kodlama bozuk.
Sık Sorulan Sorular
item_proto'yu MySQL'den mi yoksa txt dosyasından mı düzenlemeliyim?
Kaynağına bağlı. Modern kaynaklar genellikle MySQL player.item_proto tablosunu okur; bu durumda doğrudan tabloyu düzenleyip çekirdeği yeniden başlatırsın. Bazı sürümler bir txt/binary dosyası okur. Hangisini kullandığını bilmiyorsan, çekirdeğin başlatma konfigürasyonunu ve syserr çıktısını kontrol et. İstemci tarafı her durumda paketli dosyadır.
Değişiklik için sunucuyu yeniden başlatmam şart mı?
Item proto açılışta belleğe yüklendiği için yeni eşya tanımının görünmesi pratikte çekirdek yeniden başlatması ister. Bazı kurulumlarda kısmi yeniden yükleme komutları olsa da, garantili ve temiz yol oyun çekirdeğini yeniden başlatmaktır. İstemci değişiklikleri için oyuncuların güncel pack/locale dosyalarını alması gerekir.
Yeni eşyaya neden mevcut bir eşyadan kopyalayarak başlamalıyım?
Çünkü value0–value5, wearflags ve antiflags gibi alanların anlamı eşya türüne göre değişir. Aynı türden çalışan bir eşyayı şablon almak, geçerli bir yapıyla başlamanı sağlar; sen yalnızca farklı olması gereken alanları değiştirirsin ve sessiz hataları büyük ölçüde önlersin.
Kendi sunucun için custom eşya, set veya yeni bir sistem mi eklemek istiyorsun? Item proto düzenlemeden quest ve sistem geliştirmeye kadar Metin2 sunucu işlerinde yardımcı olabilirim. Projeni anlatmak için benimle iletişime geç.