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

Metin2 Item Proto Düzenleme ve Yeni Eşya Ekleme

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 player veritabanında item_proto tablosundan ya da bir item_proto metin/binary dosyasından gelir. Çekirdek açılışta bu veriyi belleğe yükler.
  • İstemci tarafı: İstemcinin pack klasöründe şifreli/paketli bir item_proto dosyası bulunur. İstemci eşyanın görsel ve oynanış bilgisini buradan okur. Ayrıca locale altında eşya adlarını tutan item_names.txt, ikon ve model yollarını eşleyen item_list.txt ve açıklamaları tutan itemdesc.txt vardı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: value0value5 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.
  • type ve subtype: örn. silah için ITEM_WEAPON + WEAPON_SWORD; zırh için ITEM_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_BODY vb.).
  • limittype0/limitvalue0: kuşanma şartı, çoğunlukla LIMIT_LEVEL ve 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ırhlarda value1 savunmayı 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 ve pack içine koy.
  • locale/<dil>/item_names.txt → satır biçimi vnum[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ü value0value5, 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ç.

Devamı için