Etkinlik Questi Yazma En Baştan - En Sona Doğru

achird

Üye
Editör
Üye
Mesaj
20
Çözümler
1
Beğeni
35
Puan
673
Merhabalar,
Konu girişlerinde pek başarılı olduğum söylenemez fakat konuya başlamadan önce kısa bir şekilde şunları belirtmek istiyorum:

Yakın bir zaman önce bir PvP server açmıştım. Ancak hiç bir bilgim yoktu. NPC içeriği bile düzetlemiyordum siz düşünün. Çok araştırdım, ettim derken bu Quest mevzularına kadar girdim. Bu olaya girişte şu şekilde oldu. Server'a otomatik olarak yüklenmiş biri "Otomatik Etkinlik" Questi vardı. Kafasına göre etkinlik başlatır, başlattığı etkinliği kapatmadan giderdi. Çok kişiye para teklif ettim bunu nasıl düzeltebiliriz, bizim istediğimiz gibi yazar mısınız diye. Para kaptırdığım bile oldu. Derken elim, kolum var ben neden yapamayayım gibi bir düşünceye girdim. -İyi ki de girmişim, diyorum. Çünkü yapılmayacak bir iş değilmiş. Forumlarda geziyorum, Server'im da ki mevcut Questleri inceliyorum fakat bir şey anlamıyordum. :( İnternette dolaşan bilgilerin çoğu da kopyala-yapıştır formatında kaynağı olmayan bilgilerdi. Bundan sonrasını kısa geziyorum bu foruma girip sayın @Whistle 'nin konularını okuya okuya bir şeyleri anladım. Bazı şeyleri kendiniz yapmanız konusunda size de destek vermek amacı ile bu konuyu açıyorum.

Şimdi kendi olayımıza gelelim:

Öncelikle bu konu temelden başlamayacak çünkü forumda bu tip konular detaylı bir şekilde mevcut durumda. Yine de bazı hatırlatmaları yapacağım.
Quest Yazma Dersleri: Tıklayınız.
Quest Fonksiyonları ve Açıklamaları: Tıklayınız.
Quest Eklemek ve Kaldırmak: Tıklayınız.

Konu Başlık Sıralaması
1. Manuel Olarak Başlatılacak Etkinliklere Ait Quest
1.1. Basit Etkinlik Türleri (Örn: Ayışığı Define Sandığı Etkinliği)
1.2. Basit - Etkileşimli Etkinlik Türleri (Örn: Futbol Topu'nun Altın Futbol Topu ile İlişkili Etkinliği)​

(Konu başlıkları eklendikçe güncellenecektir.)

Konu 1: Etkinlikleri Manuel Olarak Başlatacak Ana Quest'in Yazılımı
Bu Quest'i çeşitli şekillerde tetikleyebilirsiniz, benim tercih ettiğim ve bana göre en kullanışlı olan yolu "letter" mantığı. Yani ekranınız sol tarafına gelen görevleri açtığınız bildiriler.

İlk olarak Notepad ++ ı açıyoruz.
Kodlama: ANSI
Dil: LuA olacak şekilde ayarlayıp giriş kodumuzu yazıyoruz.

Lua (Quest):
quest etkinlik begin
    state start begin
        when letter with pc.is_gm() begin
            send_letter("Etkinlik Yönetimi")
            end
        when info or button with pc.is_gm() begin

Bunu bu şekilde kenara bırakıp yeni bir sayfa açıp hemen içini dolduracağımız etkinliklerin Quest'lerini oluşturmaya başlıyoruz:

Konu 1.1: Basit Etkinlik Türlerinin Yazılımı
Konu sıralamasında örnek verdiğim "Ayışığı Define Sandığı" nın etkliniği ile başlayalım. (Kodlama ve dili aynı şekilde ayarlamayı unutmayınız.)

Lua (Quest):
quest ayisigi begin
    state start begin
        when kill with game.get_event_flag("ayisigi") == 1 and not npc.is_pc() begin
        local s = number(1, 150)
            if 3 == s then
            game.drop_item_with_ownership("50011",1)
            end
        end
    end
end

Ayışığı Define Sandığı Etkinliği'mizin Quest'ini yazdık, şimdi daha iyi anlamanız açısından biraz detayına inelim:
Lua (Quest):
when kill with game.get_event_flag("ayisigi") == 1 and not npc.is_pc() begin

Burada demek istediğimiz olay şudur (tam karşılığı olarak çeviremesemde):
"Ayışığı Define Sandığı Etkinliği aktif iken slotlardan elde edilir ve NPC'de bulunmaz."

Lua (Quest):
local s = number(1, 150)
    if 3 == s then
    game.drop_item_with_ownership("50011",1)

Peki burada ne anlatmak istedik:
"local" komutunu seçeneklerimizi belirlemek üzere açtık ve seçeneklerimizi 1'den 150'ye kadar numaralandırdık.
"if 3 == s then" ile de; "Eğer 1'den 150'ye kadar olan numaralandırmalardan, 3 rakamını denk getirebilirsek/doğru bulabilirsek "50011" kodlu eşyayı yani Ayışığı Define Sandığının düşmesini istedik.

Yani düşme sıklığını değiştirmek istiyorsanız: (1, 150) olan kısmın aralığını değiştirebilirsiniz. Örneğin daha fazla düşsün derseniz (1,100); daha az düşsün derseniz (1,200) yapabilirsiniz. Tamamen size bağlı.
Yine etkinliğin Ayışığı Define Sandığı değil de başka bir eşyanın düşmesini istiyorsanız. "50011" kodlu eşyayı değiştirebilirsiniz.

Bu konu anlaşıldıysa Ayışığı Define Sandığı Etkinlik Quest'imizi ana Quest'imize yerleştirmeye geldi.

Lua (Quest):
quest etkinlik begin
    state start begin
        when letter with pc.is_gm() begin
            send_letter("Etkinlik Yönetimi")
            end
        when info or button with pc.is_gm() begin
            local menu = select("Ayışığı Define Sandığı ")
            if menu == 1 then
                local ay = select("Başlat","Bitir","Vazgeç ")
                if ay == 1 then
                game.set.event_flag("ayisigi",1)
                elseif ay == 2 then
                game.set.event_flag("ayisigi",0)
                elseif ay == 3 then
                return
                end
            end
        end
    end
end

** İlk önce dikkat etmeniz gereken nokta kelime Türkçe karakter ile başlıyor/bitiyor ise tırnaktan önce/sonra birer boşluk bırakınız.

Sonra "menu" adında bir seçim ismi oluşturulmuş "Ayışığı Define Sandığı" adlı butonu ekledik. Butona tıkladığımızda "ay" adında bir seçim başlığı oluşturulmuş "Başlat", "Bitir" ve "Vazgeç" butonlarını ekledik.
Bir diğer önemli nokta ise game.set.event_flag("ayisigi",1) ya da 0 kısmında ki "ayisigi" kısmı önce ki etkinlik Quest'imizde ki ile aynı olmak zorundadır. Yoksa boşa tetikler ve eşya düşmez.

Konu 1.2: Basit-Etkileşimli Etkinlik Türlerinin Yazılımı
TR'de ki "Futbol Ateşi" etkinliğini hatırlıyor musunuz? Evet onun PVP sürümünü de şimdi biz yazalım. PVP sürümü diyorum ki çünkü TR'de 1 gün beklemeniz gerekiyordu. Biz süreyi komple kaldıralım.

İlk olarak Futbol Topu'nun düşmesini sağlayacak olan Quest'imizi yazalım. Yine Ayışığı Define Sandığı ile aynı mantıkta olacak.

Lua (Quest):
quest futbol begin
    state start begin
        when kill with game.get_event_flag("futbol") == 1 and not npc.is_pc() begin
        local s = number(1, 150)
            if 3 == s then
            game.drop_item_with_ownership("50096",1)
            end
        end
    end
end

Şimdi bu Questi "Altın Futbol Topu"na nasıl bağlayacağız. Hatırlasanız eğer, bu sistem NPC Yu-Hwan ile aktif oluyordu. Bizde aynı şekilde NPC Yu-Hwan'a bağlayalım.

Yeni bir dosya oluşturuyoruz.

Lua (Quest):
quest goldfutbol begin
    state start begin
        when 20017.chat."Futbol ateşi" with game.get_event_flag("futbol") == 1 begin
        say_title("Yu-Hwan:")
        say("")
        say("Merhaba ben kesinlikle büyük futbol,")
        say("fanatiğiyim. Futbol'un bir ölüm kalım")
        say("meselesi olduğunu düşünüyorum. Biz erkekler")
        say("bu oyunun hakkını vermeliyiz. Kız gibi")
        say("oynayanlara yer yok!")
        wait()
        say_title("Yu-Hwan:")
        say("")
        say("Hayatında bir kere bile gol atamayan adamlar")
        say("tanıyorum ben! Bunların çaresi ne aslında")
        say("biliyor musun? Büyülü toplar!")
        say("Büyülü top ne mi?")
        say("")
        say("Tabii ki altına bezenmiş futboldaki mükemmelliğin")
        say("sahadaki adı! Bana 10 adet Futbol Topu geririr isen,")
        say("sana Altın Futbol Topu verebilirim.")
            local futbol = select("Altın top istiyorum.")
            if pc.count_item(50096) < 10 then
            say_title("Yu-Hwan:")
            say("")
            say("Yeterli top yok.")
            else
            say_title("Yu-Hwan:")
            say("")
            say("Bir futbol!")
            say("Biraz bekle...")
            say("Birazdan sana altın top yapacağım...")
            wait()
            say("Ah! İşte futbol topları! Bekle birazdan")
            say("seninle topları takas edeceğiz.")
            pc.remove_item(50096, 10)
            pc.give_item2(50265, 1)
            end
        end
    end
end

İlk önce dikkat edilmesi gereken nokta şudur:
Bu Quest "Futbol Topu" etkinliği aktif edildiğinde çalışmaktadır. Eğer sürekli açık tutmak istiyorsanız.

Lua (Quest):
when 20017.chat."Futbol ateşi" with game.get_event_flag("football") == 1 begin

yerine

Lua (Quest):
when 20017.chat."Futbol ateşi" begin

yazmalısınız. Bu sayede sürekli NPC Yu-Hwan da "Futbol Ateşi" konuşması aktif kalır.

Şimdi gelelim ana Quest'imize yüklemeye:
Yalnızca "Futbol Topu" etkinliğini yüklememiz yeterli olacaktır. Çünkü "Futbol Ateşi" etkileşimini "Futbol Topu" tetiklemektedir.

Lua (Quest):
quest etkinlik begin
    state start begin
        when letter with pc.is_gm() begin
            send_letter("Etkinlik Yönetimi")
            end
        when info or button with pc.is_gm() begin
            local menu = select("Ayışığı Define Sandığı ","Futbol Topu")
            if menu == 1 then
                local ay = select("Başlat","Bitir","Vazgeç ")
                if ay == 1 then
                game.set.event_flag("ayisigi",1)
                elseif ay == 2 then
                game.set.event_flag("ayisigi",0)
                elseif ay == 3 then
                return
                end
            if menu == 2 then
                local futbol = select("Başlat","Bitir","Vazgeç ")
                if futbol == 1 then
                game.set.event_flag("futbol",1)
                elseif futbol == 2 then
                game.set.event_flag("futbol",0)
                elseif futbol == 3 then
                return
                end
            end
        end
    end
end

Ana Quest'imize devam edecek şekilde;

"local menu" kısmına bir seçenek daha ekliyoruz.
Daha sonra seçeğimizi "Başlat", "Bitir" ve "Vazgeç" olarak yine aynı şekilde sınıflandırmamızı da yapıyoruz.

Bu işlemler bu kadardır. Quest'imizi ".quest" olarak kaydedip çıkıyoruz. Yüklemeleri yaptıktan sonra kullanabilirsiniz. Şu durumda hazırdır.

Özellikle fazla detaya girmek istemedim zamanla daha da detaylandıracağız ilk olarak biraz basitte kalması daha anlaşılır olmasına olanak sağlayacağını düşünüyorum.

Yakın bir zamanda devamını da getireceğim.
İyi forumlar... :)
 
Merhabalar,

Etkinlik oluşturma türlerinde asıl gönderiyi düzenleyeceğim. Bu yorumda ise otomatik etkinlik sistemini anlatacağım. Asıl konu ve yorum orantılı bir şekilde devam edecektir. Bir sonra ki yorum da ise özel günlere ait etkinliklerden bahsedeceğim. (Onun yayınlanması biraz daha zaman alacaktır.)

Önce ki gönderimizde Ayışığı Define Sandığı ve Futbol Topu etkinliklerini belirtmiştik sadece. Yine sadece bu 2 etkinlik üzerinden giderek otomatik başlatma sisteminin Quest'ini ayarlayacağız.

İlk olarak düşündüğümüz etkinlik takvimini bir not alalım bunu Quest yazmaya başlarken düşünürken dalgınlıkla hata yapabiliriz. Öncesinden ayarlamak en mantıklısıdır. Varsayalım;

Kod:
Günler        Saat Aralığı        Etkinlik Adı

Pazartesi    20:00 - 22:00        Ayışığı Define Sandığı
Salı        20:00 - 22:00        Futbol Topu
Çarşamba    20:00 - 22:00        Ayşığı Define Sandığı
Perşembe    20:00 - 22:00        Futbol Topu
Cuma        20:00 - 22:00        Ayışığı Define Sandığı
Cumartesi    14:00 - 16:00        Ayışığı Define Sandığı
Cumartesi    20:00 - 22:00        Futbol Topu
Pazar        14:00 - 16:00        Ayışığı Define Sandığı
Pazar        20:00 - 22:00        Futbol Topu

Şeklinde bir etkinlik takvimi oluşturduk. Diğer unsur ise etkinliklerimizi game.get_event_flag kısmında nasıl belirttiğimizi de bir kenara not alıyoruz. Örneğin Ayışığı Define Sandığı etkinliği için şu satırı belirtmiştik:

Lua (Quest):
when kill with game.get_event_flag("ayisigi") == 1 and not npc.is_pc() begin

"ayisigi" kısmı bizim için önemli olan kısımdır. Şimdi ana Quest'i yazmaya başlayalım:

Bir çok farklı türde başlatma yapabiliriz. Fakat benim tercih ettiğim ve bir sorun ya da başka bir problem oluştuğunda kapatabileceğim tür olan "letter" sistemi üzerinden gideceğiz. (Diğerlerini de örneklendireceğim.)

Lua (Quest):
quest otoetkinlik begin
    state start begin
        when letter with pc.is_gm() begin
            send_letter("Otomatik Etkinlikler")
            end
        when info or button with pc.is_gm() begin

Başlangıcımızı yine "maneul olarak başlatılacak Quest'ler" ile aynı şekilde yapıyoruz.

Ve sırada eklemek istediğimiz seçenekleri belirtiyoruz.

Lua (Quest):
quest otoetkinlik begin
    state start begin
        when letter with pc.is_gm() begin
            send_letter("Otomatik Etkinlikler")
            end
        when info or button with pc.is_gm() begin
            local otomatik = select("Aktif Et","Deaktif Et","Vazgeç ")
            if otomatik == 1 then
           
            elseif otomatik == 2 then
           
            elseif otomatik == 3 then
            end
        end
    end
end

Geldik bu seçeneklerin altlarını toplamaya...

Hatırlarsınız ki; Ayışığı Define Sandığı için nasıl bir isimlendirme verip tetiklediysek aynı şekilde Otomatik Etkinlikler için de bir isimlendirme yapıp tetiklemeye müsait bir duruma getireceğiz. Otomatik Etkinliklerimizin tetikleyici "otoevent" şeklinde olsun.


Lua (Quest):
            if otomatik == 1 then
            clear_server_timer("otoevent")
            server_loop_timer("otoevent",1)

Yukarıda ki satır da "clear_server_timer" olan kısımda (sunucu zamanını sıfırlama/temizleme) isimlendirme kısmını ayarladık.
"server_loop_timer" olayında ise (sunucu döngü zamanı) ise isimlendirmesini yaptığımız otomatik etkinlik Quest'inin başlatma komutunu verdik. Aynı şekilde durdurmak için ise 1 yerini 0 ile değiştireceğiz. Altta ki satırlarda ki gibi.

Lua (Quest):
            elseif otomatik == 2 then
            clear_server_timer("otoevent")
            server_loop_timer("otoevent",0)

Genel olarak yaptığımız işlemi biraz toplayalım:

Lua (Quest):
quest otoetkinlik begin
    state start begin
        when letter with pc.is_gm() begin
            send_letter("Otomatik Etkinlikler")
            end
        when info or button with pc.is_gm() begin
            local otomatik = select("Aktif Et","Deaktif Et","Vazgeç ")
            if otomatik == 1 then
            clear_server_timer("otoevent")
            server_loop_timer("otoevent",1)
            elseif otomatik == 2 then
            clear_server_timer("otoevent")
            server_loop_timer("otoevent",0)
            elseif otomatik == 3 then
            return
            end
        end
    end
end

Otomatik Etkinliğimizin isimlendirmesini oluşturduk aktif etme ve deaktif etme olaylarını da yazdık. Fakat neyi tetikleyecek bu "otoevent" kavramı...

Sonuncu "when" komutuna ait olan "end" kısmının altına yeni bir "when" komutu açma vakti geldi. Zamanlayıcılarımızı ekleyebilelim.

Lua (Quest):
        when otoevent.server_timer begin
            local time = os.date("%X")
            local day = os.date("%A")
        end

Yeni oluşturduğumuz "when" komutu altında iki farklı seçenek oluşturucu başlık görüyorsunuz. İsimlerinden de anlaşılacağı gibi biri zaman (saat) faktörünü ele alırken diğeri ise gün faktörünü ele alıyor. Peki parantez içerisinde ki kavramlar nedir, os.date nin burada ki rolü nedir?

Çok basit bir şekilde anlatayım:

"os.date" burada ki zaman faktörlerinin belirtme kalıbı gibidir. Saat 22:00 kısmında ki "Saat" olduğu gibi ya da Bugün pazartesidir cümlesinde ki "gün" hatta 2017 yılının Ocak ayında ki "yıl" ya da "ay" kalıplarına bürünebilen; etkişelim de bulunan parantez içerisinde ki kavram ile belirlenebilen bir terimdir.

"%X" kısmı 00:00:00 dan başlayıp 23:59:59'a kadar olan bir gün içerisinde ki saatlerdir.
"%A" kısmı ise bir haftanın içerisinde bulunan tüm günlerdir. (Monday, Tuesday…)

Devam edelim:

Lua (Quest):
        when otoevent.server_timer begin
            local time = os.date("%X")
            local day = os.date("%A")
            if day == "Monday" then
                if time == "20:00:00" then
                game.set_event_flag("ayisigi",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("ayisigi",0)
                end
            end
        end

Ne anlatmak istedik:
"Eğer günlerden Pazartesi ve saat 20:00 olduğunda Ayışığı Define Sandığı Etkinliğini başlat saat 22:00 olduğunda ise kapat." Ana mantık anlaşılmıştır diye düşünüyorum.

Lua (Quest):
quest otoetkinlik begin
    state start begin
        when letter with pc.is_gm() begin
            send_letter("Otomatik Etkinlikler")
            end
        when info or button with pc.is_gm() begin
            local otomatik = select("Aktif Et","Deaktif Et","Vazgeç ")
            if otomatik == 1 then
            clear_server_timer("otoevent")
            server_loop_timer("otoevent",1)
            elseif otomatik == 2 then
            clear_server_timer("otoevent")
            server_loop_timer("otoevent",0)
            elseif otomatik == 3 then
            return
            end
        end
        when otoevent.server_timer begin
            local time = os.date("%X")
            local day = os.date("%A")
            if day == "Monday" then
                if time == "20:00:00" then
                game.set_event_flag("ayisigi",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("ayisigi",0)
                end
            end
            if day == "Tuesday" then
                if time == "20:00:00" then
                game.set_event_flag("futbol",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("futbol",0)
                end
            end
            if day == "Wednesday" then
                if time == "20:00:00" then
                game.set_event_flag("ayisigi",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("ayisigi",0)
                end
            end
            if day == "Thursday" then
                if time == "20:00:00" then
                game.set_event_flag("futbol",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("futbol",0)
                end
            end
            if day == "Friday" then
                if time == "20:00:00" then
                game.set_event_flag("ayisigi",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("ayisigi",0)
                end
            end
            if day == "Saturday" then
                if time == "14:00:00" then
                game.set_event_flag("futbol",1)
                end
                if time == "16:00:00" then
                game.set_event_flag("futbol",0)
                end
                if time == "20:00:00" then
                game.set_event_flag("ayisigi",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("ayisigi",0)
                end
            end
            if day == "Sunday" then
                if time == "14:00:00" then
                game.set_event_flag("futbol",1)
                end
                if time == "16:00:00" then
                game.set_event_flag("futbol",0)
                end
                if time == "20:00:00" then
                game.set_event_flag("ayisigi",1)
                end
                if time == "22:00:00" then
                game.set_event_flag("ayisigi",0)
                end
            end
        end
    end
end

Her şeyi tamamen topladıktan sonra, bu şekilde bir görünüm elde ediyoruz. Fakat bitti mi hayır. Etkinlik duyuruları, etkinliği açık olup olmadığının kontrolünü sağlama, etkinlik saatinden sonra oyunda olan kişinin hangi etkinliğin açık olduğunu anlayabilmesi, oyunculara etkinlik takvimi ulaşması vs. gibi bir çok özellik de konu güncellenmeye devam ederken eklenecektir.

İyi forumlar... :)
 
ekstra bunların drobu için farklı bir quest yazılacak peki exp puan etkinliğinin flagını nasıl ayarlanır birde oyuncu girdiği zaman hangi event aktif olduğunu nereden görecek
 
etkinlik başladığında bütün metinlerin belirlediğm bir metin yapmak icin ne yapmalıyım ?
 
Geri
Üst