Bir Metin2 sunucusunu canlı tutan şey haritalar değil, görevlerdir. Metin2 quest yapımı, oyuncuya ne yapacağını anlatan, ödül veren ve hikâyeyi ilerleten sistemin kalbidir. İyi haber: Metin2'nin quest sistemi, öğrenmesi şaşırtıcı derecede kolay olan Lua tabanlı özel bir dildir. Bu rehberde, kendi sunucum Runa2'de kullandığım gerçek yapıyla sıfırdan bir görev yazmayı göstereceğim.
Quest dosyası nasıl çalışır?
Her quest üç temel bloktan oluşur ve her begin'in bir end'i olmak zorundadır:
- quest — görevin kendisi (benzersiz bir ad).
- state — görevin aşaması.
starther zaman başlangıç aşamasıdır;set_state()ile diğer aşamalara geçilir. - when — bir olay tetikleyicisi:
login,levelup,kill, NPC.clickveya.chatgibi.
İç içe sıra her zaman quest → state → when şeklindedir.
İlk görevin: NPC ile konuşma ve ödül
Aşağıdaki örnek, bir NPC'ye tıklayınca görev veren, oyuncudan onay alan ve tamamlanınca item, deneyim ve para veren tam bir görevdir:
quest welcome begin
state start begin
when 20095.chat."Start the quest" begin
say_title("Villager:")
say("Welcome, adventurer!")
say("Will you help me?")
local answer = select("Sure", "Not now")
if answer == 2 then
return
end
pc.setqf("welcome_step", 1)
set_state(active)
end
end
state active begin
when 20095.chat."Finish the quest" begin
if pc.getqf("welcome_step") == 1 then
say("Thank you! Here is your reward.")
pc.give_item2(27003, 5) -- example item vnum
pc.give_exp2(10000)
pc.change_gold(50000)
set_state(done)
end
end
end
state done begin
when 20095.chat."Finish the quest" begin
say("You have already finished this quest.")
end
end
end
Birkaç detay: tırnak içindeki "Start the quest" metni, oyuncuya gösterilen menü seçeneğidir — kendi dilinde yazabilirsin. select() seçilen şıkkın sırasını döndürür (1, 2…). pc.give_item2(vnum, adet) item verir; 27003 sadece örnek bir item vnum'udur.
Quest flag'leri: ilerlemeyi saklamak
Görevin "hangi aşamada" olduğunu quest flag'leriyle saklarsın. pc.setqf("ad", değer) bir bayrak yazar, pc.getqf("ad") okur. Bu bayraklar oyuncuya özeldir ve kalıcıdır. Örneğin "10 kurt öldür" görevi:
when 101.kill begin
local count = pc.getqf("wolf_count") + 1
pc.setqf("wolf_count", count)
if count >= 10 then
say("You killed 10 wolves!")
pc.give_exp2(50000)
set_state(done)
end
end
Burada 101 kurt mob'unun vnum'u. Her öldürmede sayaç artar; 10'a ulaşınca ödül verilir ve görev done aşamasına geçer.
Sık kullanılan tetikleyiciler
when login begin— oyuncu giriş yaptığında.when levelup begin— seviye atladığında (pc.get_level()ile seviyeyi okuyabilirsin).when <vnum>.kill begin— belirli bir canavar öldürüldüğünde.when <vnum>.click/.chat."Metin"— bir NPC'ye tıklandığında veya menü açıldığında.
Questi derleme ve devreye alma
Yazdığın .quest dosyası doğrudan çalışmaz; önce qc derleyicisiyle derlenmeli. Tipik akış şudur: dosyayı sunucudaki quest klasörüne koy, quest listesine ekle ve derle (genellikle make bunu qc üzerinden yapar). Ardından oyun içinde /reload q ile yeniden yükle ya da çekirdeği yeniden başlat. Bir sözdizimi hatası varsa qc sana satır numarasıyla söyler — bu yüzden her küçük değişiklikten sonra derlemek iyi bir alışkanlıktır.
Hata ayıklama ipuçları
- Akışı görmek için araya geçici
say("buraya geldim")satırları koy. - Bir
endeksikseqcderlemede uyarır; iç içe blokları girintileyerek takip et. - Bayrak isimlerini benzersiz tut; aynı ismi farklı görevlerde kullanmak ilerlemeyi bozar.
Sık Sorulan Sorular
Quest yazmak için Lua bilmek şart mı?
Tam bir Lua uzmanı olman gerekmez. if, değişken ve fonksiyon çağrısı gibi temelleri bilmen, quest sisteminin hazır fonksiyonlarıyla (say, select, pc.give_item2…) birleştiğinde fazlasıyla yeterli.
Quest'i değiştirince sunucuyu kapatmam gerekir mi?
Hayır. Çoğu durumda qc ile derleyip oyun içi /reload q komutuyla anında yenileyebilirsin.
Bir görevde kaç state olabilir?
Pratik bir sınır yok. Basit görevler 2–3 state ile biter; uzun zincir görevler için istediğin kadar aşama ekleyebilirsin.
Sunucun için özel görev sistemi mi istiyorsun? Battle pass'ten günlük görevlere kadar Lua quest sistemleri yazabilirim — benimle iletişime geç.