aslain.dev
0%
← Tüm makaleler

Metin2 Quest Sistemi: Lua ile Sıfırdan Görev Yazma

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ı. start her zaman başlangıç aşamasıdır; set_state() ile diğer aşamalara geçilir.
  • when — bir olay tetikleyicisi: login, levelup, kill, NPC .click veya .chat gibi.

İç 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 end eksikse qc derlemede 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ç.

Devamı için