Quest Yazma Dersleri 4

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
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.
Quest Yazma Dersleri 4
Metin2 Lobby olarak, Metin2 sunucularında görev (quest) sistemlerini en iyi şekilde öğrenmek isteyen geliştiricilere özel hazırladığımız 'Quest Yazma Dersleri' serisinin dördüncü bölümünde,.quest sisteminin daha ileri düzey yönlerine odaklanıyoruz. Bu dersimizde özellikle Metin2 quest chain yapıları, quest timer kullanımı, flag yönetimi ve quest state sistemleri üzerinde duracağız. Quest yazımı yaparken Lua dili temel alınmaktadır ve bu nedenle Metin2 quest lua bilgisi çok önemlidir.
Quest chain yapıları, oyuncuların bir görevden diğerine akışla geçmesini sağlayan sistemlerdir. Örneğin, bir NPC'den alınan ilk görev tamamlandıktan sonra ikinci bir görevin otomatik olarak başlaması gibi. Bu yapılar Metin2 quest chain mantığıyla çalışır ve doğru kullanıldığında oyuncu deneyimini ciddi anlamda artırabilir. Bunun için quest dosyası içinde doğru state geçişlerinin yapılması gerekir. State kavramı, quest'in hangi aşamada olduğunu belirtir ve genellikle 'begin', 'progress', 'end' gibi anahtar kelimelerle tanımlanır.
Metin2 quest timer kullanımı ise zaman tabanlı görevler için kritiktir. Örneğin, oyuncudan belirli bir süre içinde bir görevi tamamlaması istenebilir. Timer, Lua script üzerinden başlatılır ve belirlenen süre sonunda tetiklenir. Timer sistemi kullanırken dikkat edilmesi gereken bazı hata durumları vardır. Örneğin, timer başlatıldıktan sonra quest durumu değişirse timer devam edebilir veya hata verebilir. Bu sebeple Metin2 quest debug işlemleri sırasında timer yönetimi çok önemlidir.
Flag sistemi, quest yazarken oyuncuya özel bilgi saklama imkanı sunar. Her oyuncunun quest ilerlemesi farklı olabileceği için flag kullanmak oldukça yaygındır. Flag'ler, oyuncunun quest durumunu, tamamladığı görev sayısını, özel item alıp almadığını gibi verileri tutmak için kullanılır. Bu veriler, Metin2 quest sistemine özel olarak saklanır ve quest script'leri tarafından okunabilir. Flag kullanımı esnek olduğu kadar, yanlış yönetildiğinde hatalara da yol açabilir. Bu yüzden Metin2 quest hata ayıklama işlemleri sırasında flag verileri kontrol edilmelidir.
Quest reward sistemleri, oyuncuların görevleri tamamladığında alacakları ödüllerdir. Metin2 quest reward örnekleri arasında item, para, 경험 (experience) veya özel yetenek puanları yer alabilir. Reward sistemleri doğru tanımlanmazsa, oyuncular ödüllerini alamayabilir veya sistem hata verebilir. Reward kısmında Metin2 quest item ID'leri doğrulanmalıdır. Yanlış item ID'si girildiğinde, oyuncuya item verilmez veya sistem çökebilir. Bu tür hatalar Metin2 quest debug süreçlerinde sıkça karşılaşılan sorunlardır.
NPC ve mob entegrasyonları da quest yazımında önemli bir rol oynar. Metin2 quest npc tanımı doğru yapılmalı ve npc'nin doğru şekilde tetiklenmesi sağlanmalıdır. Aynı zamanda, görevlerde kullanılacak Metin2 quest mob tanımları da doğru yapılmalıdır._npc_trigger_ fonksiyonları, npc ile oyuncu etkileşimini sağlar. Quest trigger sistemleri, oyuncunun npc ile konuşması, bir item kullanması ya da bir mob öldürmesi gibi eylemleri tetikler. Trigger mekanizması doğru kurulmadığında, görev ilerlemeyebilir.
Daily quest sistemleri, oyuncuların her gün tekrar eden görevleri yapmasını sağlar. Metin2 daily quest yapıları, quest timer ve flag sistemleriyle birlikte tasarlanmalıdır. Günlük görevlerin her gün sıfırlanması için sistemde zamanlayıcılar ve kontrol mekanizmaları aktif olmalıdır. Daily quest yapıları, oyuncu sadakati için çok etkilidir. Ancak, daily quest sisteminin hatalı olması sunucuda büyük problemlere yol açabilir. Bu nedenle Metin2 quest geliştirme süreçlerinde daily sistemler detaylı test edilmelidir.
Metin2 quest edit işlemleri sırasında, script dosyalarında yapılan küçük hatalar büyük problemlere neden olabilir. Özellikle Lua dilindeki syntax hataları, quest'in çalışmamasına yol açabilir. Metin2dev quest standartlarına uygun kodlama yapmak, hata oranını düşürür. Martysama quest gibi popüler sistemler de incelenmeli ve örneklerden faydalanılmalıdır. Quest yazımı sırasında debug komutları kullanarak sistem test edilmeli, her adım kontrol edilmelidir. Metin2 quest server sistemlerinde test süreci çok önemlidir.
Sonuç olarak, Metin2 quest yazma işlemi hem teknik bilgi hem de dikkat isteyen bir sistemdir. Lua bilgisi, quest chain yapısı, timer yönetimi, flag sistemi, reward mekanizması gibi birçok bileşen doğru şekilde bir araya getirilmelidir. Bu dersle birlikte quest yazımında daha ileri seviyeye geçebilirsiniz. Daha fazla örnek ve destek için Metin2 Lobby forumuna göz atabilirsiniz.


Quest Writing Lessons 4
At Metin2 Lobby, in our fourth part of 'Quest Writing Lessons' series, we focus on more advanced aspects of the quest system for developers who want to learn the best practices in Metin2 servers. In this lesson, we will particularly examine Metin2 quest chain structures, quest timer usage, flag management, and quest state systems. Lua language is used as the base for quest writing, making knowledge of Metin2 quest lua very important.
Quest chain structures allow players to flow from one quest to another. For instance, after completing a first quest received from an NPC, a second quest may automatically start. These structures work with Metin2 quest chain logic and can significantly enhance player experience when used correctly. For this, correct state transitions must be made within the quest file. The state concept indicates which stage the quest is in and is usually defined with keywords like 'begin', 'progress', 'end'.
Using Metin2 quest timers is critical for timed quests. For example, a player might be required to complete a task within a specific time. The timer is initiated via a Lua script and triggers at the end of the specified duration. There are some error conditions to consider when using timers. For instance, if the quest status changes after a timer starts, the timer may continue running or cause errors. Therefore, during Metin2 quest debug processes, timer management is very important.
The flag system allows storing player-specific information during quest writing. Since each player’s quest progress may differ, using flags is quite common. Flags store data such as a player's quest status, number of completed quests, or whether they have received special items. These data are stored specifically within the Metin2 quest system and readable by quest scripts. Although flag usage is flexible, incorrect management can lead to errors. Therefore, flag data should be checked during Metin2 quest debugging processes.
Quest reward systems refer to rewards players receive upon completing quests. Examples of Metin2 quest rewards include items, gold, experience points, or special skill points. If reward systems are not properly defined, players may not receive their rewards or the system could crash. In the reward section, Metin2 quest item IDs must be validated. If an incorrect item ID is entered, the item may not be given to the player or the system may crash. Such errors are frequently encountered during Metin2 quest debug processes.
NPC and mob integrations also play a significant role in quest writing. The definition of Metin2 quest NPCs must be done correctly, ensuring that NPCs are triggered properly. Similarly, definitions of Metin2 quest mobs used in quests must also be accurate. _npc_trigger_ functions facilitate interaction between NPCs and players. Quest trigger systems activate events such as talking to an NPC, using an item, or killing a mob. If the trigger mechanism is not set up correctly, the quest may not progress.
Daily quest systems allow players to perform repeatable tasks each day. Metin2 daily quest structures should be designed together with quest timers and flag systems. Timers and control mechanisms must be active to reset daily quests every day. Daily quest structures are highly effective in increasing player retention. However, faulty daily quest systems can cause major issues on the server. Therefore, daily systems must be thoroughly tested during Metin2 quest development processes.
During Metin2 quest editing, minor errors in script files can lead to major problems. Syntax errors in Lua can prevent quests from running altogether. Coding according to Metin2dev quest standards reduces error rates. Popular systems like Martysama quests should also be examined and examples used. Debug commands should be used during quest writing to test the system, and each step should be carefully reviewed. The testing phase in Metin2 quest server systems is very important.
In conclusion, writing Metin2 quests is a process requiring both technical knowledge and attention. Many components such as Lua knowledge, quest chain structure, timer management, flag systems, and reward mechanisms must be correctly combined. With this lesson, you can advance to higher levels in quest writing. For more examples and support, visit the Metin2 Lobby forum.
 

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

Benzer konular

Geri
Üst Alt