Quest İle Timer Kontrolü

Whistle

Ruhsuz :/
Kurucu
Geliştirici
Yardımsever Üye
Mesaj
12.296
Çözümler
573
Beğeni
15.698
Puan
6.281
Ticaret Puanı
2
Merhaba arkadaşlar,
timer ile oto duyuru, event gibi questleri oyununuzda kullanıyorsanız sık sık karşılaşacağınız sorunlardan bir tanesi de reboot veya reload q atıldığında timerin çalışmadığıdır.
Bizde bu gibi durumlarda timerin çalışıp çalışmadığını kontrol eden bir quest fonksiyonunu kaynak kodumuza ekleyeceğiz.
Kendi serverim için yazdığım ufak bir eklentidir. Düzgün çalıştığını söyleyebilirim.

Şimdi neden reboot/reload q atıldığında timerlar sıfırlanıyor?
Server/game/src/questmanager.cpp dosyasında reload q atıldığı zaman burası çalışır.
C++:
Genişlet Daralt Kopyala
void CQuestManager::Reload()
    {
        lua_close(L);
        m_mapNPC.clear();
        m_mapNPCNameID.clear();
        m_hmQuestName.clear();
        m_mapTimerID.clear();
        m_hmQuestStartScript.clear();
        m_mapEventName.clear();

m_mapTimerID kısmı da timerlerın bilgisini tuttuğu için silinir. Bu yüzden reload q'dan sonra timerlar çalışmaz.

Elle timerları kontrol edeceğimiz bir eklenti ile bu sorunu çözebiliriz.
Sırayla şu işlemleri uygulayın;
1. Adım: Source

Server/game/src/questmanager.h dosyasında ara;
C++:
Genişlet Daralt Kopyala
            void        CancelServerTimers(DWORD arg);

Altına şu kodu ekle;
C++:
Genişlet Daralt Kopyala
            bool        IsServerTimer(const string& name);


Server/game/src/questmanager.cpp dosyasında ara;
C++:
Genişlet Daralt Kopyala
void CQuestManager::CancelServerTimers(DWORD arg)

Fonksiyonun bitiminden sonra şu kodları ekleyin;
Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.



Server/game/src/quest_global.cpp dosyasında ara;
C++:
Genişlet Daralt Kopyala
ALUA(_set_server_loop_timer)

Fonksiyonun bitiminden sonra şu kodları ekleyin;
C++:
Genişlet Daralt Kopyala
  ALUA(_is_server_timer)
    {
        //int n = lua_gettop(L);
        if (!lua_isstring(L, 1))
        {
            sys_err("QUEST is_server_timer argument count wrong.");
            return 0;
        }
        const char * name = lua_tostring(L, 1);
        CQuestManager & q = CQuestManager::instance();

        lua_pushboolean(L, q.IsServerTimer(name));
        return 1;
    }


Aynı dosyada şu kodu aratın;
C++:
Genişlet Daralt Kopyala
            {    "server_loop_timer",        _set_server_loop_timer    },

Altına şunu ekleyin;
C++:
Genişlet Daralt Kopyala
            {    "is_server_timer",            _is_server_timer        },

Bunları yaptıktan sonra gameyi build edip oyuna atınız.

2. Adım: Server Files
Server filesinizde share/locale/turkey/quest dizinine girip quest_function dosyasına şunu ekleyin;
Kod:
Genişlet Daralt Kopyala
is_server_timer


Örnek kullanım;
Lua (Quest):
Genişlet Daralt Kopyala
--Casro2 timer kontrol | mmotutkunlari.com | Whistle
quest timer_kontrol begin
    state start begin
        when letter begin
            send_letter("Timer kontrol")
        end
   
        when button or info begin
            if is_server_timer('timer_name') then
                say("Timer calisiyor.")
            else
                say("Timer calismiyor. Tekrar acmak ister misiniz?")
                local s = select("Evet", "Hayir")
           
                if s == 1 then
                    server_timer("timer_name", 1)
                end
            end
        end
    end
end
 
Zamanında kendi serverimdeki otomatik event kontrolü questi için yazmıştım bu kodları. reload q veya reboot attıktan sonra timerlar kapanıyordu. Bunun sayesinde ise çalışıp çalışmadığını denetleyebiliyoruz.
Timer'ın çalışmasını denetleyecek farklı yöntemlerde var ancak bu daha stabil bir metod olduğu için yazdıydım. :D
 
Zamanında kendi serverimdeki otomatik event kontrolü questi için yazmıştım bu kodları. reload q veya reboot attıktan sonra timerlar kapanıyordu. Bunun sayesinde ise çalışıp çalışmadığını denetleyebiliyoruz.
Timer'ın çalışmasını denetleyecek farklı yöntemlerde var ancak bu daha stabil bir metod olduğu için yazdıydım. :D
acaba ekli hali varmı ben bir türklü ekleyemedimde :) birde bu yeni bir timer galiba değil mi ? yani oyun bunu bilmediği için sıfırlayamıyor
 
Uyarı: Bu konu açıldığından bu yana baya zaman geçmiş.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.
Geri
Üst