Metin2 Quest questlib Fonksiyonları
C++ değil, Lua ile yazılmış yardımcılar: sunucunun quest klasöründeki questlib.lua ve settings.lua dosyasının yüklediği GFquestlib.lua. Öneksiz (global) çağrılırlar; dosyalar sunucuya göre değiştirilmiş olabilir. questlib.lua ayrıca pc, npc ve item tablolarına özellik okuması ekler: pc.level, pc.name, pc.job, pc.gold, pc.hp, pc.empire, pc.x gibi yazımlar ilgili get fonksiyonunu çağırır; npc.race, npc.empire ve item.vnum, item.count, item.level da çalışır. CONFIRM_YES, NOWINDOW, apply.MAX_HP, POINT_MAX_HP gibi sabitler de bu dosyada tanımlıdır. Bu modülde 81 fonksiyon var. Diğer modüller quest fonksiyonları listesinde, quest yazımının temeli quest yazma rehberinde.
| Fonksiyon | Ne yapar | Döner |
|---|---|---|
setstate(durum adı) |
q.setstate'in kısa adı (dosyada setstate = q.setstate). Derleyici setstate(ad) yazımını da durum değiştirme çağrısına çevirir.setstate("run") |
yok |
newstate(durum adı) |
q.setstate'in ikinci kısa adı; setstate ile aynıdır.newstate("run") |
yok |
q.set_clock(ad, değer (saniye)) |
Görev penceresindeki saat satırının adını ve değerini birlikte ayarlar (q.set_clock_name ve q.set_clock_value).q.set_clock("Kalan süre", 600) |
yok |
q.set_counter(ad, değer) |
Görev penceresindeki sayaç satırının adını ve değerini birlikte ayarlar (q.set_counter_name ve q.set_counter_value).q.set_counter("Kalan kurt", 20) |
yok |
c_item_name(vnum) |
İstemcinin eşya adına çevirdiği [ITEM value;vnum] etiketini döndürür; ad oyuncunun istemcisindeki dilde, kırmızı renkte görünür.say(c_item_name(27001).." getir.") |
metin |
c_mob_name(vnum) |
İstemcinin canavar adına çevirdiği [MOB value;vnum] etiketini döndürür.say(c_mob_name(101).." avla.") |
metin |
color256(kırmızı, yeşil, mavi (0-255)) |
Diyalog metni için renk etiketi üretir; 0-255 değerleri istemcinin beklediği 0-1 aralığına çevrilir. say içinde metinle birleştirilir.say(color256(255, 255, 0).."Sarı yazı"..color256(196, 196, 196)) |
metin |
color(kırmızı, yeşil, mavi (0-1)) |
Renk etiketi üretir; değerler çevrilmeden yazılır, bu yüzden 0-1 arasında ondalık verilmelidir.say(color(1, 0.5, 0).."Turuncu yazı") |
metin |
delay(gecikme) |
Diyalog metninin harf harf yazılma gecikmesini değiştiren [DELAY] etiketini döndürür. | metin |
setcolor(kırmızı, yeşil, mavi (0-1)) |
Renk etiketini doğrudan diyalog tamponuna yazar; sonraki metin bu renkte görünür.setcolor(1, 0, 0) |
yok |
setdelay(gecikme) |
[DELAY] etiketini diyalog tamponuna yazar. | yok |
resetcolor() |
Metin rengini varsayılana döndüren [/COLOR] etiketini yazar.resetcolor() |
yok |
resetdelay() |
Yazma gecikmesini varsayılana döndüren [/DELAY] etiketini yazar.resetdelay() |
yok |
trim(metin) |
Metnin başındaki ve sonundaki boşlukları siler.local ad = trim(input()) |
metin |
addmapsignal(x, y) |
İstemcinin büyük haritasına bir işaret noktası ekler ve haritayı açar. | yok |
clearmapsignal() |
Haritadaki quest işaretlerini temizler.clearmapsignal() |
yok |
setbgimage(dosya adı) |
Diyalog penceresinin arka plan resmini ayarlar. | yok |
addimage(x, y, dosya adı) |
Diyalog penceresine verilen konumda bir resim ekler. | yok |
notice_multiline(metin, duyuru fonksiyonu) |
Metni [ENTER] işaretlerinden bölüp her satırı verilen duyuru fonksiyonuna (notice, notice_all, d.notice gibi) ayrı ayrı gönderir.notice_multiline("Etkinlik başladı.[ENTER]Kayıtlar açık.", notice_all) |
yok |
makequestbutton(başlık) |
Ekranda geçerli quest'e ait bir görev simgesi (mektup) gösterir; oyuncu tıklayınca quest'in button olayı çalışır.makequestbutton("Yeni görev") |
yok |
make_quest_button_ex(başlık, simge türü, simge adı) |
makequestbutton gibidir, ayrıca simge türünü ve adını istemciye gönderir; 'item' türünde simge adı bir eşya vnum'udur. Test sunucusunda tür ve adı sohbete de yazar.make_quest_button_ex("Görev", "item", 30006) |
yok |
make_quest_button(başlık) |
makequestbutton ile aynı.make_quest_button("Yeni görev") |
yok |
send_letter_ex(başlık, simge türü, simge adı) |
Simgeli görev mektubu gönderir: make_quest_button_ex ile simgeyi gösterir, diyalog penceresini gizler, görev başlığını ayarlar ve quest'i başlamış işaretler.send_letter_ex("Ödülün hazır", "item", 27001) |
yok |
send_letter(başlık) |
Görev mektubu gönderir: ekranda simge gösterir, diyalog penceresi açmaz, görev başlığını ayarlar ve quest'i görev penceresi listesine ekler (q.start). Çoğunlukla letter olayında kullanılır.send_letter("Köy muhtarı seni çağırıyor") |
yok |
clear_letter() |
q.done() çağırır; quest görev penceresi listesinden kalkar.clear_letter() |
yok |
say_title(metin) |
Metni açık sarı başlık renginde (255, 230, 186) bir diyalog satırı olarak yazar, sonra rengi varsayılan griye döndürür.say_title("Demirci:") |
yok |
say_reward(metin) |
Metni açık kırmızı ödül renginde (255, 200, 200) yazar, sonra rengi varsayılana döndürür.say_reward("Ödül: 10.000 Yang") |
yok |
say_pc_name() |
Oyuncunun adını sonuna iki nokta koyarak bir diyalog satırı olarak yazar.say_pc_name() |
yok |
say_size(genişlik, yükseklik) |
Diyalog penceresinin boyutunu ayarlayan [WINDOW_SIZE] etiketini yazar.say_size(350, 300) |
yok |
setmapcenterposition(x, y) |
İstemcinin büyük haritasının merkezini verilen konuma ayarlayan [SETCMAPPOS] etiketini gönderir. | yok |
say_item(başlık, vnum, açıklama) |
Diyalog penceresine eşyanın resmini başlık ve açıklamayla birlikte ekler.say_item("Kırmızı İksir", 27001, "HP doldurur.") |
yok |
say_show_item(vnum) |
Diyalog penceresine yalnız eşyanın resmini ekler.say_show_item(27001) |
yok |
say_item_vnum(vnum) |
Eşyanın resmini sunucudaki adıyla birlikte gösterir; say_item(item_name(vnum), vnum, "") kısaltmasıdır.say_item_vnum(30006) |
yok |
say_item_vnum_inline(vnum, sıra (0'dan başlar), toplam (en çok 3)) |
Aynı satırda en çok üç eşya resmi göstermek içindir; sıra toplamdan küçük olmalıdır, toplam 3'ü geçerse bir şey yazmaz.say_item_vnum_inline(27001, 0, 2) |
yok |
pc_is_novice() |
Oyuncu henüz beceri grubu seçmediyse true döner.if pc_is_novice() then |
true/false |
pc_get_exp_bonus(EXP, metin) |
Metni ödül renginde yazar, oyuncuya EXP verir (pc.give_exp2) ve levelup adlı quest'i run durumuna geçirmeye çalışır. | yok |
pc_get_village_map_index(sıra (1 ya da 2)) |
Oyuncunun krallığına göre birinci köyün (1, 21, 41) ya da ikinci köyün (3, 23, 43) harita numarasını döndürür.local koy = pc_get_village_map_index(1) |
sayı |
pc_has_even_id() |
Oyuncunun kimliği (PID) çift sayıysa true döner.if pc_has_even_id() then |
true/false |
pc_get_account_id() |
Adının aksine hesap kimliğini döndürmez: hesap kimliği tek sayıysa true döner. Hesap kimliğinin kendisi için pc.get_account_id kullanılır. | true/false |
npc_is_same_empire() |
Geçerli NPC oyuncuyla aynı krallıktansa true döner.if not npc_is_same_empire() then return end |
true/false |
npc_get_skill_teacher_race(krallık (1-3), sınıf (0-3), beceri grubu (1 ya da 2)) |
Verilen krallık, sınıf ve beceri grubu için beceri öğretmeni NPC'sinin vnum'unu döndürür; bulunamazsa 0. Listede Lycan yoktur.local vnum = npc_get_skill_teacher_race(pc.get_empire(), pc.get_job(), 1) |
sayı |
pc_find_square_guard_vid() |
Oyuncunun krallığının meydan muhafızının (vnum 11000, 11002, 11004) VID'ini döndürür. Dosyada iki kez tanımlıdır; geçerli olan sonraki tanımdır.local vid = pc_find_square_guard_vid() |
sayı |
pc_find_skill_teacher_vid(beceri grubu (1 ya da 2)) |
Oyuncunun sınıfına ve krallığına uygun beceri öğretmeninin VID'ini döndürür; hedef işareti koymak için kullanılır.local v = pc_find_skill_teacher_vid(1) |
sayı |
npc_is_same_job() |
Geçerli NPC oyuncunun sınıfının beceri öğretmenlerinden biriyse true döner.if npc_is_same_job() then |
true/false |
npc_get_job() |
Geçerli NPC bir beceri öğretmeniyse sınıf ve grubunu gösteren koşul sabitini (COND_WARRIOR_1 gibi) döndürür; değilse 0.local is = npc_get_job() |
sayı |
time_min_to_sec(dakika) |
Dakikayı saniyeye çevirir.timer("bekle", time_min_to_sec(5)) |
sayı |
time_hour_to_sec(saat) |
Saati saniyeye çevirir.local sure = time_hour_to_sec(2) |
sayı |
next_time_set(saniye, test sunucusundaki saniye) |
Geçerli quest'in __NEXT_TIME__ bayrağına şimdiki zaman artı saniyeyi yazar; test sunucusunda ikinci değeri kullanır. Bekleme süreli görevler içindir.next_time_set(3600, 60) |
yok |
next_time_is_now() |
__NEXT_TIME__ bayrağındaki zaman geldiyse true döner; fonksiyona verilen parametre kullanılmaz.if not next_time_is_now() then say("Biraz sonra gel.") return end |
true/false |
table_get_random_item(tablo) |
Dizi biçimindeki tablodan rastgele bir eleman döndürür.local odul = table_get_random_item({27001, 27002, 27003}) |
tablodaki bir eleman |
table_is_in(tablo, değer) |
Değer dizi biçimindeki tabloda varsa true döner.if table_is_in({20300, 20301}, npc.get_race()) then |
true/false |
giveup_quest_menu(quest başlığı) |
Devam et ya da vazgeç seçimi sunar, vazgeçilirse quest'i başa alır (restart_quest). Seçenek metinleri dosyada Korece kaldığı için Türkçe sunucuda bozuk görünür. | yok |
restart_quest() |
Durumu start yapar ve quest'i görev penceresi listesinden kaldırır.restart_quest() |
yok |
complete_quest() |
Durumu __COMPLETE__ yapar ve quest'i görev penceresi listesinden kaldırır.complete_quest() |
yok |
giveup_quest() |
Durumu __GIVEUP__ yapar ve quest'i görev penceresi listesinden kaldırır.giveup_quest() |
yok |
complete_quest_state(durum adı) |
Durumu verilen duruma geçirir ve quest'i görev penceresi listesinden kaldırır.complete_quest_state("bitti") |
yok |
test_chat(metin) |
Metni yalnız test sunucusunda sohbete yazar; hata ayıklama içindir.test_chat("asama: "..pc.getqf("asama")) |
yok |
bool_to_str(true/false) |
Değere göre "true" ya da "false" metnini döndürür.test_chat(bool_to_str(pc.is_gm())) |
metin |
skill_group_dialog(krallık, sınıf, grup) |
Beceri öğretmeni diyaloğunu yürütür: oyuncu öğretmenin sınıfındaysa, grubu yoksa ve en az 5. seviyedeyse onay sorup beceri grubunu seçtirir. Metinler locale.lua'daki skill_group tablosundan gelir; krallık parametresi kullanılmaz.skill_group_dialog(pc.get_empire(), 0, 1) |
yok |
show_horse_menu() |
Oyuncu kendi atına tıkladığında at menüsünü açar: besle (at ölüyse dirilt), bin, geri gönder. Besleme at derecesine göre Saman, Havuç ya da Kırmızı Ginseng'den (50054-50056) birini düşer.show_horse_menu() |
yok |
select(seçenek 1, seçenek 2, ...) |
Diyalogda seçenek düğmeleri gösterir, oyuncu seçene kadar betiği bekletir ve seçilen düğmenin sırasını (1'den başlar) döndürür.local s = select("Evet", "Hayır") |
sayı |
select_table(tablo) |
select gibidir, seçenekleri bir tablodan alır; seçenek sayısı çalışma anında değişen menüler içindir.local s = select_table(secenekler) |
sayı |
wait() |
Diyalogda devam düğmesi gösterir ve oyuncu tıklayana kadar betiği bekletir.wait() |
yok |
input() |
Oyuncuya metin kutusu açar ve yazılan metni (en çok 64 karakter) döndürür.local ad = input() |
metin |
confirm(vid, ileti, süre (saniye)) |
VID'i verilen oyuncuya evet/hayır onay kutusu gösterir ve cevabı bekler: CONFIRM_YES (1), CONFIRM_NO (0) ya da süre dolarsa CONFIRM_TIMEOUT (2).if confirm(u_vid, pc.get_name().." seninle evlenmek istiyor.", 30) == CONFIRM_YES then |
sayı |
select_item() |
Diyalog penceresini gizler, oyuncuya eşya seçme penceresi açar ve seçilen eşyanın envanter konumunu döndürür.local hucre = select_item() |
sayı |
BuildSkillList(sınıf, grup) |
Oyuncunun sınıf ve grubundaki, seviyesi 0'dan büyük aktif becerilerden vnum ve ad listesi kurar, sonuna 0 ve iptal seçeneğini ekler. Beceri seçtiren menüler içindir.local liste = BuildSkillList(pc.get_job(), pc.get_skill_group()) |
tablo ({vnum listesi, ad listesi}) |
store_charname_by_id(sıra (1-10), karakter adı, kimlik) |
Eski bir etkinlik için hazırlanmış 10 yerlik listeye ad ve kimlik yazar. | yok |
return_charname_by_id(kimlik) |
store_charname_by_id ile saklanan listede kimliği arar ve adı döndürür; kimlik listede yoksa Lua hatası verir. | metin |
get_map_name_by_number(harita no) |
Oyuncunun krallığına göre bazı haritaların (köyler ve 61-65, 72-73) translate.lua'daki adını döndürür; listede olmayan harita için nil.say(get_map_name_by_number(pc.get_map_index())) |
metin ya da nil |
input_number(soru metni) |
Soruyu yazar ve oyuncu bir sayı girene kadar metin kutusunu yeniden açar; girilen sayıyı döndürür.local adet = input_number("Kaç tane istiyorsun?") |
sayı |
get_today_count(quest adı, bayrak adı) |
Verilen quest'in <bayrak>_today ve <bayrak>_today_count bayraklarıyla tutulan günlük sayacı döndürür; gün değiştiyse 0.if get_today_count("gunluk", "odul") >= 3 then |
sayı |
inc_today_count(quest adı, bayrak adı, adet) |
Günlük sayacı bir artırır, yeni günde 1'den başlatır; adet parametresi kullanılmaz. Gün denetiminde pc.getqf kullandığından yalnız quest adı geçerli quest olduğunda doğru sayar.inc_today_count("gunluk", "odul", 1) |
yok |
drop_gamble_with_flag(olay bayrağı adı) |
kill olayında ölen canavarın drop şansını (pc.get_killee_drop_pct) verilen olay bayrağının değerine göre ölçekleyip zar atar; true dönerse quest eşyayı düşürür. Bayrak değeri büyüdükçe şans düşer.if drop_gamble_with_flag("drop_mektup") then game.drop_item(50034, 1) end |
true/false |
get_random_vnum_from_table(tablo {{vnum, ağırlık, en düşük seviye (isteğe bağlı), en yüksek seviye (isteğe bağlı)}, ...}) |
Satırların ağırlığına göre rastgele bir vnum seçer; seviye sınırı verilen satırlar oyuncunun seviyesi aralıkta değilse hesaba katılmaz. Oyuncu seviyesine baktığı için server_timer içinde kullanılmamalıdır. GFquestlib.lua'da tanımlıdır.local v = get_random_vnum_from_table({{27001, 3}, {27002, 1, 20, 50}}) |
sayı |
get_time_remaining(saniye) |
Saniyeyi gün, saat ve dakika metnine çevirmek için yazılmıştır; ancak kullandığı gameforge.locale.time metinleri incelenen paketin translate.lua dosyasında tanımlı olmadığından orada çağrılınca Lua hatası verir. GFquestlib.lua'da tanımlıdır. | metin |
count_item_range(ilk vnum, son vnum) |
Vnum aralığındaki (ör. bir eşyanın +0..+9 vnumları) bütün eşyaların oyuncudaki toplam adedini döndürür. GFquestlib.lua'da tanımlıdır.if count_item_range(10, 19) > 0 then |
sayı |
remove_item_range(adet, ilk vnum, son vnum) |
Vnum aralığındaki eşyalardan toplam adet kadarını küçük vnum'dan başlayarak siler. Toplam yetmiyorsa hiçbir şey silmeden false döner. GFquestlib.lua'da tanımlıdır.if not remove_item_range(5, 30000, 30005) then return end |
true/false |
is_destination_village(kip (1, 2, 3 ya da 65)) |
Oyuncu kip 1'de birinci köylerden birinde, 2'de ikinci köylerden birinde, 3'te bunlardan herhangi birinde, 65'te harita 65'te ise boş metin (Lua'da doğru sayılır), değilse nil döndürür. Görev oku koymadan önce konum denetimi içindir. GFquestlib.lua'da tanımlıdır.if is_destination_village(1) then |
boş metin ya da nil |
say_important_title(metin) |
say_title ile aynı açık sarı renkte bir satır yazar. GFquestlib.lua'da tanımlıdır.say_important_title("Dikkat:") |
yok |
say_important(metin) |
say_important_title ile aynıdır. GFquestlib.lua'da tanımlıdır.say_important("Bu görev bir kez yapılabilir.") |
yok |
Önceki modül: global | Sonraki modül: q
Liste, Metin2 sunucu kaynak kodundaki quest fonksiyon tablolarından (questlua dosyaları) ve sunucunun quest klasöründeki questlib.lua ile GFquestlib.lua dosyalarından çıkarıldı; açıklamalar fonksiyonların gövdelerinden yazıldı. İncelenen kaynak, orijinal koda topluluk düzeltmeleri eklenmiş bir sürümdür: "Topluluk eki" notu taşıyan fonksiyonlar (ENABLE_NEWSTUFF gibi derleme seçenekleri) her sunucuda bulunmaz, kapalı seçeneklere bağlı pc.open_shop0 ve pc.make_guild0 listede yoktur. "Geçerli oyuncu" quest'i tetikleyen oyuncudur; server_timer olaylarında geçerli oyuncu olmadığından pc, npc ve item fonksiyonlarının çoğu orada kullanılamaz. Koordinat birimi fonksiyona göre değişir: kimi metre, kimi oyun birimi (metre × 100) ister. C++'a eklenen yeni bir fonksiyonu kullanmadan önce adını quest klasöründeki quest_functions listesine de eklemek gerekir. Fonksiyonlar kaynak sürümüne göre değişebilir.