Selam!
Güncel olarak birçok sunucunun kullandığı @__dracaryS__ etkinlik takvimi sistemini uzun zamandır kendi oyunlarımda da kullanıyordum. Ancak bu projede etkinliklerin büyük bir kısmını klasik yapıdan farklı şekilde çalıştırdığım için, mevcut sistem yerine daha esnek ve daha sade bir etkinlik yönetim yapısına ihtiyaç duydum.
Temel mantık aslında oldukça basit:
Etkinlik bilgileri doğrudan veritabanındaki ilgili tablodan okunuyor. Sistem, tabloda tanımlanan etkinlik türüne, başlangıç zamanına, süresine ve gerekli parametrelere göre etkinliği otomatik olarak açıyor ve süresi dolduğunda yine otomatik olarak kapatıyor.
Örneğin EXP, Yang veya benzeri bonus etkinlikleri /priv_empire üzerinden başlatılıyorsa, komut çalıştırılırken etkinliğin aktif kalacağı süre de doğrudan veriliyor. Böylece etkinliği kapatmak için ayrıca bir zaman kontrolü yapmak veya sonradan ikinci bir komut çalıştırmak gerekmiyor. Süre yönetimini zaten oyun kendi içerisinde gerçekleştiriyor.
event_flag üzerinden çalışan etkinliklerde ise sistem başlangıçta ilgili flag değerini aktif hale getiriyor. Etkinlik süresi sona erdiğinde aynı flag tekrar 0 değerine çekilerek etkinlik otomatik olarak kapatılıyor.
Yani sistemin ana amacı mümkün olduğunca basit bir yapı kurmak:
Bu sayede her etkinlik için ayrı ayrı karmaşık kontrol mekanizmaları yazmak yerine, tek bir merkezi takvim sistemi üzerinden farklı çalışma mantıklarına sahip etkinlikler yönetilebiliyor.
Güncel olarak birçok sunucunun kullandığı @__dracaryS__ etkinlik takvimi sistemini uzun zamandır kendi oyunlarımda da kullanıyordum. Ancak bu projede etkinliklerin büyük bir kısmını klasik yapıdan farklı şekilde çalıştırdığım için, mevcut sistem yerine daha esnek ve daha sade bir etkinlik yönetim yapısına ihtiyaç duydum.
Temel mantık aslında oldukça basit:
Etkinlik bilgileri doğrudan veritabanındaki ilgili tablodan okunuyor. Sistem, tabloda tanımlanan etkinlik türüne, başlangıç zamanına, süresine ve gerekli parametrelere göre etkinliği otomatik olarak açıyor ve süresi dolduğunda yine otomatik olarak kapatıyor.
Örneğin EXP, Yang veya benzeri bonus etkinlikleri /priv_empire üzerinden başlatılıyorsa, komut çalıştırılırken etkinliğin aktif kalacağı süre de doğrudan veriliyor. Böylece etkinliği kapatmak için ayrıca bir zaman kontrolü yapmak veya sonradan ikinci bir komut çalıştırmak gerekmiyor. Süre yönetimini zaten oyun kendi içerisinde gerçekleştiriyor.
event_flag üzerinden çalışan etkinliklerde ise sistem başlangıçta ilgili flag değerini aktif hale getiriyor. Etkinlik süresi sona erdiğinde aynı flag tekrar 0 değerine çekilerek etkinlik otomatik olarak kapatılıyor.
Yani sistemin ana amacı mümkün olduğunca basit bir yapı kurmak:
- Tablodan etkinliği oku
- Zamanı geldiğinde etkinliği başlat
- Belirtilen süre boyunca çalıştır
- Süre sonunda kullanılan yönteme göre otomatik olarak kapat.
Bu sayede her etkinlik için ayrı ayrı karmaşık kontrol mekanizmaları yazmak yerine, tek bir merkezi takvim sistemi üzerinden farklı çalışma mantıklarına sahip etkinlikler yönetilebiliyor.
Kod:
const char* CEventScheduleManager::GetFlagName(BYTE type)
{
switch (type)
{
case EVENT_TRACK_FOOTBALL: return "football_drop";
case EVENT_TRACK_MOONLIGHT: return "moonlight_drop";
case EVENT_TRACK_SIMIT: return "simit_drop";
case EVENT_TRACK_FISHING: return "balik_event";
default: return NULL;
}
}
int CEventScheduleManager::GetPrivType(BYTE type)
{
switch (type)
{
case EVENT_TRACK_EXP: return 4;
case EVENT_TRACK_ITEM: return 1;
case EVENT_TRACK_YANG: return 2;
default: return 0;
}
}
void CEventScheduleManager::StartEvent(SEventScheduleRow& row, time_t now)
{
if (IsFlagEvent(row.eventType))
{
const char* flag = GetFlagName(row.eventType);
if (flag)
{
quest::CQuestManager::instance().RequestSetEventFlag(flag, 1);
sys_log(0, "EVENT_SCHEDULE: START flag '%s' = 1 (id=%u)", flag, row.id);
}
}
else
{
int privType = GetPrivType(row.eventType);
if (privType > 0)
{
int value = (int)row.value;
time_t durSec = (time_t)row.durationHours * 3600;
CPrivManager::instance().RequestGiveEmpirePriv(0, (BYTE)privType, value, durSec);
sys_log(0, "EVENT_SCHEDULE: START priv_empire(0, type=%d, value=%d, dur=%ldh) (id=%u)",
privType, value, (long)row.durationHours, row.id);
}
}
row.applied = true;
MarkInDB(row.id, true, row.closed);
}
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Kilitli
- Cevaplar
- 7
- Görüntüleme
- 2K
- Kilitli
- Cevaplar
- 1
- Görüntüleme
- 609
- Cevaplar
- 37
- Görüntüleme
- 2K
- Cevaplar
- 6
- Görüntüleme
- 1K
- Cevaplar
- 3
- Görüntüleme
- 116