xranzei 1
xranzei
zendor2 1
zendor2
Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Almira2 1
Almira2
romegames 1
romegames
D 1
delimuratt
melankolıa18 1
melankolıa18
shrpnl 1
shrpnl
Fethi Polat 1
Fethi Polat
kralhakan2009 1
kralhakan2009
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Altın Konu MaviAyGames | Quest İle Timer Kontrolü

  • Konuyu başlatan Konuyu başlatan MaviAy44
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 27
  • Görüntüleme Görüntüleme 5K

MaviAy44

Emre Kırıcı
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Yönetici
Katılım
16 Tem 2019
Konular
715
Mesajlar
3,551
Çözüm
47
Online süresi
6mo 20d
Reaksiyon Skoru
2,109
Altın Konu
34
Başarım Puanı
309
MmoLira
19,556
DevLira
122
Ticaret - 100%
7   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

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.

Kod:
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;

Kod:
            void        CancelServerTimers(DWORD arg);
Altına şu kodu ekle;
Kod:
            bool        IsServerTimer(const string& name);

Server/game/src/questmanager.cpp dosyasında ara;
Kod:
void CQuestManager::CancelServerTimers(DWORD arg)

Fonksiyonun bitiminden sonra şu kodları ekleyin;
Kod:
    bool CQuestManager::IsServerTimer(const std::string& name)
    {
        itertype(m_mapTimerID) it = m_mapTimerID.find(name);
        if (it != m_mapTimerID.end())
        {
            return true;
        }

        return false;
    }

Server/game/src/quest_global.cpp dosyasında ara;
Kod:
ALUA(_set_server_loop_timer)

Fonksiyonun bitiminden sonra şu kodları ekleyin;

Kod:
  ALUA(_is_server_timer)
    {
        //int n = lua_gettop(L);
        if (!lua_isstring(L, 1))
        {
            sys_err("QUEST set_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;
Kod:
            {    "server_loop_timer",        _set_server_loop_timer    },

Altına şunu ekleyin;
Kod:
            {    "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:
is_server_timer

Örnek kullanım;
Kod:
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
 
Son düzenleme:
Konu için teşekkürler.
 
Paylaşım için teşekkürler.
 
bunu kullanarak oyunu sıkıntıya sokarsın bilgin olsun
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst