Quest Yazma Dersleri 2

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 38

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
İlk olarak adı üstünde quest yazdığımız için şu şekilde başlamamız gerekiyor.


Kod:
quest xxx begin

ardından

Kod:
state start begin

başlanır. Şimdi bu state çok güzel bir şey. quest içinde bu state i değiştirerek farklı şeyler yapabilirsiniz. Mesela bir görevi 2. aşamaya geçirebilirsiniz. Neyse onlar ilerki konular.

quest ve state başlangıcımızı yaptıktan sonra daha iç kısımlara giriyoruz. Bundan sonra when ve function komutu kullanabiliriz. Peki bu komutlar ne işe yarar?

when komutu adı üstünde yazdığınız questin ne zaman ya da ne yapıldığı zaman işleyeceğini söyler. Örnek vermek gerekirse;


Kod:
when 20000.use begin

20000 kodlu itemi kullandığınızda quest başlayacak demektir. when komutunun çeşitli şekillerde kullanımı var ona da değineceğim ileride.

function komutu ile kendi komutunuzu yapabilirsiniz. Bu biraz daha ileri seviyelerde. İşinizi çok kolaylaştırabilecek bir komut fakat bu olmadan da bir çok şey yapılabilir. O yüzden şimdilik atlıyorum.

Şimdi işin püf noktalarından birine geldik. Kullandığınız her quest, state, when ve if komutu için bir "end" kullanmanız gerekir. Kısaca bir örnek verecek olursak;

Kod:
quest ornek begin    state start begin       when 2000.use begin          say("ornek questtir.")       end    end end

Buradaki şekilde tuşunu kullanarak içeri doğru piramitler oluşturarak yazarsanız hangi komut için end koyduğunuzu bilirsiniz.

Burayı da anladıysak if komutuna geçiyoruz. if kelime anlamı ingilizcede çoğunuzun bildiği gibi "eğer" demektir. Yani anlayacağınız üzere queste herhangi bir şart ekleminizi sağlar ve yine her kullandığınız if komutunu da bir "end" ile sonlandırmak zorundasınız. Örnek verecek olursak şöyle olmassa olmazlarımızla başlıyoruz. Bizim muhteşem üçlümüz quest, state ve when.

Kod:
quest ornek_quest begin    state start begin       when login begin         if pc.level() == 86 then           pc.give_item2("12019",1)         end       end    end end

Gördüğünüz üzere if'ten sonra then kullandım. then'in anlamı Türkçe'de (tam karşılamasa da) o zamandır. Yani ben üstteki questte şunu yaptım: when login diyerek kişi oyuna girdiğinde questin çalışmasını sağladım.
if pc.level() == 86 then diyerek giren kişi eğer 86. seviyedeyse adama 12019 kodlu itemi ver demek istedim. Bu quest oyuncunun her oyuna girişinde ona 1 adet 12019 kodlu itemi vermenizi sağlar. Ve önemli nokta olarak 4 tane end komutu kullandım. quest, state, when ve if komutu için.

Şimdi diğer bir komut else.

else demek öyle değilse demektir. Yukarıda yazdığım son queste dikkat ederseniz sadece 86 level için 12019 kodlu itemi verdim. Peki diğerleri nolacak? Onlar içinde else komutunu kullanabilrim ve bu else komutu if e bağlı olarak kullanılır. if ile bi şart belirlersiniz ve bu şartın dışında kalanlar için de else komutunu kullanırsınız. else komutu end gerektirmez. if için koyduğunuz end kodu else için de geçerlidir. Örnek verecek olursak:

Kod:
quest ornek_quest begin    state start begin       when login begin         if pc.level() == 86 then           pc.give_item2("12019",1)         else           say("86. seviyede olmadığın için herhangi bir eşya kazanamadın.")         end       end    end end

Bu questle şunu yaptık: 86. seviyedeki oyuncular login olunca 12019 verdik. Diğerleri yani 86 level olmayan oyuncular login olduklarında ise onlaraın ekranında 86. seviye olmadıkları için bir eşya kazanamadıklarını söyleyen bir uyarı çıkmasını sağladık. Dikkat edin else'den sonra then kullanmıyoruz. Bu quest de gördüğünüz gibi oyuncu her oyuna giriş yaptığında çalışacaktır. Yani oyuncu her karakter attığında tekrar 12019 alacaktır. İlerde bunu engellemeyi de öğreticem.

Şimdi yine if e bağlı olarak kullanılan elseif komutuna geldik. elseif komutu if ile belirlediğiniz bir şartın dışındaki durumları sınıflandırmak için kullanılabilir. elseif için de ayrı bir end ile bitirmenize gerek yoktur. Örnekle daha güzel anlayacağınızı düşünüyorum.

Kod:
quest ornek_quest begin    state start begin       when login begin         if pc.level() == 86 then           pc.give_item2("12019",1)         elseif pc.level() == 85 then           say("Sen 85. seviyesin.")         elseif pc.level() == 81 then           say("Sen 81. seviyesin.")         end       end    end end

Yukarıdaki questte gördüğünüz üzere elseif den sonra da then kullanıyor. Anlamı şu oluyor: "eğer öyle değil de böyleyse o zaman şunu yap."

Ne yaptık peki? 86. seviye ile login olan kişiye item verdik. 85. ve 81. seviye ile login olan kişinin ise ekranında yazı çıkmasını sağladık. Umarım daha açıklayıcı olmuştur. Peki yukarıda son yazmış olduğum questi başka nasıl yazabilirdik? elseif kullanmadan da yazabilir miydik? Evet yazardık. Her şart için ayrı if kullanırdık.

Şu şekilde yapalım:


Kod:
quest ornek_quest begin    state start begin       when login begin         if pc.level() == 86 then           pc.give_item2("12019",1)         end         if pc.level() == 85 then           say("Sen 85. seviyesin.")         end         if pc.level() == 81 then           say("Sen 81. seviyesin.")         end       end    end end

Yukarıda gördüğünüz questte her şart için ayrı if kullandık ve her if sonucunda bir end kullandık. Gördüğünüz üzere bir if ile işimizi bitirdikten sonra hemen end komutunu yapıştırıyoruz. Aksi taktirde kafanız karışabilir.

Devam edelim. Şimdi when ile ne yapabiliriz ona bi bakalım. whenle kullanılabilecek komutların bazıları şunlardır: login, logout, levelup, use, click, chat, letter, button, info, enter, kill. Benim aklıma gelenler bunlar. Şimdi bunlarla neler yapabileceğimize bir bakalım.

login: Oyuna giriş demek. Karakter atma da olabilir.
logout: Oyundan çıkış demek. Mesela kuleden çıkmak için karakter attığınızda sizi dışarı atması için bu komut kullanılmıştır.
levelup: Oyuncu level aldığında questin çalışmasını sağlar.
use: Bir iteme sağ tıkladığınızda questin çalışmasını sağlar. Önemli bir nokta: Her item çalışmaz. Navicattan girip type 18 yapmanız gerekir ki item quest itemi olsun.
click: Bir npcye tıkladığınızda direk konuşmaya başlar. Şehir bekçisindeki ya da lonca demircilerindeki gibi.
chat: Bir npcye tıkladığınızda çeşitli seçeneklerle karşılaşırsınız. Mesela Demirciye tıkladığınızdaki gibi.
letter: Görev yazma da kullanılan bir komut. Ayrıntısına ileride giricem.
button: Görev butonu ile ilgili.(ekranın sol tarafında çıkan mektuplar)
info: "n" harfine bastığınızda karşınıza çıkan seçeneklerle ilgili.
enter: Bunu ben de tam bilmiyorum hiç kullanmadım. Yani gerek duymadım.
kill: Bir mobu öldürdüğünüzde questin çalışmasını sağlar.

Bu komutları mantık çerçevesinde beraber kullanabiliriz. Yani bunları or ve and ile birbirine bağlayabiliriz. Örnek verecek olursak.


Kod:
quest ornek_quest begin     state start begin        when login or logout begin           pc.remove_item("11111",5)        end     end end

Bu questte şunu yaptık: Oyuncu oyuna giriş yaptığı ya da oyundan çıktığı zaman envanterinden 11111 kodlu itemden 5 tane silinmesini sağladık. Tanıdık gelmesi için şunu örnek vereyim. Şeytan kulesinden çıktığınız zaman envanterinizde 7. kat haritalarının kalmadığını görürsünüz. Bu şekilde sağlanmıştır.

Diğer komutlarımıza örnek verecek olursak:


Kod:
quest ornek_quest begin     state start begin        when 40004.use begin          pc.warp(111100,2222200)        end      end end

İşte ışınlanma yüzüğünün mantığı. 40004 numaralı iteme sağ tıkladığınızda sizi yukarıdaki koordinatlara ışınlatan bir quest.


Kod:
quest ornek_quest begin     state start begin        when 20000.chat."Quest yazıyoruz." begin          say("Oyle mi? kolay gelsin o zaman.")        end      end end

Son questte ise 20000 kodlu npcye tıkladığımızda Quest yazıyoruz. diye bir seçenek çıkar. Tıkladığınızda ise Oyle mi? kolay gelsin o zaman. diyecektir.


Kod:
quest ornek_quest begin     state start begin        when 20000.click begin          say("Questte yazarmış bak bak bak.")        end      end end

Bu questte 20000 kodlu npcye tıkladığınızda direk konuşmaya başlayacaktır.


Kod:
quest ornek_quest begin     state start begin        when 1093.kill begin          notice_all("Adamın biri ne azraili öldürdü!")        end      end end
Yukarıdaki quest tanıdık geldi mi? Azraili öldürdüğünüzde duyuru geçmesini sağlayan questtir kendisi. Bu kadar basit yapılır işte. kill komutunun or lu kullanımına bakmak için biyolog görevi questlerini inceleyebilirsiniz.

Sonraki aşamaya geçelim. Şimdi de "local" komutunu inceleyelim. local'in kelime anlamı "yerel" demektir. Bu komut sizin herhangi bir kelimeye ya da sayıya bir anlam yüklemenizi sağlar. Örnekle açıklayacak olursak:

Kod:
quest ornek_quest begin    state start begin       when 40002.use begin          say("Nereye gidelim?")          local naber = select("1.köy","2. köy","vazgec")          if naber == 1 then          pc.warp(111222,4444333)          elseif naber == 2 then          pc.warp(36666,55555)          elseif naber == 3 then          return          end        end     end end

Şimdi yukarıdaki questte sadece local komutunu kullanmadım. Daha önce kullanmadığım bir kaç komut daha kullandım. select() komutu sizin karşınıza seçenekler çıkartır. Işınlanma yüzüğünü düşünün. Tıkladığınızda karşınıza çıkan seçenekler bu komut ile yapılmıştır. Tırnak içinde seçeneği yazarsınız sonra virgül koyup 2. seçeneği tırnak içinde yazarsınız. Yazdığınız sıraya göre if komutu ile bağlayıp ne yapacağını yazarsınız. Bu questle şunu yaptık:
"naber" kelimesini local olarak yani sadece bu quest için seçeneklere atadık. naber demek artık bu questte bizim için seçtiğimiz şey demek.
Yani if naber == 1 then diyerek select() komutu ile yazdığımız seçeneklerden 1. sini seçersek questin ne yapacağını belirledik.

return demek adı üstünde geri demek. Burada şu püf nokta var. Eğer ben bu questi sadece naber == 2 ye kadar yazarsam, 3. seçeneğe tıkladığımda hiç bişey olmayacaktır. Yani ben yukarıdaki questi şöyle yazsam:


Kod:
quest ornek_quest begin    state start begin       when 40002.use begin          say("Nereye gidelim?")          local naber = select("1.köy","2. köy","vazgec")          if naber == 1 then          pc.warp(111222,4444333)          elseif naber == 2 then          pc.warp(36666,55555)          end        end     end end

vazgec i seçtiğimde yine hiç bir şey yapmayacak. İşte bu return komutu bunu yapıyor. Yani hiç bişey yapmıyor. Kullanmasak da olur.
Quest Yazma Dersleri 2
Metin2 Lobby olarak, Metin2 sunucularında kullanılan quest sistematiği üzerine derinlemesine eğitim serimize devam ediyoruz. Bu yazıda Quest Yazma Dersleri 2 başlığıyla, daha önceki temel bilgilerin üzerine inşa ederek, Metin2 quest geliştirme konusunda ileri düzey teknikleri ele alacağız. Özellikle Metin2 quest Lua scriptleri üzerinde odaklanarak, gelişmiş.quest dosyalarının nasıl yazıldığını ve hataların nasıl düzeltilip optimize edileceğini anlatmaya çalışacağız.

Quest Dosyalarının Yapısı ve Organizasyonu
Her bir Metin2 quest dosyası, genellikle Lua dilinde yazılmıştır. Bir quest script dosyası, oyuncu etkileşimlerini, görev adımlarını, ödülleri ve tetikleyicileri tanımlar. Bu dosyalar genellikle 'quest_list' dosyasında tanımlanır ve Metin2 quest server tarafından yüklenir. Quest yazma sürecinde dikkat edilmesi gereken en önemli şeylerden biri, kodların okunabilirliği ve yapısal bütünlüktür. Quest edit yaparken, her fonksiyonun amacı net olmalı ve hata ayıklama (debug) işlemleri kolayca yapılabilir olmalıdır.

Quest Trigger Mekanizması
Bir Metin2 quest başlatıldığında, genellikle bir trigger yani tetikleyici mekanizma devreye girer. Bu trigger, oyuncunun bir NPC'ye konuşması, belirli bir eşyayı alması ya da belirli bir bölgeye girmesi gibi olaylar olabilir. Quest trigger sistematiği, görevin başlatılması veya tamamlanması için çok önemlidir. Örneğin, bir daily quest (günlük görev) sisteminde, her gün saat gece yarısında sıfırlanacak bir sayaç (timer) tanımlanabilir. Bu sayaç, oyuncunun görevi tekrar alabilmesi için kritik rol oynar.

Quest State ve Flag Kullanımı
Quest state, görevin hangi aşamada olduğunu gösterir. Her Metin2 quest’te, görevin başlangıcı (begin), ortası (örneğin item toplama) ve sonu (end) gibi farklı durumlar vardır. Bu durumlar, state komutları ile yönetilir. Aynı zamanda, flag adı verilen bayraklarla, oyuncunun bazı özelliklerini ya da görev geçmişini takip edebilirsiniz. Örneğin, bir oyuncunun bir görevi daha önce tamamladığını veya bir NPC ile etkileşime girip girmediğini quest flag ile kontrol edebilirsiniz.

Hata Ayıklama ve Debug Teknikleri
Metin2 quest geliştirme sürecinde, kodlarda hatalar oluşabilir. Hatalar genellikle syntax (sözdizimi), mantık hatası ya da veri eksikliğinden kaynaklanabilir. Quest debug işlemleri için, log dosyalarını incelemek ve test sunucusunda denemeler yapmak çok önemlidir. Ayrıca, Metin2dev gibi platformlardan yardım alabilir ya da Martysama quest örneklerini inceleyerek faydalı bilgiler edinebilirsiniz.

Gelişmiş Quest Örnekleri
Gelişmiş Metin2 quest örneklerinde, quest chain yani görev zincirleri sıkça kullanılır. Örneğin, bir görev tamamlandığında bir sonraki görev otomatik olarak açılır. Bu süreçte Mob öldürme, NPC ile konuşma, item toplama gibi işlemler sırayla yapılır. Her görevde farklı ödüller (reward) tanımlanabilir. Bu ödüller, gold, exp, özel itemler veya yetenek puanları olabilir.

Özel ve Custom Quest Geliştirme
Sunucuya özel custom quest geliştirmek isteyen geliştiriciler, mevcut sistemleri genişleterek daha yaratıcı görevler tasarlayabilirler. Metin2 özel quest sistemleri, oyuncuların oyun deneyimini zenginleştiren en önemli unsurlardan biridir. Oyuncular için eğlenceli ve tekrar edilebilir görevler oluşturmak, sunucu sadakatini artırır.

Dilerseniz, Metin2 Lobby'de yer alan diğer quest makalelerine göz atarak bilgilerinizi pekiştirebilirsiniz.


Quest Writing Lessons 2
At Metin2 Lobby, we continue our in-depth tutorial series on the quest system used in Metin2 servers. In this article, under the title Quest Writing Lessons 2, we will build upon previously covered basic knowledge and explore advanced techniques for developing Metin2 quests. Focusing especially on Metin2 quest Lua scripts, we'll explain how advanced .quest files are written and how errors can be fixed and optimized.

Structure and Organization of Quest Files
Each Metin2 quest file is generally written in Lua language. A quest script file defines player interactions, quest steps, rewards, and triggers. These files are typically defined in the 'quest_list' file and loaded by the Metin2 quest server. One of the most important aspects during quest writing is the readability and structural integrity of the code. When editing quests (quest edit), every function should have a clear purpose, and debugging operations (debug) must be easy to perform.

Quest Trigger Mechanism
When a Metin2 quest starts, a trigger mechanism usually activates. This trigger could be talking to an NPC, obtaining a specific item, or entering a certain area. The quest trigger system is critical for starting or completing a quest. For example, in a daily quest system, a timer that resets every midnight can be defined so players can retake the quest daily.

Usage of Quest State and Flag
Quest state indicates which stage the quest is currently in. In every Metin2 quest, there are different states such as the beginning (begin), middle (e.g., collecting items), and end (end). These states are managed with state commands. Additionally, flags allow you to track certain player properties or quest history. For instance, you can check whether a player has completed a quest before or interacted with an NPC using a quest flag.

Debugging and Debug Techniques
During the Metin2 quest development process, errors may occur. These errors often stem from syntax issues, logical errors, or missing data. To debug quests (quest debug), examining log files and testing on a test server is crucial. You can also seek help from platforms like Metin2dev or examine examples such as Martysama quests to gain useful insights.

Advanced Quest Examples
In advanced Metin2 quests, quest chains are frequently used. For example, upon completing one quest, the next quest automatically opens. During this process, actions like killing mobs, speaking to NPCs, or collecting items are performed sequentially. Different rewards (rewards) can be defined for each quest, including gold, experience, special items, or skill points.

Developing Special and Custom Quests
Developers who wish to create server-specific custom quests can expand existing systems to design more creative quests. Metin2 special quests are among the most important elements that enhance the player experience. Creating fun and repeatable quests for players increases server loyalty.

You can visit other quest articles available at Metin2 Lobby to reinforce your knowledge.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt