aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Metin2 Quest Fonksiyonları: En Çok Kullanılanlar

Metin2 quest fonksiyonları, sunucu tarafında çalışan Lua tabanlı görev sistemi üzerinde her şeyin döndüğü temel araçlardır. NPC ile konuşmaktan eşya vermeye, oyuncunun seviyesini okumaktan harita ışınlamasına kadar yaptığın hemen her işlem, bu fonksiyonların bir kombinasyonudur. Bu yazıda quest'lerde en sık karşılaşacağın komutları pc, npc, game ve item namespace'lerine göre ayırarak, çalışan örneklerle anlatıyorum.

Quest yapısının temel iskeleti

Fonksiyonlara geçmeden önce bir quest'in genel kalıbını hatırlamakta fayda var. Her quest bir state içerir, her state de tetikleyici olaylara (when) bağlanır. En yaygın tetikleyici, bir NPC ile sohbet (chat) açmaktır.

quest selamlama begin
    state start begin
        when 9003.chat."Merhaba dostum" begin
            say_title("Köylü")
            say("Hoş geldin gezgin!")
            say("")
            say("Sana bir görevim var.")
        end
    end
end

Buradaki 9003 NPC'nin vnum'u, say_title diyalog penceresinin başlığı, say ise metin satırıdır. Boş bir say("") satır arası bırakmak için kullanılır.

pc namespace: oyuncuyu okumak ve değiştirmek

Oyuncuyla ilgili her şey pc namespace'inden geçer. En çok kullanılan Metin2 quest fonksiyonları da burada toplanır. Birkaç örnek:

  • pc.get_level() — oyuncunun seviyesini döner.
  • pc.get_name() — karakter adını verir.
  • pc.get_money() ve pc.change_money(miktar) — yang okuma ve ekleme/çıkarma.
  • pc.give_item2(vnum, adet) — envantere eşya ekler.
  • pc.count_item(vnum) / pc.remove_item(vnum, adet) — eşya sayma ve silme.
  • pc.give_exp2(miktar) — tecrübe puanı verir.
  • pc.warp(x, y) — oyuncuyu koordinata ışınlar.

Tipik bir ödül akışı şöyle görünür:

when 9003.chat."Görevi tamamladım" begin
    if pc.count_item(27001) >= 5 then
        pc.remove_item(27001, 5)
        pc.give_item2(11209, 1)
        pc.give_exp2(50000)
        pc.change_money(100000)
        say("Teşekkürler! Ödülünü al.")
    else
        say("Henüz 5 adet getirmedin.")
    end
end

Burada pc.count_item ile koşul kontrol edilir, ardından pc.remove_item malzemeyi siler ve eşya, tecrübe, yang ödülleri verilir.

Quest flag'leri: pc.setqf ve pc.getqf

Quest'in ilerlemesini kalıcı olarak saklamak için quest flag kullanırsın. pc.setqf("anahtar", deger) bir değeri kaydeder, pc.getqf("anahtar") okur. Bu sayede oyuncunun görevde hangi aşamada olduğunu hatırlarsın.

when 9003.chat."Görevi başlat" begin
    if pc.getqf("asama") == 0 then
        pc.setqf("asama", 1)
        say("Görev başladı. 10 kurt avla.")
    elseif pc.getqf("asama") == 1 then
        say("Hâlâ kurt avlıyorsun.")
    end
end

Flag'ler oyuncuya özeldir ve veritabanında saklandığı için oyuncu çıkış yapıp tekrar girdiğinde değerler korunur. Karmaşık görev zincirlerinde sayaç olarak da kullanılır (örneğin her öldürülen canavarda pc.setqf("sayac", pc.getqf("sayac") + 1)).

npc namespace: konuştuğun NPC hakkında bilgi

Bir chat bloğunun içindeyken npc namespace'i, o anda etkileşimde olduğun NPC'ye işaret eder. Sık kullanılanlar:

  • npc.get_race() — NPC'nin vnum/ırk numarasını döner, tek bir quest'te birden çok NPC'yi ayırt etmek için idealdir.
  • npc.getqf / npc.setqf — NPC'ye özel flag (instance bazlı durumlar için).
  • npc.purge() — NPC'yi sahneden kaldırır, genelde spawn edilmiş geçici NPC'lerde kullanılır.
when 20354.kill begin
    if npc.get_race() == 20354 then
        pc.give_exp2(10000)
        say("Metin taşını yok ettin!")
    end
end

Burada kill tetikleyicisi bir canavar öldüğünde çalışır ve npc.get_race() ile hangi yaratığın öldüğü doğrulanır.

game namespace: dünya ile etkileşim

game namespace'i oyun dünyasına dair genel işlemleri kapsar. Bildirim göstermek, olay bayrakları (event flag) okumak ve oyuncuyu ışınlamak gibi işler buradadır.

  • game.get_event_flag("isim") — sunucu genelinde tanımlı bir event flag'i okur (örneğin bir etkinliğin açık olup olmadığı).
  • game.set_event_flag("isim", deger) — GM komutlarıyla yönetilen küresel bayrakları ayarlar.
  • game.warp(x, y) ve game.warp(x, y, harita) — ışınlama.
  • game.drop_item(vnum, adet) — yere eşya düşürür.
when 9003.chat."Etkinlik var mı?" begin
    if game.get_event_flag("jubilee") == 1 then
        say("Evet, etkinlik açık!")
    else
        say("Şu an etkinlik yok.")
    end
end

item namespace: seçili eşya üzerinde çalışmak

Bir eşyaya tıklandığında veya item.select(vid) ile bir eşya seçildiğinde item namespace'i o eşyaya bağlanır. Yükseltme, soket ve nitelik (attr) sistemlerinin temelidir.

  • item.get_vnum() ve item.get_count() — eşyanın vnum'u ve adedi.
  • item.get_name() — eşyanın adı.
  • item.remove() — seçili eşyayı siler.
  • item.get_socket(index) / item.set_socket(index, deger) — soketleri okuma/yazma.
  • item.get_value(index) — eşyanın değer alanlarını okur.
when 11209.use begin
    item.set_socket(0, 1)
    say("Eşya başarıyla aktifleştirildi.")
end

Burada use tetikleyicisi eşya kullanıldığında çalışır ve item.set_socket ile ilk soket güncellenir. Soket sistemiyle çalışırken indekslerin 0'dan başladığına dikkat et.

Yardımcı fonksiyonlar: say, select, wait

Diyalog akışını yöneten yardımcılar da en az namespace'ler kadar sık kullanılır. select("Seçenek 1", "Seçenek 2") oyuncuya bir menü gösterir ve seçilen seçeneğin numarasını döner. wait() diyaloğu bekletip "Devam" düğmesi gösterir.

when 9003.chat."Seçim yap" begin
    say("Hangi ödülü istersin?")
    local sec = select("Kılıç", "Zırh", "Vazgeç")
    if sec == 1 then
        pc.give_item2(11209, 1)
    elseif sec == 2 then
        pc.give_item2(11949, 1)
    end
end

Sık Sorulan Sorular

pc.give_item ile pc.give_item2 arasındaki fark nedir?

pc.give_item2(vnum, adet) bugün standart olarak kullanılan ve adet parametresi alan sürümdür. Eski pc.give_item imzaları farklı parametre düzenine sahip olabilir; yeni quest'lerde tutarlılık için pc.give_item2 tercih edilir.

Quest flag'leri nerede saklanır?

Oyuncuya özel flag'ler (pc.setqf) veritabanında, karakterin oyun durumuyla birlikte tutulur; oyuncu çıkıp girse bile değerler kalıcıdır. Event flag'ler ise sunucu geneline aittir ve genelde GM tarafından yönetilir.

Quest dosyasını değiştirince yeniden başlatmak gerekir mi?

Genelde quest'leri derleyip (quest derleyicisi) yeniden yükleyerek değişiklikleri uygularsın. Birçok sunucuda bunun için ayrı bir reload mekanizması vardır; aksi halde game core'un quest'leri tekrar okuması gerekir.

Quest sisteminde takıldın mı? Metin2 sunucun için özel görev zincirleri, etkinlik sistemleri veya hata ayıklama desteğine ihtiyacın varsa benimle iletişime geç — birlikte çözelim.

Bu kategorideki tüm yazılar →

Devamı için