• 14-12-2015, 14:28:04
    #19
    Kimlik doğrulama veya yönetimden onay bekliyor.
    SexClub adlı üyeden alıntı: mesajı görüntüle
    hocam yazdığım şeklinden biraz daha gelişmiş halini knight online adlı oyun kullanıyor zaten şu güne kadar bir sıkıntı çıkartmadı
    Bir çok oyunun içine baktım ama sleep kullanan görmedim hocam o yüzden tereddütteyim.

    Verano adlı üyeden alıntı: mesajı görüntüle
    kaynak kodları nerden buldun ko'nun ?
    RGZ'de paylaşılmıştı bildiğim kadarıyla.

    lyzerk adlı üyeden alıntı: mesajı görüntüle
    Saat farkı olsun ne olucak alırsın GMT'ye göre client'da kontrol edersin. Sen projenin herhangi bi yerine sleep koyarak projeyi zaten daha fazla tehlikeye atıyosun ki date'in alınımına takılmışsın bu kodu yazmadan önce date = time(0); ile alırsın, al sana date. Zaman gerektiren durumlarda bu şekilde bi kod kullanmak ne projeyi tehlikeye sokar ne sizi. Biraz yazılım bilginiz varsa zaten bunu kolaylıkla yaparsınız.

    İyi çalışmalar.
    Hocam farklı ülkelerden girişler oluyor o yüzden sunucuyla client uysa da ülke uymayacak. 130 dosya içinde sadece 1 tanesi ana dosya ve onda da kodlar sürekli dönmüyor sadece ilk açılışta aktifleşip ardından kapatıyor.
    Bu dosya içinde zaten time kullanılmış ama dediğim gibi bir işlemi kontrol etmek için sadece 1 defalığına aktifleşiyor. Sizin dediğiniz gibi sürekli time kontrolü yapabilmesi için sürekli kodun aktif olması gerekir. Onun tek yolu da ya server tarafı yeniden başlatılmalı yada döngü içinde kalmalı
  • 14-12-2015, 20:35:36
    #20
    Açık kaynak kodlu online oyunlardan birinde sistemin köküne indim, düşündüğüm gibi adamlar giriş kontrolü koymuş.
    Oyunda aktifleşme saati 21:000 olmasına rağmen her zaman 10-40 saniye arasında rastgele bir gecikme oluyordu.
    Oyuna birisi giriş yaptığında saati kontrol ediyor, o yüzde saniye kaybı oluyor.
    Bunu yapabilirim ama sistemde o anda 2-3 kişi birden girdiğini düşünürsek 2-3 kişinin her biri için event tekrarlanacak, bunu engellemek için kontrol koymuşlar. Kontrol ilk kişiyi yakaladıktan sonra duruyor, yapmaya çalışıp duruma göre bilgi veririm.
  • 16-12-2015, 21:31:34
    #21
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Verano adlı üyeden alıntı: mesajı görüntüle
    kaynak kodları nerden buldun ko'nun ?
    hocam knightın sadece server kısmının kodları var ilk olarak 1098 versiyonun paylaşıldı piyasada geliştirenler oldu forum linki vermek serbest mi bilmiyorum isterseniz özelden ulaşırsınız
    adme adlı üyeden alıntı: mesajı görüntüle
    Bir çok oyunun içine baktım ama sleep kullanan görmedim hocam o yüzden tereddütteyim.
    istersen kodları atabilirim hocam göz gezdirirsiniz veya internette aratabilirsiniz
  • 16-12-2015, 23:52:37
    #22
    SexClub adlı üyeden alıntı: mesajı görüntüle
    hocam knightın sadece server kısmının kodları var ilk olarak 1098 versiyonun paylaşıldı piyasada geliştirenler oldu forum linki vermek serbest mi bilmiyorum isterseniz özelden ulaşırsınız

    istersen kodları atabilirim hocam göz gezdirirsiniz veya internette aratabilirsiniz
    Ko bu şekilde mi kullanıyor ?
  • 17-12-2015, 04:47:53
    #23
    adme adlı üyeden alıntı: mesajı görüntüle
    Ko bu şekilde mi kullanıyor ?
    std::vector<Thread *> g_timerThreads;
    g_timerThreads.push_back(new Thread(Timer_CheckGameEvents));
    Thread sınıfından nesne oluşturup vectore atıyor
    uint32 CGameServerDlg::Timer_CheckGameEvents(void * lpParam)
    {
    	while (g_bRunning)
    	{
    		g_pMain->BattleZoneOpenTimer();	// Check if it's time for the BattleZone to open or end.
    		g_pMain->TempleEventTimer();
    		g_pMain->ForgettenTempleEventTimer();
    		sleep(1 * SECOND);
    	}
    	return 0;
    }
    1 saniyede bir timerları kontrol ediyor
    örnek bir timer
    void CGameServerDlg::TempleEventTimer()
    {
    	uint32 nHour = g_localTime.tm_hour;
    	uint32 nMinute = g_localTime.tm_min;
    
    	if (m_nTempleEventRemainSeconds > 0)
    		m_nTempleEventRemainSeconds--;
    
    	if (pTempleEvent.ActiveEvent == -1)
    	{
    		for (int i = 0; i < CHAOS_EVENT_COUNT; i++)
    		{
    			if (nHour == m_nChaosTime[i] && nMinute == 0)
    			{
    				pTempleEvent.ActiveEvent = TEMPLE_EVENT_CHAOS;
    				pTempleEvent.ZoneID = ZONE_CHAOS_DUNGEON;
    				m_nTempleEventRemainSeconds = 600; // 10 minutes
    				TempleEventStart();
    				break;
    			} 
    		}
    
    #if 0 // Temporarily disabled
    		for (int i = 0; i < BORDER_DEFENSE_WAR_EVENT_COUNT; i++)
    		{
    			if (nHour == m_nBorderDefenseWarTime[i] && nMinute == 32) 
    			{
    				pTempleEvent.ActiveEvent = TEMPLE_EVENT_BORDER_DEFENCE_WAR;
    				pTempleEvent.ZoneID = ZONE_BORDER_DEFENSE_WAR;
    				m_nTempleEventRemainSeconds = 600; // 10 minutes
    				TempleEventStart();
    				break;
    			}  
    		}
    #endif
    	}
    	else if (pTempleEvent.ActiveEvent != -1)
    	{
    		if (pTempleEvent.ActiveEvent == TEMPLE_EVENT_CHAOS)
    		{
    			for(int i = 0; i < CHAOS_EVENT_COUNT; i++)
    			{
    				if (nHour == m_nChaosTime[i] 
    				&& nMinute == 11 
    					&& !pTempleEvent.isActive) {
    						m_nTempleEventRemainSeconds = 0;
    						pTempleEvent.LastEventRoom = 1;
    						pTempleEvent.isActive = true;
    						TempleEventStart(); // Set RemainSeconds to zero
    						TempleEventTeleportUsers();
    						TempleEventSummonChaosCubes();
    						break;
    				}
    				else if (nHour == m_nChaosTime[i] 
    				&& nMinute == 12 
    					&& !pTempleEvent.isAttackable) {
    						pTempleEvent.isAttackable = true;
    						break;
    				}
    				else if (nHour == m_nChaosTime[i] 
    				&& nMinute == 32
    					&& pTempleEvent.isActive) {
    						TempleEventFinish();
    						break;
    				}
    			}
    		}
    #if 0 // Temporarily disabled
    		else if (pTempleEvent.ActiveEvent == TEMPLE_EVENT_BORDER_DEFENCE_WAR)
    		{
    			for(int i = 0; i < BORDER_DEFENSE_WAR_EVENT_COUNT; i++)
    			{
    				if (nHour == m_nBorderDefenseWarTime[i] 
    				&& nMinute == 42
    					&& !pTempleEvent.isActive)
    				{
    					m_nTempleEventRemainSeconds = 0; 
    					pTempleEvent.LastEventRoom = 1;
    					pTempleEvent.isActive = true;
    					TempleEventStart(); // Set RemainSeconds to zero
    					TempleEventTeleportUsers();
    					break;
    				} 
    				else if (nHour == (m_nBorderDefenseWarTime[i] + 1) 
    					&& nMinute == 2
    					&& pTempleEvent.isActive)
    				{
    					TempleEventFinish();
    					break;
    				}
    			}
    		}
    #endif
    	}
    }
    m_nChaosTime,m_nBorderDefenseWarTime bu değişkenler gameserver başlangıcında .ini dosyasından çekiliyor,bugüne kadar programı kastırmadılar gecikme vs de olmadı
  • 17-12-2015, 11:13:48
    #24
    Üyeliği durduruldu
    adme adlı üyeden alıntı: mesajı görüntüle
    var da timer ne işime yarayacak ? ben 10 dakikada bir olsun demiyorum sistem sabitlenecek mesela her ayın 5-15-20-25-30'unda saat 03-05-09-12-15-17-20-22-23 saatlerinde çalışmasını istiyorum timer ile olacak iş değil malesef
    iyi senkronize edersen multi-threaded yap. thread icerisinde kullandigin sleep de mainthread i engellemez. sorun yok yani sadece senkronizasyon olayini duzgun yap yeter.
  • 13-01-2016, 14:10:06
    #25
    SexClub adlı üyeden alıntı: mesajı görüntüle
    hocam knightın sadece server kısmının kodları var ilk olarak 1098 versiyonun paylaşıldı piyasada geliştirenler oldu forum linki vermek serbest mi bilmiyorum isterseniz özelden ulaşırsınız

    istersen kodları atabilirim hocam göz gezdirirsiniz veya internette aratabilirsiniz
    tbtlb adlı üyeden alıntı: mesajı görüntüle
    iyi senkronize edersen multi-threaded yap. thread icerisinde kullandigin sleep de mainthread i engellemez. sorun yok yani sadece senkronizasyon olayini duzgun yap yeter.
    Konuda yardımcı olan herkese teşekkürler.
    Sleep yada diğer yöntemleri kullanmadım. Çare olarak oyunun alt yapısı olan bir fonksiyonu söküp değiştirdim, fonksiyon kendisini sürekli 3 saniyede bir tekrar ediyor. Bu sayede problemsiz halledebildim.