Atların ötesine geçip oyuncularına savaş binekleri sunmak istiyorsan, metin2 binek sistemi üzerinde söz sahibi olman gerekir. Klasik at sürme (riding) mekaniği çoğu istemcide hazır gelir; asıl iş, binekleri birer item olarak tanımlamak, her bineğe model ve bonus atamak, savaş bineği ile dekoratif bineği ayırmak ve tüm bunu sunucu ekonomisini bozmadan dengelemektir. Bu rehberde bineklerin item_proto tarafından server koduna ve quest fonksiyonlarına kadar uçtan uca nasıl kurulduğunu adım adım anlatıyorum.
Binek sistemi nasıl çalışır?
Metin2'de binek, görsel olarak karakterin altına bindiği bir mob modelidir. Yani her binek aslında mob_proto içinde kendi vnum'una sahip bir kayıttır; karakter o vnum'a "biner" ve sunucu karakterin durumuna RIDING bayrağını ekler. Bunu tetikleyen şey ise envanterdeki binek item'ıdır. Akış şöyle işler:
- Oyuncu bir binek item'ını kullanır (çift tıklar).
- Sunucu item'a bağlı mob vnum'unu okur ve karakteri o modele bindirir.
- Binek aktifken karaktere bonus affect'leri uygulanır (HP, hareket hızı, saldırı değeri vb.).
- Süre dolduğunda ya da oyuncu inince binek ve bonuslar kaldırılır.
Bu ayrım önemlidir: görsel (mob modeli), tetikleyici (envanter item'ı) ve etki (bonus affect'leri) üç farklı katmandır. Hepsini doğru bağlamazsan ya görünmeyen bir binek ya da bonusu çalışmayan bir item elde edersin.
item_proto: binek item'ını tanımlamak
Her binek için item_proto tablosunda bir kayıt açarsın. Binek item'ları, kullanıldığında karakteri bindiren kullanılabilir (USE) tipte item'lardır. Kritik alan, item'ın hangi binek modeline karşılık geldiğini belirten değerdir — yani value alanlarından biri, bineğin mob_proto vnum'unu tutar. Tipik bir örnek:
vnum | name | type | subtype | value0 | value1
---------+-------------------+-----------+-------------+--------+-------
71114 | Savas Ati (Kirmizi)| ITEM_USE | USE_MOUNT | 20114 | 0
Burada value0 bineğin mob vnum'udur (örnek: 20114), value1 ise süre kontrolü için kullanılabilir (saniye cinsinden; 0 = süresiz). Kullandığın source sürümüne göre alan adları/sıralaması değişebilir; bu yüzden kendi item_proto şablonunu referans al ve uydurma değer girme. Değişikliği yaptıktan sonra item_proto'yu istemci tarafına (genelde item_proto ve item_names dosyaları) da yansıtmayı unutma; aksi halde item istemcide görünmez ya da "boş" görünür.
Bineğin modeli ve bonusları
Bineğin kendisi mob_proto içinde tanımlanır. Buradaki en önemli kısım model dosyası (binek .gr2 / motion paketi) ile bineğin tipinin doğru ayarlanmasıdır. Binek bonusları, oyuncu bindiğinde devreye giren affect'lerdir ve genelde iki yoldan verilir:
- Sabit bonuslar: bineğe gömülü, her bindiğinde aynı olan değerler (örneğin +%20 hareket hızı).
- Quest tabanlı bonuslar: oyuncu bindiğinde quest mantığıyla eklenen, süreli veya koşullu bonuslar.
İkinci yöntem çok daha esnektir çünkü bonusu kodu derlemeden, sadece quest dosyasını güncelleyerek değiştirebilirsin. Server source'unu derlemek istemiyorsan tüm denge ayarını quest tarafında tutmak akıllıca olur.
Savaş bineği ve quest fonksiyonları
Metin2'de iki tür binek vardır: yalnızca dekoratif/hız sağlayan normal binek ve üzerindeyken saldırı yapmana izin veren savaş bineği. Savaş bineği, bineğe binmiş haldeyken silah kullanmana ve özel binek becerilerini (örneğin atlı saldırı) tetiklemene olanak tanır. Bu davranış sunucu kodunda binek tipine göre belirlenir.
Bineği quest'ten yönetmek için Metin2'nin yerleşik pc fonksiyonları kullanılır. En sık kullanılanlar:
-- Oyuncuyu 20114 numaralı binege 60 saniyeligine bindir
pc.mount(20114, 60)
-- Oyuncu su an binekte mi?
if pc.is_mount() then
say("Zaten binektesin.")
end
-- Binekten indir
pc.unmount()
-- Binege binildiginde sureli bonus uygula
-- (apply tipi, deger, sure[sn])
pc.mount_bonus(apply.MOV_SPEED, 20, 60)
Bir binek item'ını quest'e bağlamak istersen, item kullanımını yakalayıp orada pc.mount çağırırsın:
quest binek_savas_ati begin
state start begin
when 71114.use begin
if pc.is_mount() then
pc.unmount()
else
pc.mount(20114, 0) -- suresiz bin
pc.mount_bonus(apply.MAX_HP, 3000, 0)
pc.mount_bonus(apply.ATT_GRADE_BONUS, 50, 0)
end
end
end
end
Burada aynı item hem binme hem inme görevi görür; oyuncu zaten binekteyse iner, değilse biner. Bonusları pc.mount_bonus ile vermek, denge ayarını tek bir quest dosyasında toplamanı sağlar. Önemli: kullandığın apply sabitlerinin server kaynağındaki tanımlarla birebir aynı olduğundan emin ol; yanlış apply tipi sessizce hiçbir şey yapmaz ya da beklenmedik bir bonus verir.
Dengeleme: bonusları kontrolden çıkarmamak
Binek bonusları, bir sunucudaki PvP ve ekonomi dengesini en hızlı bozan unsurlardan biridir. Çünkü herkesin erişebildiği güçlü bir binek, kalıcı bir istat bufu hâline gelir ve oyuncuyu "binmek zorunda" bırakır. Birkaç pratik kural:
- Bonusları mütevazı tut. Hareket hızı binek için doğal bir bonustur; ama saldırı/savunma istatlarını şişirmek tüm denge tablonu bozar. Küçük başla, oyuncu geri bildirimiyle artır.
- Savaş bineklerini ayrı bir katmanda tut. Savaş bineği güçlü bir avantajdır; onu herkesin sürekli kullanabileceği ucuz bir item yapma. Süreli (örneğin etkinlik veya market) tutmak dengeyi korur.
- PvP haritalarında sınır koy. Lonca savaşı veya arena gibi alanlarda binek bonuslarının ya da bineğe binmenin kapatılması, becerinin item'a yenik düşmesini önler.
- Süre ve maliyeti birlikte düşün. Kalıcı bineği bedavaya verirsen değeri sıfırlanır; süreli + makul fiyatlı binekler hem ekonomiyi hem oyun içi hedefleri ayakta tutar.
Her değişiklikten sonra syserr günlüklerini kontrol et: yanlış bir vnum ya da eksik bir model, oyuncu bindiğinde sessiz bir crash'e ya da görünmez binek hatasına yol açabilir.
Test ve yayına alma
Bineği canlıya çıkarmadan önce bir GM hesabıyla şu kontrol listesini geç: item kullanılınca binek görünüyor mu, bonuslar uygulanıyor mu (karakter bilgisini açıp istatları doğrula), süre dolunca ya da pc.unmount() ile düzgün iniliyor mu, ışınlanma/ölüm/lonca savaşı gibi sınır durumlarında binek takılı kalmıyor mu. İstemci ve sunucu item_proto'larının senkron olduğundan emin ol; en sık karşılaşılan hata, sunucuda var olan ama istemciye yansıtılmamış bir bineğin oyuncuda görünmemesidir.
Sık Sorulan Sorular
Binek ile pet (evcil hayvan) arasındaki fark nedir?
Pet karakterin yanında yürüyen, ayrı bir varlık olarak bonus veren ve genelde beslenen bir sistemdir. Binek ise karakterin üzerine bindiği bir modeldir ve binili olduğun sürece bonus verir. Kod tarafında ikisi de mob modeline dayanır ama farklı bayrak ve mekaniklerle yönetilir.
Bonusları kod derlemeden değiştirebilir miyim?
Evet. Bonusları pc.mount_bonus ile quest dosyasından verirsen, server source'unu yeniden derlemene gerek kalmaz; sadece quest'i güncelleyip quest klasörünü yeniden yükletmek (quest reload) yeterlidir. Bu, denge testlerini çok hızlandırır.
Binek bindiğimde görünmüyor, neden?
Neredeyse her zaman istemci-sunucu uyumsuzluğudur: bineğin mob_proto kaydı sunucuda var ama istemcideki mob_proto ya da model paketi (.gr2/motion) eksiktir. Önce vnum'ların eşleştiğini, sonra model dosyasının istemci paketinde bulunduğunu doğrula; syserr ve istemci log'u genelde eksik dosyayı söyler.
Sunucuna dengeli bir binek sistemi mi kuracaksın? Metin2 server source, quest ve item düzenlemelerinde — savaş bineklerinden bonus dengesine kadar — birlikte çalışabiliriz. Projeni konuşmak için benimle iletişime geç.