Web Sitemizde 32 Kategoride 30 makale yazılmıştır. Bugüne kadar 5119 kez ziyaret edilmiştir!


( Merhaba arkadaşlar quest derslerine aşağıdaki bağlantılardan gidebilirsiniz. Dersler birbirinin devamıdır. )

quest DERS 1  GİTMEK İÇİN TIKLA

quest DERS 2  GİTMEK İÇİN TIKLA

quest DERS 3  GİTMEK İÇİN TIKLA

quest DERS 4  GİTMEK İÇİN TIKLA

quest DERS 5  GİTMEK İÇİN TIKLA

 

 

 

Merhaba arkadaşlar , quest yazma dersimiz 4 , kaldığımız yerden devam ediyoruz :) şimdi ;

Sırada kısaca "not" komutu var. Bu komutta işimizi oldukça kolaylaştıracak. when ve if komutu ile birlikte kullanılabilir. Mesela şöyle bir örnek verelim. Bir görev yazdınız ve bunun gm karakterlere gelmesini istemiyorsunuz. Şu şekilde yaparsınız;
 

Kod:

quest ornek_quest begin
   state start begin
      when login or levelup with pc.level() == 90 and not pc.is_gm() begin
      send_letter("Gorev")
      end
   end
end

Yukarıda gördüğünüz gibi "not" komutunu and veya with ile beraber kullanırız genelde. "not" Türkçe karşılığı "değil" kelimesine karşılık gelir. Yani yukarıdaki quest şunu yapar. 90. seviyede olup gm olmayan kişilere Gorev adında bir quest butonu gidecek. Bu tür komutlar yazdığınız questlerdeki bugları gidermenize yardımcı olacak. Quest yazmaya başladığınızda ne demek istediğimi daha rahat anlayacaksınız.


Sırada pc.get_name() gibi komutları say(""), notice("") ... gibi komutlar içinde nasıl kullanacağımıza bakalım. Bu tür komutları beraber kullanmak istiyorsak "..pc.get_name().." şeklinde yazmamız gerekir. Şimdi bir örnekle açıklayalım.
 

Kod:

quest ornek_quest begin
   state start begin
      when 1093.kill with pc.get_map_index() == 66 begin
         notice_all(""..pc.get_name()..", "..pc.get_level()..". seviyede Azrail'i öldürdü!")
      end
   end
end

Yukarıdaki quest, indexi 66 olan bir haritada azrail öldürüldüğünde "xxx, xx. seviyede Azrail'i öldürdü!" şeklinde duyuru geçmesini sağlayacak. Bunun sadece oyuncuya gitmesini istersek "notice_all" yerine "notice" kullanırız. Ya da duyuru şeklinde çıkmasını istemiyorsak "chat" kullanırız. Bildiğim tüm kodları ileride tek tek açıklayacağım. Şimdilik bir questin iskeleti nasıl oluşturulur onu öğreniyoruz.

Aynı şeyi kendimiz local kullanarak da yapabiliriz. Yine işimizi kolaylaştıran bir şeyden bahsedeyim. Daha sonra input() komutuna geçeceğim.
 

Kod:

quest ornek_quest begin
   state start begin
      when 20000.chat."İçeri girmek istiyorum." with game.get_event_flag("harita_acik") == 1 begin
         local level = pc.level()
         local isim = pc.get_name()
         if level >= 90 then
         say("Merhaba "..isim..", seni içeriye alabilirim.")
         pc.warp(111100,222200)
         else
         say("Üzgünüm "..isim..". Yeteri kadar güçlü değilsin.")
         end
      end
   end
end

Yukarıdaki quest için "isim" ve "level" kelimelerine, local komutunu kullanarak, bazı komutları atadım. Bu questin daha da uzadığını düşünün. Her seferinde komut yazmaktansa bu belirlediğim kelimeleri kullanmam bana zaman kazandıracaktır. Ayrıca with game.get_event_flag("harita_acik") == 1 kullandım. Bunun bana ne yararı var? Eğer gm karakterimle /e harita_acik 1 yazmadıysam, kimse 20000 numaralı npcye tıkladığında "İçeri girmek istiyorum." diye bir sçenek göremeyecek. Bu da oyun içinde size bazı haritaları istediğiniz zaman kapatıp açma kolaylığını sağlar.

input() komutu ile devam ediyoruz. Bu komut ruh taşı questindeki gibi ya da ejderha odasına girerken şifre yazdığınız kutular için kullanılır. Peki kullanımı nasıldır? Örnekle açıklamaya çalışacağım.

Kod:

quest ornek_quest begin
   state start begin
      when 40000.use begin
      say("Yazdığın yazı tüm imparatorluklarda görülecek.")
      say("Aşağıda gördüğün kutuya söylemek istediğini yaz.")
      local duyuru = input()
      notice_all(""..pc.get_name().." adlı oyuncu şunları söylüyor:")
      notice_all(""..duyuru.."")
      end
   end
end

input() komutundan sonra da end kullanmıyoruz. Kullanımı yukarıdaki gibidir. Ne yaptık? "duyuru" kelimesine input() komutunu atadık ve oyuncunun yazdığı her şey bu sayede "duyuru" kelimesi üzerine kaydedildi. Daha önce yaptığımız gibi "..duyuru.." kullanarak oyuncunun yazdığı şeyleri tüm oyunculara duyurduk.

Geldik 1 quest içinde birden fazla state kullanmaya. Öncelikle bu ne işe yarar? TR deki görevleri düşünün. Uriel'e bir şey götürüyorsunuz sonra size bir şey öldürmenizi söylüyor o dediğini de yapıyorsunuz bu sefer başka bir şey istiyor. Bunları nasıl yapacağımızı küçük örneklerle göstereceğim. Öncelikle hatırlarsanız bir quest içinde birden fazla when kullanırken son kullandığımız when'i end komutu ile bitirip yeni bir when'e başlıyorduk. Burada da aynı şeyi yapacağız fakat son state'te bir komut kullanıp 2. state'i çalıştırmamız lazım. Örnek verecek olursak;
 

Kod:

quest ornek_quest begin
   state start begin
      when 20000.chat."Göreve başla" begin
      say("Demek göreve başlamak istiyorsun.")
      say("Pekala 20 tane xxx canavarı öldür bakalım.")
      setstate(oldur)
      end
   end
   
   state oldur begin
      when 2401.kill begin
         if pc.getqf("oldurdum") < 19 then
         pc.setqf("oldurdum", pc.getqf("oldurdum") + 1)
         else,f pc.getqf("oldurdum") == 19 then
         pc.setqf("oldurdum",20)
         setstate(oldurdum)
         end
      end
   end
  
   state oldurdum begin
      when letter begin
      send_letter("Görev tamam")
      end
      when button or info begin
      say("20 tane xxx öldürdün.")
      say("20000 no'lu npc ye geri dön.")
      end
      
      when 20000.chat"Görev tamam" with pc.getqf("oldurdum") >= 20 begin
      say("Harika görevi bitirmişsin.")
      say("Al bu da ödülün.")
      pc.give_item2("xxxx",1)
      clear_letter()
      setstate(complete)
      end
   end

   state complete begin
   end
end

Yukarıda gördüğünüz gibi şimdiye kadarki en uzun questimizi yazdık. 4 tane state kullandık. Basit bir canavar öldürme questi oldu. Stateleri bağlamak için setstate() komutunu kullandık. Bu komut bir önceki state içinde yadığınız her şeyi devredışı bırakır. Yani state start begin yazdınız içinde atıyorum bir npcyi konuşturdunuz ve ardına setstate() komutu kullanarak diğer bir state'e geçirdiniz. Artık O kişi az önce konuştuğu npcye tekrar tıkladığında aynı şeyleri görmeyecek. Yukarıda ne yaptık? İlk önce 20000 numaralı npc ile konuştuk. Bize görev verdi. Öldürdüğü mob sayısını qf komutuyla kayıt ettim. Her kestiği mob için bir ekleyecek şekilde. Dikkat edin pc.getqf("oldurdum") + 1 yaptım. Bu demek oluyor ki her öldürdüğü mobdan sonra bir önceki qf nin üzerine 1 ekleyip kaydedecek. Bu 19 a kadar böyle devam edecek. 19 olduktan sonra 20 yaptığında hemen diğer bir state'e geçmesi için setstate() kullandım ve oyuncunun ekranın solunda bir send_letter() komutu ile bir quest butonu çıkmasını sağladım. Ayrıca Bu quest butonuna tıkladığında da(when button or info begin) bilgi vermesini sağladım. Npc'ye gittiğinde ise Ödülünü verdim ve quest butonunu clear_letter() ile sildim. Sonra görev bug'a görmesin diye yeni bir state e geçirdim.(setstate(complete)) Bu state'te hiç bir şey yapmadan questi bitirdim. Artık tekrar görev gelmeyecek. Peki ben bu görevin sürekli baştan yapılmasını istiyorsam ne yaparım? En sondaki setstate(complete) yazdığım yeri setstate(start) olarak yazarım. İlk state tekrar çalışır.

Arkadaşlar state'ler mysql quest tablosuna kaydedilir. Siz quest tablosunu boşaltmadığınız sürece statelerde kayma olmaz başa sarmaz.

Şimdi ise state ile 2 quest arasında bağlantı kurmayı gösterelim. Bunu set_quest_state("questadı","stateadı") şeklinde yapıcaz. Biyolog görevlerini hatırlayın. Seviyeniz 40 ı geçse bile 30 görevini bitirmeden 40 görevine başlayamazsınız. Bunu nasıl yaparız? Örnek verelim. İlk önce 1. questimizi yazalım.
 

Kod:

quest ornek_quest begin
   state start begin
      when 2493.kill begin
         set_quest_state("ornek_quest2","run")
      end
   end
end

Bu quest ile 2. questimiz olan ornek_quest2'yi başlatıyoruz. Bir kere bir questin ilk state'i start ile başlamak zorunda. İyi de ben 2. questim için yapacaklarımı start içinde yazarsam bu kullandığım komut bir işe yaramayacak. Nasıl yapacağım? Şu şekilde;
 

Kod:

quet ornek_quest2 begin
   state start begin
   end
   state run begin
      when 20000.chat."Göreve başla." begin
      say("2493 mobunu öldürdüğüne göre artık bu görevi yapabilirsin.")
      end
   end
end

Ne yaptık? state start'a başlar başlamaz hemen end komutu ile sonlandırdık. Starttan sonra setstate(run) yazmadığım için 2. state çalışmayacaktır. Ama 1. questimizde set_quest_state("ornek_quest2","run") yazdığımız için 2493 mobunu her öldürdüğümüzde bu 2. questimiz çalışacaktır. 2. quest herhangi bir görev questi değil uzatmak istemedim örnek olsun diye hemen kısaca sonlandırdım. Onu uzatabilirsiniz. Şimdilik bu kadar.

 

WWW.XBİLGE.COM



Ücretsiz Hosting
Xbilgeye Destek Ol deneme