İçeriğe geç

Metin2 Proto Dönüştürme: dump_proto ve Mysql2Proto Nasıl Kullanılır?

Hazırlayan: Metin2VIP Editörleri Yayın: 8 dk okuma

Kısaca: Sunucu protoları düz metin dosyalarından (item_proto.txt, mob_proto.txt) ya da MySQL tablolarından okur; istemci ise locale klasöründe sıkıştırılmış ve şifrelenmiş item_proto ve mob_proto dosyaları ister. dump_proto txt dosyalarından bu istemci dosyalarını üretir ya da onları geri açar, Mysql2Proto aynı işi MySQL tablolarıyla yapar. Ana kaynak her zaman sunucunun txt dosyası olmalıdır; istemci dosyasından geriye dönüştürme sunucuya özel alanları kaybettirir.
İçindekiler
  1. Proto dosyaları nerede durur, kim okur?
  2. dump_proto ne yapar?
    1. Açma işlemi neden tehlikelidir?
    2. Hazır DumpProto.exe ve DumpProto.json
  3. Mysql2Proto ne yapar?
  4. Protoları MySQL'den okutmak: PROTO_FROM_DB ve MIRROR2DB
  5. Yeni eşya eklerken izlenecek sıra
  6. /reload p ne zaman yeter?
  7. Sık yapılan hatalar

Sunucu protoları düz metin dosyalarından ya da MySQL tablolarından okur; istemci ise locale klasöründe sıkıştırılmış ve şifrelenmiş iki dosya ister: item_proto ve mob_proto. dump_proto txt dosyalarından bu istemci dosyalarını üretir ya da onları geri açar, Mysql2Proto aynı işi MySQL tablolarıyla yapar. Doğru düzende ana kaynak sunucunun txt dosyasıdır ve istemci dosyası her seferinde ondan üretilir.

Proto dosyaları nerede durur, kim okur?

Dosya Yer Okuyan
item_proto.txt, item_names.txt db klasörü (çoğu kurulumda share/conf'a bağlı) db çekirdeği
mob_proto.txt, mob_names.txt db klasörü db çekirdeği
item_proto, mob_proto tabloları player veritabanı db çekirdeği, yalnız PROTO_FROM_DB 1 ise
locale/tr/item_proto, locale/tr/mob_proto istemcinin locale paketi istemci

Oyun çekirdekleri proto dosyalarını hiç açmaz; tabloları açılışta db'den hazır alır. İstemci ise sunucuyla bu konuda konuşmaz: eşya adını, türünü, ipucundaki değerleri ve fiyatı kendi dosyasından okur. Bu yüzden iki tarafın aynı veriden üretilmesi gerekir; aksi hâlde oyuncu ipucunda bir şey, oyunda başka bir şey görür.

İstemci dosyasının biçimi basittir. item_proto MIPX imzasıyla başlar, ardından sürüm (1), bir eşya kaydının bayt boyu, eşya sayısı ve veri boyu gelir; geri kalanı LZO ile sıkıştırılmış, TEA ile şifrelenmiş tek bir bloktur. mob_proto MMPT imzası, canavar sayısı ve veri boyuyla başlar. İstemci, kayıt boyu tanıdığı yapılardan hiçbiriyle tutmayan bir item_proto'yu reddeder. Bu dosya setindeki istemcide kayıt boyu 241 bayttır, dosyada 9.981 eşya ve 2.178 canavar vardır. Dosyaların locale paketine nasıl girdiği pack dosyaları yazısında.

dump_proto ne yapar?

dump_proto, çalıştığı klasördeki dört dosyayı okur: item_proto.txt, item_names.txt, mob_proto.txt, mob_names.txt. Paketleme sonunda aynı klasöre istemcinin item_proto ve mob_proto dosyalarını yazar. Açma yönünde bunun tersini yapar.

Seçenek Anlamı
-i Eşya protosunu işle
-m Canavar protosunu işle
-p Paketle (txt'den istemci dosyasına)
-u Aç (istemci dosyasından txt'ye)
-d Hata ayıklama: açarken tanınmayan değerleri debug.log dosyasına yazar
-h Yardım

Seçenekler birleştirilir: -pim iki dosyayı birden paketler, -ui yalnız eşya dosyasını açar. Hiç seçenek verilmezse araç iki dosyayı birden paketler. Kaynakla gelen hazır araç paketinde iki betik vardır: DumpProto_Kilitle.bat içinde DumpProto -pim, DumpProto_Aç.bat içinde DumpProto -umi yazar.

DumpProto -pim     (item_proto ve mob_proto üretir)
DumpProto -pi      (yalnız item_proto)
DumpProto -umi     (iki istemci dosyasını txt'ye açar)

Paketlerken araç eşya adlarını item_names.txt'den alır; dosyada adı olmayan eşya Korece adıyla kalır. Eşyalar numaraya göre sıralanır, Specular ve GainSocketPercent istemci dosyasına girer, AddonType girmez. Canavar dosyasına MOB_COLOR'a kadar olan sütunlar yazılır; DAM_MULTIPLY tam sayıya kesilir, POLYMORPH_ITEM, SKILL ve SP sütunları yazılmaz. İstemci bunları kullanmadığı için oyunda sorun çıkmaz.

dump_proto paketlerken db kadar sıkı denetim yapmaz. Tanımadığı bir tür adını hata vermeden 255 olarak yazar, Size'ı 1-3 arasına kırpmaz. Bu yüzden önce txt dosyasını sunucuda dene: db günlüğünde ItemProto Reading Failed yoksa aynı dosyayı paketle.

Açma işlemi neden tehlikelidir?

Açma, açılan protonun txt dosyalarının (item_proto.txt ile item_names.txt, mob_proto.txt ile mob_names.txt) üzerine hiç sormadan yazar. Aracı sunucu dosyalarının bulunduğu klasörde çalıştırmak, elindeki asıl dosyayı kaybetmek demektir; her zaman boş bir klasör kullan.

İkinci sorun biçimdir. Kaynak koddaki dump_proto açarken eski, 33 sütunlu düzeni yazar: başlık adları farklıdır (ITEM_VNUM~RANGE, ADDON_TYPE0 gibi) ve yalnız üç efsun sütunu vardır. Bu yapının db'si 35 sütun ve dört efsun beklediği için böyle bir dosyada dördüncü efsunun yerinde bir sayı okur, ItemProto Reading Failed yazar ve kapanır. Açılan dosyada AddonType da gerçek değer değildir: istemci dosyasında bu alan bulunmadığından araç 15 silah serisi için −1 tahmin eder, geri kalanına 0 yazar.

Canavar tarafında kayıp daha büyüktür. İstemci dosyasında olmayan beceriler, SP değerleri ve dönüşüm küresi açılan mob_proto.txt'de sıfır görünür, DAM_MULTIPLY'ın ondalığı gitmiştir. Bu yüzden açma işlemi yalnız elindeki bir istemci dosyasının içine bakmak için kullanılmalı, sunucunun txt dosyası asla bu çıktıyla değiştirilmemelidir.

Hazır DumpProto.exe ve DumpProto.json

Hazır araç paketindeki DumpProto.exe'nin kaynak kodu pakette yoktur; tür, alt tür ve bayrak adlarını yanındaki DumpProto.json dosyasından okur. Bu listeler bu yapının listeleriyle aynı değildir:

  • Bayrak listesinde ITEM_RARE yoktur ve sıra beşinci bitten sonra kayar.
  • Süre türlerinde altıncı sırada PC_BANG vardır; bu yapıda REAL_TIME altıncı sıradadır.
  • Efsun listesinde 99-106 arası adlar (APPLY_ENCHANT_ELECT..APPLY_ENCHANT_DARK, APPLY_RESIST_HUMAN, APPLY_MOUNT) yerine yer tutucular vardır. Varsayılan item_proto.txt'de APPLY_ENCHANT adları 1.214, APPLY_MOUNT 189, APPLY_RESIST_HUMAN 50 satırda geçer.

Araç bir adın listedeki sırasını değer olarak kullanıyorsa, böyle üretilmiş bir istemci dosyasında süreli eşyaların türü ve bazı bayraklar kayar. Bunu kaynağı olmadan kesinleştirmek mümkün değil; güvenli yol ya JSON'daki listeleri bu yapının sırasına göre düzeltmek ya da kaynak koddaki dump_proto'yu derleyip kullanmaktır. Derleme ortamı source derleme yazısında.

Aynı pakette Protos klasörü de gelir: ae, cz, de, en, tr gibi 16 dil için ayrı klasörler. Bütün dillerde item_proto.txt ve mob_proto.txt aynı dosyadır, yalnız ad dosyaları değişir; tr klasöründekiler sunucunun share/conf dosyalarının aynısıdır.

Mysql2Proto ne yapar?

Mysql2Proto aynı harfleri kullanır ama txt yerine MySQL ile çalışır. -p player veritabanındaki item_proto ve mob_proto tablolarını okuyup istemci dosyalarını üretir. -u istemci dosyalarını açıp her satırı REPLACE INTO ile tablolara yazar. -d verilirse veritabanına hiç bağlanılmaz ve -u çıktısı item_proto.sql ile mob_proto.sql dosyalarına yazılır.

Betik Komut İş
MySQL_to_Proto.bat Mysql2Proto -pim Tablolardan istemci dosyası üretir
Proto_to_MySQL.bat Mysql2Proto -umi İstemci dosyasını tablolara yazar
Proto_to_SQL.bat Mysql2Proto -dumi İstemci dosyasını SQL dosyasına çevirir

Bağlantı bilgileri Mysql2Proto.json dosyasındadır:

{
	"hostname": "VERITABANI_SUNUCUSU",
	"user": "KULLANICI",
	"password": "PAROLA",
	"database": "player",
	"port": 3306
}

Tablodan istemci dosyası üretirken dört efsun okunur, addon_type okunmaz. Simya taşlarında (ITEM_DS) vnum aralığı sütundan değil koddan gelir: bu türdeki her satır 99'luk aralık sayılır.

Ters yönde dikkat gerekir. -u istemci dosyasında ne varsa onu yazar; istemci dosyasında bulunmayan sunucu alanları tabloya sıfır ya da tahmin olarak gider. Canavarların becerileri, SP değerleri ve dönüşüm küresi dump_proto ile üretilmiş bir istemci dosyasında yoktur; AddonType yine 15 silah serisi için tahmin edilir. Araç yazmaya başlamadan önce oturumun sql_mode ayarından STRICT_TRANS_TABLES'ı kaldırır, yani sığmayan değerler hata vermeden kırpılır. Proto_to_MySQL'i sunucu verisini geri getirmenin yolu olarak görmemek gerekir.

Protoları MySQL'den okutmak: PROTO_FROM_DB ve MIRROR2DB

Yaygın kullanılan orijinal kaynakta db protoları yalnız txt dosyalarından okur. Bu kaynakta sonradan eklenmiş ENABLE_PROTO_FROM_DB açıktır ve seçimi db klasöründeki conf.txt yapar:

conf.txt Sonuç
PROTO_FROM_DB = 1 item_proto ve mob_proto MySQL tablolarından okunur
PROTO_FROM_DB = 0 Tablolar db klasöründeki txt dosyalarından okunur
PROTO_FROM_DB = 0 ve MIRROR2DB = 1 txt'den okunan tablolar her açılışta ve her /reload p'de MySQL'e yazılır

Varsayılan pakette PROTO_FROM_DB 0 ve MIRROR2DB 1 yazılıdır. Bu durumda MySQL'deki tablo yalnız bir yansıdır; orada yapılan değişiklik bir sonraki açılışta ezilir. Veritabanlarının genel yapısı veritabanları, conf.txt'nin diğer satırları db conf yazısında.

İki modun da birer tuzağı var. PROTO_FROM_DB 1 iken db eşyanın yalnız ilk üç efsununu okur; dördüncü efsun her zaman 0 kalır. Varsayılan veride dördüncü yuvayı dört binek kostümü kullandığı için etkisi sınırlıdır ama yeni eşyada sürpriz yaratabilir. Boş ya da NULL hücreler de atlanır ve 0 kalır.

MIRROR2DB ise dört efsun sütunu yazar. sql/player.sql içindeki taban şemada applytype3 ve applyvalue3 sütunları yoktur; tablo sql/updates klasöründeki apply3 betiğiyle yeniden kurulmadıysa her yansıtma sorgusu "bilinmeyen sütun" hatası verir. db bu hatayı günlüğe yazıp çalışmaya devam eder, tablo ise hiç güncellenmez.

Yeni eşya eklerken izlenecek sıra

  1. item_proto.txt'ye satırı numarasının yerine ekle, item_names.txt'ye Türkçe adı yaz. Bütün hücreleri doldur.
  2. Sunucuyu yeniden başlat ve db günlüğünde ItemProto Reading Failed olmadığını kontrol et.
  3. Aynı iki txt dosyasını boş bir klasöre kopyala ve DumpProto -pi ile istemcinin item_proto'sunu üret.
  4. İstemcide locale/tr/item_proto'yu bu dosyayla değiştirip locale paketini yeniden paketle.
  5. Simgeyi locale/common/item_list.txt'ye ekle: vnum, tür, simge yolu ve isteğe bağlı model yolu sekmeyle ayrılır; tür alanı okunmaz.
  6. Açıklamayı locale/tr/itemdesc.txt'ye vnum, ad ve açıklama olarak yaz.

item_list.txt'de satırı olmayan eşya için istemci önce icon/item/ altında beş haneli numarasıyla bir dosya arar, sonra aynı Korece adlı başka eşyanın ya da numaranın onluk tabanının simgesine bakar, en sonda varsayılan bir simge gösterir. Simgenin yanlış ya da boş görünmesi çoğunlukla buradan gelir. İstemcinin locale dosyalarının tamamı client locale dosyaları yazısında.

Canavar için sıra aynıdır: mob_proto.txt ve mob_names.txt'ye satır, DumpProto -pm ile istemci dosyası, ayrıca istemcinin npclist.txt dosyasına model klasörü satırı.

/reload p ne zaman yeter?

/reload p komutu IMPLEMENTOR yetkisi ister. db protoları yeniden okur ve çekirdeklere eşya, canavar ve beceri tablolarıyla yasaklı kelime listesini gönderir. Drop dosyaları, NPC marketleri ve refine tablosu bu pakete girmez; onların değişikliği için çekirdekleri yeniden başlatmak gerekir. Komutların listesi GM komutları sayfasında.

Yalnız var olan satırların değerini değiştirdiysen reload yeterlidir. Yeni satır eklediysen çekirdekleri yeniden başlatmak daha güvenlidir: oyundaki her eşya proto tablosuna bellek adresiyle bağlıdır ve tablo büyüdüğünde yeniden ayrılan bellek, o an oyunda olan eşyaların bağlantısını geçersiz bırakır. Aralıklı numaralı satırların listesi de reload'da temizlenmeden yeniden doldurulur.

Sık yapılan hatalar

  • İstemci dosyasını açıp çıkan txt'yi sunucuya koymak.
  • Sunucu ve istemci dosyalarını farklı txt sürümlerinden üretmek.
  • Açma işlemini sunucu dosyalarının bulunduğu klasörde çalıştırmak.
  • Hazır aracın JSON listelerini sunucunun listeleriyle karşılaştırmadan kullanmak.
  • PROTO_FROM_DB 0 iken MySQL tablosunu düzenleyip değişiklik beklemek.
  • Mysql2Proto.json'u ya da araç penceresinin görüntüsünü parolayla birlikte paylaşmak.

Sık sorulan sorular

dump_proto ile açtığım item_proto.txt'yi sunucu neden okumuyor?
Kaynak koddaki dump_proto açma sırasında eski, 33 sütunlu ve üç efsunlu biçimi yazar. Bu yapının db'si 35 sütun ve dört efsun bekler; dördüncü efsun yerine bir sayı okuyunca 'ItemProto Reading Failed' yazıp kapanır. Sunucuda her zaman kendi txt dosyanı ana kaynak olarak tut.
MySQL'deki item_proto tablosunu değiştirdim, oyunda neden değişmedi?
Varsayılan pakette conf.txt'de PROTO_FROM_DB 0 ve MIRROR2DB 1 yazılıdır. db protoları txt'den okur ve her açılışta MySQL tablosunu txt'deki değerlerle ezer. Değişikliği txt'de yap ya da PROTO_FROM_DB'yi 1 yap.
Yeni eşya ekledim, oyunda adı ve simgesi görünmüyor. Ne eksik?
İstemcinin item_proto dosyası yeniden paketlenmemiştir ya da item_list.txt'de simge satırı yoktur. Aynı txt dosyalarından istemci dosyasını yeniden üret, locale paketine koy ve simgeyi item_list.txt'ye ekle.

İlgili sayfalar

Kategori: Server Kurma Proto ve Veri Dosyaları proto item_proto mob_proto dump_proto mysql2proto

Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.