İlk olarak adı üstünde quest yazdığımız için şu şekilde başlamamız gerekiyor.
ardından
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;
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;
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.
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:
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.
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:
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.
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:
İşte ışınlanma yüzüğünün mantığı. 40004 numaralı iteme sağ tıkladığınızda sizi yukarıdaki koordinatlara ışınlatan bir quest.
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.
Bu questte 20000 kodlu npcye tıkladığınızda direk konuşmaya başlayacaktır.
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:
Ş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:
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 - Metin2Lobby
Metin2 oyununda quest sistematiği, sunucuların oynanış deneyimini zenginleştirmek için oldukça kritik bir rol üstlenmektedir. Bu yazı dizisinin ikinci bölümünde, quest yazımında ileri düzey tekniklerden bahsedecek ve özellikle lua tabanlı scriptleme süreçlerinde dikkat edilmesi gereken detaylara değineceğiz. Metin2 sunucularında custom quest geliştirmek isteyen geliştiriciler için bu rehber, quest yapısının temelinden ileri seviye sistemlere kadar geniş bir yelpazeyi kapsayacaktır.
Quest Sistemine Giriş
Metin2 oyununda quest sistemleri, oyuncuların belirli görevleri tamamlayarak ödüller kazandığı dinamik yapılar olarak tanımlanabilir. Quest yapısı, Lua programlama dili kullanılarak geliştirilir ve Metin2 sunucusu üzerinde etkinleştirilir. Quest dosyaları genellikle .quest uzantılıdır ve sunucu tarafında özel event'lerin tetiklenmesini sağlar. Quest sistemi, trigger, state, flag, timer gibi bileşenler üzerinden çalışır. Bu yapılar, quest akışını kontrol etmede büyük rol oynar.
Quest Script Yapısı
Metin2 için quest yazarken, Lua dilinin syntax'ına uygun kodlama yapılmalıdır. Bir quest dosyası genellikle şu yapıya sahiptir:
quest ad_quest begin
state start begin
when login or enter begin
say('Hoşgeldin!')
end
end
end
Yukarıdaki örnek, oyuncu girdiğinde ekrana bir mesaj bastıran basit bir quest yapısıdır. Burada when ifadesi, belirli bir olayı dinlemeye alır. State ise quest durumunu yönetir. Flag kullanarak quest ilerlemesini takip edebilir, timer ile zamanlanmış görevler oluşturabilirsiniz.
Quest Reward ve Item Yönetimi
Quest tamamlandığında oyuncuya verilecek ödüller (reward) oldukça önemlidir. Ödül olarak item, gold veya EXP verilebilir. Örnek bir ödül verme işlemi şu şekildedir:
pc.give_item(70001, 1) -- 70001 item ID, 1 adet
pc.cha_guild_money(10000) -- 10000 gold
pc.exp(50000) -- 50000 exp
Item ID’leri sunucuya özel olabilir, dolayısıyla quest geliştirirken item_proto.db dosyasındaki ID’leri kontrol etmeniz gerekir. Mob ve NPC ile entegre çalışan quest’lerde, mob öldürme veya NPC ile konuşma gibi eylemler trigger olarak tanımlanabilir.
Quest Hataları ve Debugging
Quest geliştirirken karşılaşılan yaygın sorunlardan birisi hatalı syntax kullanımıdır. Quest’lerde debug yapmak için say(), notice(), chat() gibi fonksiyonlar kullanılabilir. Bu sayede quest akışı sırasında nerede hata oluştuğu izlenebilir. Ayrıca server_info.txt dosyası üzerinden log kayıtlarına da erişim sağlanabilir.
Daily Quest ve Chain Quest Sistemleri
Daily quest, oyuncuların her gün tekrar eden görevleri tamamlamasını sağlar. Bu sistemlerde timer kullanımı kritik rol oynar. Chain quest ise birbirine bağlı görevlerin sırayla tamamlanmasını gerektirir. Bu tür quest’lerde state geçişleri dikkatlice planlanmalıdır.
Martysama ve Metin2Dev gibi topluluklar, quest geliştiriciler için örnek scriptler ve yardımcı araçlar sunmaktadır. Bu kaynaklar sayesinde hem yeni başlayanlar hem de ileri düzey kullanıcılar için faydalı bilgiler edinilebilir.
Sonuç
Metin2 için quest yazımı, hem teknik hem de yaratıcı yönüyle oyun deneyimini zenginleştiren bir süreçtir. Lua dili bilgisi, doğru flag ve state yönetimi ile birlikte, güçlü ve kullanıcı dostu quest sistemleri geliştirilebilir. Metin2Lobby olarak, quest geliştirme konusunda daha fazla rehber ve script paylaşımına devam edeceğiz.
Quest Writing Lessons 2 - Metin2Lobby
Metin2 game's quest system plays a crucial role in enriching the gameplay experience on servers. In this second part of our tutorial series, we will discuss advanced techniques in quest writing and especially focus on details that must be considered during Lua-based scripting processes. For developers aiming to create custom quests on Metin2 servers, this guide will cover a wide range from basic quest structure to advanced systems.
Introduction to Quest System
In Metin2, quest systems are dynamic structures where players complete specific tasks to earn rewards. The quest structure is developed using Lua programming language and activated on the Metin2 server. Quest files typically have a .quest extension and trigger special events on the server side. The quest system operates through components like trigger, state, flag, and timer, which play a major role in controlling the flow of the quest.
Quest Script Structure
When writing quests for Metin2, you must adhere to Lua syntax rules. A typical quest file has the following structure:
quest ad_quest begin
state start begin
when login or enter begin
say('Welcome!')
end
end
end
The above example demonstrates a simple quest structure that prints a message when the player logs in. Here, the when statement listens for specific events. The state manages the quest status. You can track quest progress with flags and create timed missions using timers.
Quest Reward and Item Management
Rewards (reward) given to players upon completing a quest are very important. Rewards can include items, gold, or EXP. An example of awarding a reward is as follows:
pc.give_item(70001, 1) -- 70001 item ID, 1 piece
pc.cha_guild_money(10000) -- 10000 gold
pc.exp(50000) -- 50000 exp
Item IDs may be specific to the server, so you should check the item_proto.db file while developing your quest. In quests integrated with mobs and NPCs, actions such as killing a mob or talking to an NPC can be defined as triggers.
Quest Errors and Debugging
One common issue encountered when developing quests is incorrect syntax usage. To debug quests, functions like say(), notice(), and chat() can be used. This way, you can trace where errors occur during the quest flow. Additionally, log records can also be accessed via the server_info.txt file.
Daily Quest and Chain Quest Systems
Daily quests allow players to complete repeatable missions each day. In these systems, timer usage is critical. Chain quests require quests to be completed in sequence. In such quests, state transitions must be planned carefully.
Communities like Martysama and Metin2Dev offer example scripts and tools for quest developers. These resources provide useful information for both beginners and advanced users.
Conclusion
Writing quests for Metin2 is a process that enriches the gaming experience both technically and creatively. With knowledge of Lua, proper flag and state management, strong and user-friendly quest systems can be created. As Metin2Lobby, we will continue to share more guides and scripts related to quest development.
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
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 - Metin2Lobby
Metin2 oyununda quest sistematiği, sunucuların oynanış deneyimini zenginleştirmek için oldukça kritik bir rol üstlenmektedir. Bu yazı dizisinin ikinci bölümünde, quest yazımında ileri düzey tekniklerden bahsedecek ve özellikle lua tabanlı scriptleme süreçlerinde dikkat edilmesi gereken detaylara değineceğiz. Metin2 sunucularında custom quest geliştirmek isteyen geliştiriciler için bu rehber, quest yapısının temelinden ileri seviye sistemlere kadar geniş bir yelpazeyi kapsayacaktır.
Quest Sistemine Giriş
Metin2 oyununda quest sistemleri, oyuncuların belirli görevleri tamamlayarak ödüller kazandığı dinamik yapılar olarak tanımlanabilir. Quest yapısı, Lua programlama dili kullanılarak geliştirilir ve Metin2 sunucusu üzerinde etkinleştirilir. Quest dosyaları genellikle .quest uzantılıdır ve sunucu tarafında özel event'lerin tetiklenmesini sağlar. Quest sistemi, trigger, state, flag, timer gibi bileşenler üzerinden çalışır. Bu yapılar, quest akışını kontrol etmede büyük rol oynar.
Quest Script Yapısı
Metin2 için quest yazarken, Lua dilinin syntax'ına uygun kodlama yapılmalıdır. Bir quest dosyası genellikle şu yapıya sahiptir:
quest ad_quest begin
state start begin
when login or enter begin
say('Hoşgeldin!')
end
end
end
Yukarıdaki örnek, oyuncu girdiğinde ekrana bir mesaj bastıran basit bir quest yapısıdır. Burada when ifadesi, belirli bir olayı dinlemeye alır. State ise quest durumunu yönetir. Flag kullanarak quest ilerlemesini takip edebilir, timer ile zamanlanmış görevler oluşturabilirsiniz.
Quest Reward ve Item Yönetimi
Quest tamamlandığında oyuncuya verilecek ödüller (reward) oldukça önemlidir. Ödül olarak item, gold veya EXP verilebilir. Örnek bir ödül verme işlemi şu şekildedir:
pc.give_item(70001, 1) -- 70001 item ID, 1 adet
pc.cha_guild_money(10000) -- 10000 gold
pc.exp(50000) -- 50000 exp
Item ID’leri sunucuya özel olabilir, dolayısıyla quest geliştirirken item_proto.db dosyasındaki ID’leri kontrol etmeniz gerekir. Mob ve NPC ile entegre çalışan quest’lerde, mob öldürme veya NPC ile konuşma gibi eylemler trigger olarak tanımlanabilir.
Quest Hataları ve Debugging
Quest geliştirirken karşılaşılan yaygın sorunlardan birisi hatalı syntax kullanımıdır. Quest’lerde debug yapmak için say(), notice(), chat() gibi fonksiyonlar kullanılabilir. Bu sayede quest akışı sırasında nerede hata oluştuğu izlenebilir. Ayrıca server_info.txt dosyası üzerinden log kayıtlarına da erişim sağlanabilir.
Daily Quest ve Chain Quest Sistemleri
Daily quest, oyuncuların her gün tekrar eden görevleri tamamlamasını sağlar. Bu sistemlerde timer kullanımı kritik rol oynar. Chain quest ise birbirine bağlı görevlerin sırayla tamamlanmasını gerektirir. Bu tür quest’lerde state geçişleri dikkatlice planlanmalıdır.
Martysama ve Metin2Dev gibi topluluklar, quest geliştiriciler için örnek scriptler ve yardımcı araçlar sunmaktadır. Bu kaynaklar sayesinde hem yeni başlayanlar hem de ileri düzey kullanıcılar için faydalı bilgiler edinilebilir.
Sonuç
Metin2 için quest yazımı, hem teknik hem de yaratıcı yönüyle oyun deneyimini zenginleştiren bir süreçtir. Lua dili bilgisi, doğru flag ve state yönetimi ile birlikte, güçlü ve kullanıcı dostu quest sistemleri geliştirilebilir. Metin2Lobby olarak, quest geliştirme konusunda daha fazla rehber ve script paylaşımına devam edeceğiz.
Quest Writing Lessons 2 - Metin2Lobby
Metin2 game's quest system plays a crucial role in enriching the gameplay experience on servers. In this second part of our tutorial series, we will discuss advanced techniques in quest writing and especially focus on details that must be considered during Lua-based scripting processes. For developers aiming to create custom quests on Metin2 servers, this guide will cover a wide range from basic quest structure to advanced systems.
Introduction to Quest System
In Metin2, quest systems are dynamic structures where players complete specific tasks to earn rewards. The quest structure is developed using Lua programming language and activated on the Metin2 server. Quest files typically have a .quest extension and trigger special events on the server side. The quest system operates through components like trigger, state, flag, and timer, which play a major role in controlling the flow of the quest.
Quest Script Structure
When writing quests for Metin2, you must adhere to Lua syntax rules. A typical quest file has the following structure:
quest ad_quest begin
state start begin
when login or enter begin
say('Welcome!')
end
end
end
The above example demonstrates a simple quest structure that prints a message when the player logs in. Here, the when statement listens for specific events. The state manages the quest status. You can track quest progress with flags and create timed missions using timers.
Quest Reward and Item Management
Rewards (reward) given to players upon completing a quest are very important. Rewards can include items, gold, or EXP. An example of awarding a reward is as follows:
pc.give_item(70001, 1) -- 70001 item ID, 1 piece
pc.cha_guild_money(10000) -- 10000 gold
pc.exp(50000) -- 50000 exp
Item IDs may be specific to the server, so you should check the item_proto.db file while developing your quest. In quests integrated with mobs and NPCs, actions such as killing a mob or talking to an NPC can be defined as triggers.
Quest Errors and Debugging
One common issue encountered when developing quests is incorrect syntax usage. To debug quests, functions like say(), notice(), and chat() can be used. This way, you can trace where errors occur during the quest flow. Additionally, log records can also be accessed via the server_info.txt file.
Daily Quest and Chain Quest Systems
Daily quests allow players to complete repeatable missions each day. In these systems, timer usage is critical. Chain quests require quests to be completed in sequence. In such quests, state transitions must be planned carefully.
Communities like Martysama and Metin2Dev offer example scripts and tools for quest developers. These resources provide useful information for both beginners and advanced users.
Conclusion
Writing quests for Metin2 is a process that enriches the gaming experience both technically and creatively. With knowledge of Lua, proper flag and state management, strong and user-friendly quest systems can be created. As Metin2Lobby, we will continue to share more guides and scripts related to quest development.
