Amiral

Üye
Üye
Mesaj
6
Beğeni
7
Puan
40
Ticaret Puanı
0
9.png
Quest sistemine giriş konusuna hoş geldiniz.
En temelden başlayarak ilerleyeceğiz bu sebeple bu konu hali hazırda,
kapsamlı questler yazabilen kişiler için bildikleri bilgileri içermektedir.
Hadi başlayalım...


Quest Nedir ?​


Lua dili ile yazılan yardımcı yapılardır. Quest sistemi oyunda birçok olayı yöneten sistemdir. NPC işlemleri, item işlemleri gibi.
Küçük işlemleri yeniden derleme gerektirmeden halletmemizi sağlar.
Mesela bir npc eklenecek oyuna ve bu npc sizden bir item alacak ve size başka bir item verecek, bunun için kaynak tarafına ekleme yapıp tekrar derlemek mantıksızdır metin2 gibi büyük frameworklerde bunun yerine kaynak tarafına oyuncudan bir item silme ve oyuncuya bir item verme fonksiyonları tanımlanır ve quest sistemi ile bunu istediğiniz kadar kullanabilirsiniz. Açtıkça açılabilecek bir konu işin detayında iseniz wikipedia'dan yararlanabilirsiniz biz işin sonucuna odaklanacağız.
Questleri script olarak düşünebilirsiniz. Bir script yazarız bunu oyuna ekleriz olay bundan ibaret ve bu scripti yazarken lua dilini ve kaynak tarafında tanımlanan fonksiyonları kullanırız.


box-middle.png

Nasıl Quest Eklenir ?​


Ekleme işlemi files sisteminize ve questin yazılış biçimine göre değişiklik gösterir. Paylaşılan files sistemlerinden birini kullanıyorsanız sıkıntı yok neredeyse hepsi aynı altyapı kullanıyor ve büyük değişiklikler yapılmıyor.​
  • Bir quest dosyası hazırlanır. İster kendiniz yazın ister bulup buluşturun.​
  • Quest dosyası sunucu tarafında quest klasörüne upload edilir.​
  • Upload edilen quest dosyası quest listesine eklenir.​
  • Son olarakta questi derleyecek olan script çalıştırılır ve ya kendiniz derlersiniz.​
Peki neler oluyor ? Kaynakları derlediğinizde oluşan çağırılabilir ikililerden biri de qc dosyası bu dosya quest sisteminin kalbini oluşturmakta.
Yukarıdaki aşamalarda bahsetttiğim questleri derleyen scriptler aslında yaptığı işlem quest listesinin her satırını sırayla okumak ve her okumadan sonra o questi derleyecek olan qc ikilisini çağırmaktır.
Bu scriptin uzantısıyla birlikte adı genelde make.sh'tır.
içeriği ise aşağıdaki gibidir.
make.sh::
#!/usr/local/bin/bash

LIST_FILE='quest_list' # quest listesi

if [ -r $LIST_FILE ]; then # quest listesi bulunmakta ve okunabilir halde kontrolu sağlayan if bloğu

    rm -rdf object # object klasörünü siliyor.
    mkdir object # object klasörünü yeniden oluşturuyor.

    while read line; # her satırı okuyor ve bu sırada while döngüsü başlatıyor.
        do
            ./qc $line #while döngüsü boyunca her satırda yazanı qc yi çağırıp ona girdi olarak veriyor.
        done < $LIST_FILE
else
    echo $LIST_FILE' is missing' # quest listesi dosyası yok diyor if bloğunun else kısmı.
fi


box-middle.png

Quest Derleme​


Questi oyuna başarılı şekilde eklemek aslında başarılı şekilde derleyebilmektir.

1. Quest dosyasının uploadı;​


Ekleyeceğiniz questin dosyasını server tarafına upload ederek başlıyoruz.
özel bir düzenleme yapılmadıysa quest klasörü aşağıdaki lokasyondadır.​


Kod:
/files lokasyonu/locale lokasyonu/quest

Örnek:

Kod:
/usr/game/share/locale/turkey/quest

.lua ve ya .quest dosyamızı buraya upload ediyoruz.

box-middle.png

2.Listeye ekleme;​


Quest listesinin ismi filesten filese değişiklik gösterir. Uzantısı olmayan bir dosyadır genelde. Kendiniz derleyecekseniz listeye eklemenize gerek yok ancak önermiyorum otomasyon scriptleri kullanmak her zaman yararınıza.
Kendi filesinizin quest listesi dosyasını öğrenmek için make.sh içine bakabilirsiniz elbette make.sh ismide farklıysa arayıp bulacaksınız artık, aklıma birşey gelmedi.
Ekleyeceğiniz questi uzantısıyla birlikte uygun yere ekleyeceksiniz.

box-middle.png

3. Questi derleme;​


Eğer questinizde özel tanımlamalar yok ise qc ikilisi ile derleyebilirsiniz.
Script ile listeden toplu derleme (make.sh);

Bu yöntemi kullanırsanız önceden yüklü questler silinir sadece listedeki questler yüklenir, scriptte öncekileri silme kapatılabilir ama daha saçma sorunlar oluşabilir üste yazıp yazamama gibi. Bu yüzden önceki object klasörünü silmek en mantıklısıdır. Bu sebeple script otomatik siler mevcur klasörü.
Silme işleminden önce yedek almak hayat kurtarabilir hata yapma olasılığına karşı. İsterseniz make.sh scriptine yedekleme koşullarıda ekleyebilirsiniz.

Scripti çalıştırma:
cd /usr/game/share/locale/turkey/quest && sh make.sh

Komutunu kullanarak derleyebilirsiniz.
Oyun içindem IMPLEMENTOR hesap ile reload q yazarak aktifleştirebilirsiniz.


box-middle.png

Tekil ekleme;

Kod:
cd /usr/game/share/locale/turkey/quest && ./qc YükleyeceğinizQuest.quest


komutunu kullanarak derleyebilirsiniz. Aynı şekilde reload q ile aktifleştirebilirsiniz.
Eğer questinizde özel tanımlamalar varsa ymir'in yazdığı python scriptini kullanmanız gerekir.
Açıklayacak olursak bu script özel tanımları kullanarak questi düzenleyip o şekilde derler, qc özel tanımları desteklemediğinden. Scripti kullanabilmeniz için sisteminizde python bulunması gerekir.

box-middle.png

Python ile ekleme;

pre_qc scriptini çağırma::
cd /usr/game/share/locale/turkey/quest && python2.7 pre_qc.py -ac

komutunu kullanarak derleyebilirisniz. Quest listesinin adı farklı olabilir scripti notepad++ ile açarak ilgili yeri düzenleyiniz.
box-middle.png

Quest Yazmaya Giriş​


Kişisel önerim quest yazmaya geçmeden önce quest ekleme, silmeyi iyi pekiştirin.
Ana Yapı

Kod:
quest deneme_questi begin

    state start begin

    sizin kodlarınız.

    end

end


Özel durumları ayrı tutarak genel olarak quest yapısı yukarıdaki şekildedir.
Yazacağınız tüm kodlar bu satırlar arasında olacak.
end mantığını açıklamaya bile gerek yok durumları, şartları sonlandırmak için kullanıyoruz

box-middle.png
Şartlar

Şartlar herzaman when ile başlar.
Oyuncunun oyuna girmesiyle başlayan bir quest taslağı.

lua::
quest deneme_questi begin # "deneme_questi" isimli questin başlangıcı.
state start begin # şartın başlangıcı.
when login begin # Oyuncu oyuna bağlandığında.

sizin kodlarınız.

end # when şartının sonu.
end # başlama şartının sonu.
end # questin sonu.


box-middle.png


Oyuncunun NPC ile konuşması ile tetiklenen bir quest taslağı.

lua:
quest deneme_questi begin # "deneme_questi" isimli questin başlangıcı.
state start begin # şartın başlangıcı
when NPC_numarası.chat."CNCN" begin # oyuncu CNCN'e  tıkladığında şartı.

sizin kodlarınız.

end # when şartının sonu.
end # başlangıç şartının sonu
end # quest sonu.

NPC_numarası konuşulacak olan ncp nin mob\_proto da ki kodu CNCN ise npc ile konuşurken oyuncunun tıklayacağı seçimde yazan yazı.


box-middle.png


Oyuncunun iteme tıklaması ile tetiklenen quest taslağı.

lua:
quest deneme_questi begin # deneme_questi isimli quest başlangıcı.
state start begin # başlangıç şartı.
when ITEM_NUMARASI.use begin # iteme tıklama şartı.

sizin kodlarınız.

end # when şartı sonu.
end # şart sonu.
end # quest sonu.



ITEM_NUMARASI tıklanacak itemin item protoda ki kodu.


box-middle.png


Oyuncunun belirli seviyeye ulaşması ile tetiklenen quest.
lua:
quest deneme_questi begin # deneme_questi başlangıç.
state start begin # başlama şartı.
when login or levelup with pc.get_level() >= 31 begin # 31 lv ulaşma şartı.

sizin kodlarınız.

end # when şartının sonu.
end # şart sonu.
end # quest sonu.


Dikkat ettiyseiz login şartıda bulunmakta level alma ile birlikte bunu koymamızın sebebi ise oyuncu her oyuna girdiğinde questin tetiklenmesini istememiz yoksa çok saçma olur, quest bir kere tetiklenir oyuncu kapatırsa bir daha 31 levele ulaşamayacağından quest tetiklenmeyecektir.


box-middle.png


Oyuncunun belirli haritaya ışınlanması ile tetiklenen quest taslağı.

lua:
quest deneme_questi begin # deneme_questi başlangıç.
state start begin # başlama şartı.
when login with pc.get_map_index() == MAP_NUMARASI begin # Belirlenen haritaya bağlanma şartı.

end # when şart sonu.
end # başlama şartı sonu.
end # quest sonu.


MAP_NUMARASI belirlediğiniz haritanın numarası server tarafında, map indexinden bakabilirsiniz.


box-middle.png


Temel Kodlar

Taslakları basitçe anlattık sırada bu taslakların içini nasıl dolduracağız onu öğrenmek kaldı. Direkt olarak quest fonksiyonlarına ve daha detaylı sistemlere girmeden önce basit kodları kullanarak birkaç quest yazmaya çalışalım. Size önerim verdiğim örnekleri kendi sisteminizde test edin hem pratik olur hem daha iyi pekiştirirsiniz

say

Ekrana yazı basmak için kullanılır diyerek geçebiliriz.
say ile her satıra 49 karakter sığdırabilirsiniz yoksa aşağıya kayar.
lua:
quest deneme_say_questi begin
state start begin
when NPC_VNUM.chat."deneme_say_questi"
say_title("BASLIK")
say("MMOTUTKUNLARI bi harika dostum...")
end
end
end



box-middle.png


İşleri biraz ilerletelim oyuncu için seçim hazırlayalım.
lua:
quest deneme_say_questi begin
state start begin
when NPC_NUMARASI.chat."deneme_say_questi"
say_title("BASLIK")
say("MMOTUTKUNLARI bir harika dostum")
say("Sencede öyle değil mi? ")
local secim=select("Evet", "Hayır", "Tabe la.") # Seçimler

end
end
end




box-middle.png


İyi güzelde seçim yaptırdık ancak ne işe yaradı elbette hiçbir işe yaramadı şimdi yapılan seçimlere göre durumlar ayarlıyalım.
lua:
quest deneme_say_questi begin
state start begin
when NPC_VNUM.chat."deneme_say_questi"
say_title("BASLIK")
say("MMOTUTKUNLARI bir harika dostum")
say("Sencede öyle değil mi ? ")
local secim=select("Evet", "Hayır", "Tabe la.")
if secim == 1 then
say_title("Birinci Seçim")
say("Afferim düzgün birine benziyorsun.")
elseif secim == 2 then
say_title("İkinci Seçim")
say("Ne demek la, kaybol gözüm görmesin.")
elseif choix == 3 then
say_title("Üçüncü Seçim")
say("Yes science bitc** Mr.White")
end
end
end
end



box-middle.png


Yapılan seçimlere göre birşeyler yazdırdık elbette bir işe yaramadı ancak mantığı kavramanıza yardımcı olmuştur. Bir sonraki öğretici konuda görüşmek üzere.
 
Geri
Üst