- Mesaj
- 11.570
- Çözümler
- 551
- Beğeni
- 12.274
- Puan
- 5.915
- 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.
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;
Altına şu kodu ekle;
Server/game/src/questmanager.cpp dosyasında ara;
Fonksiyonun bitiminden sonra şu kodları ekleyin;
Server/game/src/quest_global.cpp dosyasında ara;
Fonksiyonun bitiminden sonra şu kodları ekleyin;
Aynı dosyada şu kodu aratın;
Altına şunu ekleyin;
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;
Örnek kullanım;
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++:
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++:
void CancelServerTimers(DWORD arg);
Altına şu kodu ekle;
C++:
bool IsServerTimer(const string& name);
Server/game/src/questmanager.cpp dosyasında ara;
C++:
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++:
ALUA(_set_server_loop_timer)
Fonksiyonun bitiminden sonra şu kodları ekleyin;
C++:
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;
C++:
{ "server_loop_timer", _set_server_loop_timer },
Altına şunu ekleyin;
C++:
{ "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;
Lua (Quest):
--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