Boss Takip Sistemi (boss_time_system)

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 67

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0


quest dosyası içine at ./qc çek[/FONT]


Dosyalar içinde kurulum mevcut.
Adsiz.png

Adssiz.png

game.py aç Tarat
Kod:
onPressKeyDict[app.DIK_F4]    = lambda : self.__PressQuickSlot(7)
Altına Ekle
Kod:
onPressKeyDict[app.DIK_F5]    = lambda : self.BoosTimeWindowOpen()


Sistem F5 İle Çalışıyor Şuanda Siz F5 Yerinde Başka Tuş Atayabilirsiniz.







SOURCE TAM HALİ


Kod:
CHAR.BATTLE.CPP ARAT :     //CHECK_FORKEDROAD_WAR     if (IsPC())     {         if (CThreeWayWar::instance().IsThreeWayWarMapIndex(GetMapIndex()))             isForked = true;     }     //END_CHECK_FORKEDROAD_WAR ALTINA EKLE #ifdef ENABLE_BEVIS_BOSS_TIME     if (!IsPC())     {         bool Return_B = true;         LPCHARACTER ch;         if (pkKiller && pkKiller->IsPC())         {             time_t currentTime;             struct tm *localTime;             time( &currentTime );             localTime = localtime( &currentTime );             int Hour   = localTime->tm_hour;             int Min    = localTime->tm_min;             //int Sec    = localTime->tm_sec;             int channel;             char xHour[128];             char xMinutes[128];             int mobcode;             if (GetRaceNum() == 2291 && GetMapIndex() == 63) {                 mobcode = 2291;             }             else if(GetRaceNum() == 1192 && GetMapIndex()==72){                 mobcode = 1192;             }             else if(GetRaceNum() == 2206 && GetMapIndex() == 62){                 mobcode = 2206;             }             else if(GetRaceNum() == 2091 && GetMapIndex() == 71){                 mobcode = 2091;             }             else if(GetRaceNum() == 1901 && GetMapIndex() == 61){                 mobcode = 1901;             }             else {                 Return_B = false;             }             if (Return_B == true)             {                 if (Hour < 10 && Min < 10){                     if (mobcode == 1192){                         snprintf(xHour, sizeof(xHour), "0%d",Hour+3);                         snprintf(xMinutes, sizeof(xMinutes), "0%d",Min);}                     else if (mobcode == 2206){                         snprintf(xHour, sizeof(xHour), "0%d",Hour+2);                         snprintf(xMinutes, sizeof(xMinutes), "0%d",Min);}                     else {                         snprintf(xHour, sizeof(xHour), "0%d",Hour+1);                         snprintf(xMinutes, sizeof(xMinutes), "0%d",Min);}                 }                 else if (Hour < 10){                     if (mobcode == 1192){                         snprintf(xHour, sizeof(xHour), "0%d",Hour+3);                         snprintf(xMinutes, sizeof(xMinutes), "%d",Min);}                     else if (mobcode == 2206){                         snprintf(xHour, sizeof(xHour), "0%d",Hour+2);                         snprintf(xMinutes, sizeof(xMinutes), "%d",Min);}                     else {                         snprintf(xHour, sizeof(xHour), "0%d",Hour+1);                         snprintf(xMinutes, sizeof(xMinutes), "%d",Min);}                 }                 else if (Min < 10){                     if (mobcode == 1192){                         snprintf(xHour, sizeof(xHour), "%d",Hour+3);                         snprintf(xMinutes, sizeof(xMinutes), "0%d",Min);}                     else if (mobcode == 2206){                         snprintf(xHour, sizeof(xHour), "%d",Hour+2);                         snprintf(xMinutes, sizeof(xMinutes), "0%d",Min);}                     else {                         snprintf(xHour, sizeof(xHour), "%d",Hour+1);                         snprintf(xMinutes, sizeof(xMinutes), "0%d",Min);}                 }                 else{                     if (mobcode == 1192){                         snprintf(xHour, sizeof(xHour), "%d",Hour+3);                         snprintf(xMinutes, sizeof(xMinutes), "%d",Min);}                     else if (mobcode == 2206){                         snprintf(xHour, sizeof(xHour), "%d",Hour+2);                         snprintf(xMinutes, sizeof(xMinutes), "%d",Min);}                     else{                     snprintf(xHour, sizeof(xHour), "%d",Hour+1);                     snprintf(xMinutes, sizeof(xMinutes), "%d",Min);}                 }                 std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT mobcode, channel FROM player.boos_time_system WHERE mobcode= %d and channel = %d",mobcode , g_bChannel));                 if (pMsg->Get()->uiNumRows == 0)                 {                     DBManager::instance().Query("INSERT INTO player.boos_time_system (boosismiver ,katilismiver, saatver, dakikaver , mobcode, channel , guildname) values('MobKesildi', '%s', '%s' , '%s' , '%d' , '%d' , '%s')",pkKiller->GetName(), xHour, xMinutes , mobcode, g_bChannel , pkKiller->GetGuild() ? pkKiller->GetGuild()->GetName() : "Lonca Bulunamadı");                     pkKiller->ChatPacket(CHAT_TYPE_COMMAND, "update_bosstime");                 }                 else                 {                     DBManager::instance().DirectQuery("UPDATE player.boos_time_system SET boosismiver='MobKesildi', katilismiver='%s', saatver='%s', dakikaver='%s', mobcode='%d', guildname='%s' WHERE mobcode='%d' and channel='%d'",pkKiller->GetName(), xHour, xMinutes, mobcode, pkKiller->GetGuild() ? pkKiller->GetGuild()->GetName() : "Lonca Bulunamadı",mobcode, g_bChannel);                     pkKiller->ChatPacket(CHAT_TYPE_COMMAND, "update_bosstime");                 }             }         }     } #endif #ifdef ENABLE_BOSSRANKING_SYSTEM     if (!IsPC())     {         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 2092)         {             LogManager::instance().BossBaronesLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 2493)         {             LogManager::instance().BossEjderLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 2598)         {             LogManager::instance().BossAzrailLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 1093)         {             LogManager::instance().BossLuciferLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 2291)         {             LogManager::instance().BossKirmiziEjderLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 6091)         {             LogManager::instance().BossRazadorLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 6191)         {             LogManager::instance().BossNemereLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }         if (pkKiller && pkKiller->IsPC() && GetRaceNum() == 6193)         {             LogManager::instance().BossMeleyLogBevis(pkKiller->GetLevel(), pkKiller->GetName(), pkKiller->GetEmpire(), 1);         }     } #endif LOG.CPP AÇILIR EN ALTA EKLE GİTSİN #ifdef ENABLE_BOSSRANKING_SYSTEM void LogManager::BossBaronesLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bossbarones FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bossbarones, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bossbarones=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } void LogManager::BossEjderLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bossejder FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bossejder, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bossejder=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } void LogManager::BossAzrailLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bossazrail FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bossazrail, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bossazrail=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } void LogManager::BossLuciferLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bosslusifer FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bosslusifer, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bosslusifer=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } void LogManager::BossKirmiziEjderLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bosskirmiziejder FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bosskirmiziejder, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bosskirmiziejder=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } void LogManager::BossRazadorLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bossrazador FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bossrazador, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bossrazador=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } void LogManager::BossNemereLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bossnemere FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bossnemere, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bossnemere=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } void LogManager::BossMeleyLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount) {     std::auto_ptr<SQLMsg> pMsg(DBManager::Instance().DirectQuery("SELECT player_name, player_empire, bossmeley FROM player.boss_siralamasi WHERE player_name='%s'", szPlayerName));     if (pMsg->Get()->uiNumRows == 0)         Query("INSERT INTO player.boss_siralamasi (player_level, player_name, player_empire, bossmeley, date) VALUES(%u, '%s', %u, %u, NOW())", dwPlayerID, szPlayerName, dwPlayerEmpire, 1);     else     {         const char* szPlayerNameR;         DWORD dwPlayerEmpireR = 0;         DWORD dwKillCountR = 0;         MYSQL_ROW mRow;         while (NULL != (mRow = mysql_fetch_row(pMsg->Get()->pSQLResult)))         {             int iCur = 0;             szPlayerNameR = mRow[iCur++];             str_to_number(dwPlayerEmpireR, mRow[iCur++]);             str_to_number(dwKillCountR, mRow[iCur++]);         }         if ((dwKillCountR >= 0))             Query("UPDATE player.boss_siralamasi SET player_empire=%u, bossmeley=%u, date=NOW() WHERE player_name='%s'", dwPlayerEmpire, 1 + dwKillCountR, szPlayerName);     } } #endif LOG.H AÇILIR HackShieldLog(unsigned long ErrorCode, LPCHARACTER ch); ARAT #ifdef ENABLE_BOSSRANKING_SYSTEM         void        BossBaronesLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount);         void        BossEjderLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount);         void        BossAzrailLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount);         void        BossLuciferLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount);         void        BossKirmiziEjderLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount);         void        BossRazadorLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount);         void        BossNemereLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount);         void        BossMeleyLogBevis(DWORD dwPlayerID, const char* szPlayerName, DWORD dwPlayerEmpire, DWORD dwKillCount); #endif

Boss Takip Sistemi (boss_time_system)

Metin2 Lobby platformu olarak, Metin2 özel sunucularında performans ve kullanıcı deneyimini artırmaya yönelik sistemler geliştirmeye devam ediyoruz. Bu doğrultuda, sunucularınızda boss savaşlarını daha planlı ve organize hale getirmek amacıyla Boss Takip Sistemi (boss_time_system) tasarladık. Bu sistem, C++ tabanlı sunucu tarafında çalışan bir yapıya sahiptir ve Metin2 özel sunucularında boss respawn sürelerini takip etmeyi sağlar.

Boss Takip Sistemine Genel Bakış

Boss Takip Sistemi, Metin2 sunucularında belirli boss karakterlerin yeniden doğma sürelerini otomatik olarak takip ederek oyuncuların bu bilgiye kolayca ulaşmasını sağlayan bir özelliktir. Bu sayede oyuncular, boss savaşlarını planlayabilir ve sunucudaki etkinliklere daha aktif katılabilirler. Sistem, C++ dilinde yazılmıştır ve game server programming kapsamında geliştirilmiş bir özelliktir. Ayrıca, sunucu tarafında çalışan bu sistem, db core ile entegre çalışarak boss spawn zamanlarını veritabanında saklar.

Neden Boss Takip Sistemine İhtiyaç Var?

Metin2 özel sunucularında boss savaşları, oyuncular için önemli bir rekabet ve gelir kaynağıdır. Ancak, bazı sunucularda bossların respawn zamanları bilinmediğinden dolayı oyuncuların bekleme süresi artar. Bu da kullanıcı memnuniyetini düşürür. Boss Takip Sistemi, bu problemi çözmek amacıyla geliştirildi. Oyuncular artık hangi bossun ne zaman spawn olacağını bilirler. Bu sayede boss savaşlarına önceden hazırlanabilir ve zamanında katılabilirler.

Sistemin Özellikleri

- Otomatik Takip: Boss öldürüldüğünde, sistem otomatik olarak respawn zamanını hesaplar ve saklar.
- Veritabanı Entegrasyonu: Spawn zamanları, MySQL veya MariaDB gibi veritabanlarında tutulur.
- Kullanıcı Dostu Arayüz: Oyuncular, boss zamanlarını kolayca görebilecekleri bir arayüze sahiptir.
- Python Uygulaması Desteği: Sistem, Python GUI ile entegre çalışarak admin paneli gibi gelişmiş kontroller sunabilir.

Sistemin Kurulumu

Boss Takip Sistemi, Metin2 server src dosyalarına entegre edilerek kurulur. Geliştiriciler için bu sistem açık kaynak olarak sunulmuştur. Source edit işlemleriyle kolayca eklenebilir. Ayrıca, martysama ve diğer Metin2 geliştirici toplulukları tarafından test edilmiş ve güvenilir bir yapıya sahiptir.

Sunucu Tarafı Kodlama

Sistem, C++ dilinde yazılmış olup game server tarafında çalışır. Sunucu başlatıldığında, boss takip mekanizması aktif hale gelir. Her boss öldürüldüğünde, sistem respawn zamanını veritabanına kaydeder. Aynı zamanda, respawn zamanı geldiğinde tekrar spawn işlemini başlatır.

Veritabanı Yapısı

Sistem, db tarafında basit ama etkili bir yapıyla çalışır. Boss ismi, son öldürülme zamanı ve respawn süresi gibi bilgileri saklar. Bu sayede, zamanlamalar doğru şekilde takip edilir ve sistem kararlı bir şekilde çalışır.

Oyuncu Deneyimi

Boss Takip Sistemi sayesinde, oyuncular boss zamanlarını takip edebilir ve savaşlara daha hazırlıklı bir şekilde katılır. Bu da PvP odaklı sunucularda rekabeti artırır ve Metin2 PvP sistem deneyimini daha keyifli hale getirir. Ayrıca, Metin2 PvP sunucularında boss savaşları genellikle büyük önem taşır ve bu sistemle birlikte daha dengeli bir oyun yapısı oluşturulabilir.

Sonuç

Boss Takip Sistemi (boss_time_system), Metin2 özel sunucularında kullanıcı memnuniyetini artırmak ve oyun içi organizasyonu geliştirmek için ideal bir çözümdür. Metin2 Lobby olarak, bu tür gelişmiş sistemleri siz geliştiriciler için derliyor ve sunuyoruz. Dilerseniz Metin2 Lobby üzerinden diğer sistemleri de inceleyebilirsiniz.


Boss Tracking System (boss_time_system)

Metin2 Lobby platform, we continue developing systems that enhance performance and user experience on Metin2 private servers. In this context, we have designed the Boss Tracking System (boss_time_system) to make boss fights more organized and scheduled on your servers. This system operates on a C++ based server-side structure and allows tracking of boss respawn times in Metin2 private servers.

Overview of the Boss Tracking System

The Boss Tracking System is a feature that automatically tracks the respawn times of specific boss characters in Metin2 servers and allows players easy access to this information. This way, players can plan their boss battles and participate more actively in server events. The system is written in C++ and developed under the scope of game server programming. Additionally, the server-side system works integrated with db core to store boss spawn times in the database.

Why Do We Need a Boss Tracking System?

In Metin2 private servers, boss fights are an important source of competition and income for players. However, in some servers, since boss respawn times are unknown, the waiting time for players increases. This decreases user satisfaction. The Boss Tracking System was developed to solve this issue. Players now know when each boss will respawn, allowing them to prepare and join battles on time.

Features of the System

- Automatic Tracking: When a boss is killed, the system automatically calculates and stores the respawn time.
- Database Integration: Spawn times are stored in databases such as MySQL or MariaDB.
- User-Friendly Interface: Players have access to an easy-to-use interface where they can view boss times.
- Python Application Support: The system can work with Python GUI to provide advanced controls like an admin panel.

Installation of the System

The Boss Tracking System is installed by integrating into Metin2 server src files. For developers, this system is provided as open-source. It can be easily added via source edit operations. Furthermore, it has been tested and proven reliable by martysama and other Metin2 developer communities.

Server-Side Coding

The system is written in C++ and runs on the game server side. When the server starts, the boss tracking mechanism activates. Each time a boss is killed, the system records the respawn time in the database. Also, when the respawn time arrives, it triggers the respawn process again.

Database Structure

The system operates with a simple yet effective structure on the db side. It stores information such as the boss name, last kill time, and respawn duration. This ensures that timing is tracked correctly and the system runs stably.

Player Experience

Thanks to the Boss Tracking System, players can track boss times and join battles better prepared. This increases competition in PvP-oriented servers and enhances the Metin2 PvP system experience. Moreover, boss fights often hold great importance in Metin2 PvP servers, and with this system, a more balanced gameplay structure can be achieved.

Conclusion

The Boss Tracking System (boss_time_system) is an ideal solution for increasing user satisfaction and improving in-game organization on Metin2 private servers. As Metin2 Lobby, we compile and present such advanced systems for you developers. You can review other systems at Metin2 Lobby.​
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt