Bir metin2 level reward sistemi, oyuncu her seviye atladığında otomatik olarak ödül veren küçük ama oyuncuyu bağlayan bir mekaniktir. Yeni başlayanlara erken seviyelerde iksir ve para, ileri seviyelere ise daha değerli eşyalar dağıtarak ilerleme hissini güçlendirir. Güzel tarafı şu: bunun için sunucu kaynağını (source) derlemeye gerek yok. Her şeyi Metin2'nin quest betik diliyle, sadece bir .quest dosyası yazarak halledebilirsin. Bu yazıda bu quest'i sıfırdan, çalışır kod örnekleriyle kuruyoruz.
Mantık: levelup olayını yakalamak
Metin2 quest motoru olay (event) tabanlıdır. İhtiyacımız olan olay when levelup: oyuncu bir seviye atladığı anda tetiklenir. İçeride güncel seviyeyi pc.get_level() ile okur, hangi ödülün verileceğine karar veririz. Tek dikkat noktası, aynı ödülün iki kez verilmemesi; bunu için ilerlemeyi bir quest flag'inde saklayacağız.
pc.get_level()— oyuncunun mevcut seviyesini döndürür.pc.give_item2(vnum, count)— çantaya eşya ekler.pc.change_gold(miktar)— oyuncunun yangını (para) değiştirir.pc.setqf("ad", deger)/pc.getqf("ad")— bu quest'e özel kalıcı bayrak yazar/okur.
İlk çalışan iskelet
Aşağıdaki quest, oyuncu 10. seviyeye ulaştığında bir kez ödül verir ve aynı ödülü tekrar dağıtmaz. Dosyayı level_reward.quest olarak share/locale/.../quest klasörüne koy ve quest listesine ekle.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- 10. seviye ödülü, sadece bir kez
if level == 10 and pc.getqf("lv10") == 0 then
pc.give_item2(27003, 5) -- İyileştirme İksiri örnek vnum
pc.change_gold(50000)
pc.setqf("lv10", 1)
syschat("Tebrikler! 10. seviye ödülünü aldın.")
end
end
end
end
Buradaki 27003 sadece bir örnek vnum'dur; gerçek değeri kendi item_proto tablonda kontrol et çünkü eşya numaraları sunucudan sunucuya değişir.
Birden çok seviyeyi tek tabloyla yönetmek
Her seviye için ayrı if bloğu yazmak hızla dağınıklaşır. Bunun yerine ödülleri bir tabloda (Lua tablosu) tut ve seviyeyi anahtar olarak kullan. Böylece yeni bir ödül eklemek tek satır olur.
quest level_reward begin
state start begin
when levelup begin
local level = pc.get_level()
-- seviye = { item_vnum, adet, yang }
local rewards = {
[10] = { 27003, 5, 50000 },
[20] = { 27005, 5, 100000 },
[30] = { 50300, 1, 200000 },
[40] = { 50300, 2, 400000 },
}
local r = rewards[level]
if r and pc.getqf("lv" .. level) == 0 then
pc.give_item2(r[1], r[2])
pc.change_gold(r[3])
pc.setqf("lv" .. level, 1)
syschat(string.format("%d. seviye ödülü çantana eklendi!", level))
end
end
end
end
Tablo yaklaşımının iki avantajı var: ödül listesini tek yerden yönetirsin ve pc.getqf("lv" .. level) ile her seviyenin kendi bayrağını taşıdığından yeniden verme riski yok. Çantanın dolu olması ihtimaline karşı pc.count_item(vnum) ile kontrol ekleyebilir veya postaya (mail) yönlendirebilirsin.
Çanta dolu olduğunda eşya kaybını önlemek
give_item2 çağrısı, çantada yer yoksa eşyayı sessizce düşürür ya da kaybeder. Erken seviyelerde bu küçük bir sorun ama değerli ödüllerde oyuncuyu üzer. Basit bir koruma, yer olup olmadığını kontrol edip yoksa oyuncuyu uyarmaktır.
local function safe_give(vnum, count)
if pc.get_empty_inventory_count() < 1 then
syschat("Çantanda yer yok! Boşalt ve tekrar dene.")
return false
end
pc.give_item2(vnum, count)
return true
end
Daha sağlam çözümlerde ödülü doğrudan oyuncunun posta kutusuna gönderirsin; böylece oyuncu çevrimdışı olsa veya çantası dolu olsa bile ödül kaybolmaz. Bu, kalıcı (event) ödül sistemlerinde tercih edilen yöntemdir.
Test etme ve yeniden yükleme
Quest'i kaydettikten sonra dosyayı derleyip oyuna yansıtman gerekir. Çoğu sunucu yapısında quest'leri yeniden derlemek için make veya betik tabanlı bir qc (quest compiler) adımı çalıştırılır, ardından oyun (game) çekirdeği yeniden başlatılır veya quest reload yapılır. Test için bir karaktere komutla seviye verip olayın tetiklendiğini, bayrakların doğru yazıldığını ve ödülün geldiğini doğrula.
- Yeni karakterle baştan dene; bayrakların temiz olduğundan emin ol.
- Aynı seviyeye yeniden ulaşmanın (örneğin reset sonrası) ödülü tekrar vermediğini kontrol et.
- Çanta doluyken ödülün davranışını gözlemle.
Sık Sorulan Sorular
levelup olayı her seviyede mi tetiklenir?
Evet, oyuncu her bir seviye atladığında when levelup bloğu çalışır. Birden fazla seviyeyi tek seferde atlayan oyuncularda her atlama için ayrı tetiklenir, bu yüzden tablo tabanlı kontrol güvenlidir.
Eşya vnum'larını nereden bulurum?
Sunucunun item_proto tablosundan veya item_names.txt dosyasından bakabilirsin. vnum'lar her sunucuda farklı olabileceği için yazıdaki örnek numaraları doğrudan kullanma, kendi veritabanından doğrula.
Ödülü posta ile göndermek daha mı iyi?
Değerli veya etkinlik ödüllerinde evet. Posta, çanta dolu ya da oyuncu çevrimdışı olsa bile ödülün kaybolmamasını sağlar; sade iksir/para ödüllerinde doğrudan çantaya vermek yeterlidir.
Sunucun için özel bir ödül veya etkinlik sistemi mi istiyorsun? Metin2 quest ve sistem geliştirme konusunda yardıma ihtiyacın olursa benimle iletişime geç — birlikte oyuncularını oyunda tutan mekanikler kuralım.