[C++] Çeşitli Fixler

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

Admin

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

Metin2Dev'de paylaşılan fixleri incelerken içinden beğendiğim fixleri aldım, bazılarına eklemeler yaparak kendi src dosyalarımda kullandım, işinize yarar diye düşünüyorum.Fixlerin ham hallerini paylaşan Metin2Dev'den WeedHex'e teşekkürler.

Nasıl Yapacağız ;

Anlatıma geçelim gayet detaylı belirttim ;

Kod:
// MT2Dev - Fİxler // /*------------------------------------*/ /* Dungeon Count Monster Fix Başlangıç*/ /*------------------------------------*/ // NE DÜZELTİYORUZ ; Zindanda yanlış sayıma sebebiyet verebilecek bir kod bloğuna gerekli kontrolleri ekliyoruz.// //Dungeon.cpp açılır ; struct FCountMonster //Bulunur             LPCHARACTER ch = (LPCHARACTER) ent;             if (!ch->IsPC()) //Bu kısım aşağıdaki gibi değiştirilir ;             LPCHARACTER ch = (LPCHARACTER) ent;             if (ch->IsMonster() || ch->IsStone()) // Dungeon Count Monster Fix - MT2Dev //SON HALİ BÖYLE GÖZÜKMELİ ; struct FCountMonster {     int n;     FCountMonster() : n(0) {};     void operator()(LPENTITY ent)     {         if (ent->IsType(ENTITY_CHARACTER))         {             LPCHARACTER ch = (LPCHARACTER) ent;             if (ch->IsMonster() || ch->IsStone()) // Dungeon Count Monster Fix - MT2Dev                 n++;         }     } }; /*--------------------------------*/ /* Dungeon Count Monster Fix Bitiş*/ /*--------------------------------*/ /*--------------------------------*/ /*----------------------------------*/ /* Dungeon Memory Leak Fix Başlangıç*/ /*----------------------------------*/ // NE DÜZELTİYORUZ ; Ekleyeceğimiz kontrol ile notice sisteminin sadece char girişi olduğunda tetiklenmesini sağlıyoruz, aksi halde sürekli tetiklenerek gereksiz memory kullanacak.// //Dungeon.cpp açılır ; struct FNotice //Bulunur             if (ent->IsType(ENTITY_CHARACTER))             {                 LPCHARACTER ch = (LPCHARACTER) ent;                 ch->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_psz);             } //Bu kısım aşağıdaki gibi değiştirilir ;             if (ent->IsType(ENTITY_CHARACTER))             {                 LPCHARACTER ch = (LPCHARACTER) ent;                 if (ch->IsPC()) //Dungeon Memory Leak Fix - MT2Dev                     ch->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_psz);             } //SON HALİ BÖYLE GÖZÜKMELİ ;         void operator() (LPENTITY ent)         {             if (ent->IsType(ENTITY_CHARACTER))             {                 LPCHARACTER ch = (LPCHARACTER) ent;                 if (ch->IsPC()) //Dungeon Memory Leak Fix - MT2Dev                     ch->ChatPacket(CHAT_TYPE_NOTICE, "%s", m_psz);             }         } /*------------------------------*/ /* Dungeon Memory Leak Fix Bitiş*/ /*------------------------------*/ /*------------------------------*/ /*----------------------------------------------------*/ /* Binek Üzerinde Evlilik İtemi Giyme Engeli Başlangıç*/ /*----------------------------------------------------*/ // NE DÜZELTİYORUZ ; At veya binek üzerindeyken smokin, gelinlik ve buket gibi itemlerin giyilmesini engelliyoruz.// //char_item.cpp Açılır ; bool CHARACTER::EquipItem(LPITEM item, int iCandidateCell) //Bulunur     if (iWearCell < 0)         return false; //Bu Kodun Altına Eklenir ;     //MT2Dev-BINEK UZERINDEYKEN EVLILIK ITEMI GIYME ENGELI BASLANGIC//     if (iWearCell == WEAR_BODY && IsRiding() && (item->GetVnum() >= 11902 && item->GetVnum() <= 11911 && item->GetVnum() <= 11912)) //Damatlıklar     {         ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ź »óÅ¿¡¼ ¿¹º¹À» ÀÔÀ» ¼ö ¾ø½À´Ï´Ù."));         return false;     }     if (iWearCell == WEAR_BODY && IsRiding() && (item->GetVnum() >= 11903 && item->GetVnum() <= 11913 && item->GetVnum() <= 11914)) //Gelinlikler     {         ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ź »óÅ¿¡¼ ¿¹º¹À» ÀÔÀ» ¼ö ¾ø½À´Ï´Ù."));         return false;     }     if (iWearCell == WEAR_WEAPON && IsRiding() && (item->GetVnum() == 50201 && item->GetVnum() <= 50202)) //Buketler     {         ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¸»À» ź »óÅ¿¡¼ ¿¹º¹À» ÀÔÀ» ¼ö ¾ø½À´Ï´Ù."));         return false;     }     //MT2Dev-BINEK UZERINDEYKEN EVLILIK ITEMI GIYME ENGELI BITIS// /*------------------------------------------------*/ /* Binek Üzerinde Evlilik İtemi Giyme Engeli Bitiş*/ /*------------------------------------------------*/ /*------------------------------------------------*/ /*------------------------------------*/ /* Questlua_global Düzenleme Başlangıç*/ /*------------------------------------*/ // NE DÜZELTİYORUZ ; İki kod bloğunu detaylandırıyoruz.// //questlua_global.cpp Açılır. int _clear_server_timer(lua_State* L) /*Bulunur*/ //MT2Dev-Clear_Server_Timer Fonksiyonu Detaylandırıldı     int _clear_server_timer(lua_State* L)     {         CQuestManager & q = CQuestManager::instance();         const char * name = lua_tostring(L, 1);         DWORD arg = (DWORD) lua_tonumber(L, 2);         if (name && arg)             q.ClearServerTimer(name, arg);         else             sys_err("LUA PREVENT: Wrong argument on ClearServerTimer!");         return 0;     } //MT2Dev-Clear_Server_Timer Fonksiyonu Detaylandırıldı /*Kod bloğu tamamen değiştirilir.*/ int _char_log(lua_State * L) /*Bulunur*/ //MT2Dev-Char_Log Fonksiyonu Detaylandırıldı     int _char_log(lua_State * L)     {         CQuestManager& q = CQuestManager::instance();         LPCHARACTER ch = q.GetCurrentCharacterPtr();         DWORD what = 0;         const char* how = "";         const char* hint = "";         if (lua_isnumber(L, 1)) what = (DWORD)lua_tonumber(L, 1);         if (lua_isstring(L, 2)) how = lua_tostring(L, 2);         if (lua_tostring(L, 3)) hint = lua_tostring(L, 3);         if (ch)             LogManager::instance().CharLog(ch, what, how, hint);         else             sys_err("LUA PREVENT: !ch on _char_log!");         return 0;     } //MT2Dev-Char_Log Fonksiyonu Detaylandırıldı /*Kod bloğu tamamen değiştirilir.*/ /*--------------------------------*/ /* Questlua_global Düzenleme Bitiş*/ /*--------------------------------*/ /*--------------------------------*/ /*--------------------------------*/ /* Battle Ekstra Kontrol Başlangıç*/ /*--------------------------------*/ // NE DÜZELTİYORUZ ; Ekstra kontrol ekliyoruz.// //battle.cpp Açılır bool battle_is_attackable(LPCHARACTER ch, LPCHARACTER victim) //Bulunur bool battle_is_attackable(LPCHARACTER ch, LPCHARACTER victim) {     if (victim->IsDead() || victim->IsObserverMode()) //Ekstra Kontrol - MT2Dev         return false;     {         SECTREE    *sectree = NULL;         sectree    = ch->GetSectree();         if (sectree && sectree->IsAttr(ch->GetX(), ch->GetY(), ATTR_BANPK))             return false;         sectree = victim->GetSectree();         if (sectree && sectree->IsAttr(victim->GetX(), victim->GetY(), ATTR_BANPK))             return false;     }     if (ch->IsStun() || ch->IsDead() || ch->IsObserverMode()) //Ekstra Kontrol - MT2Dev         return false;     if (ch->IsPC() && victim->IsPC())     {         CGuild* g1 = ch->GetGuild();         CGuild* g2 = victim->GetGuild();         if (g1 && g2)         {             if (g1->UnderWar(g2->GetID()))                 return true;         }     }     if (IS_CASTLE_MAP(ch->GetMapIndex()) && false==castle_can_attack(ch, victim))             return false;     if (CArenaManager::instance().CanAttack(ch, victim) == true)         return true;     return CPVPManager::instance().CanAttack(ch, victim); } //KOD BLOĞU KOMPLE DEĞİŞTİRİLİR. /*----------------------------*/ /* Battle Ekstra Kontrol Bitiş*/ /*----------------------------*/ /*----------------------------*/ /*-------------------------------*/ /* Cube Core Downer Fix Başlangıç*/ /*-------------------------------*/ // NE DÜZELTİYORUZ ; Zorda olsa core düşürebilecek bir sıkıntıyı çözüyoruz.// //Cube.cpp Açılır         LogManager::instance().CubeLog(ch->GetPlayerID(), ch->GetX(), ch->GetY(),                 reward_value->vnum, new_item->GetID(), reward_value->count, 1); //Bulunur         if (new_item)             LogManager::instance().CubeLog(ch->GetPlayerID(), ch->GetX(), ch->GetY(),reward_value->vnum, new_item->GetID(), reward_value->count, 1); //Rare Core Downer Fix - MT2Dev         else             sys_err("Cannot find new_item on CUBE_MAKE!"); //Değiştirilir /*---------------------------*/ /* Cube Core Downer Fix Bitiş*/ /*---------------------------*/


Direk olarak cpp dosyasından almak isteyenler için link ;

-
[C++] Çeşitli Fixler

Metin2 özel sunucu geliştirme sürecinde, C++ tabanlı sistemlerde karşılaşılan hataların giderilmesi oldukça kritik öneme sahiptir. Bu bağlamda, [C++] dilinde geliştirilen çekirdek sistemlerde çeşitli fixler uygulamak, hem oyun sunucusunun daha kararlı çalışmasını sağlar hem de oyuncuların daha keyifli bir PvP deneyimi yaşamasını mümkün kılar. Bu yazıda, Metin2 özel sunucularında sıkça karşılaşılan ve geliştiriciler tarafından uygulanan çeşitli C++ fixlerden bahsedeceğiz.

Oyun Sunucusunda Karşılaşılan Tipik Hatalar
Metin2 oyun sunucularında en çok görülen hatalardan bazıları, bellek sızıntısı, veritabanı bağlantı hataları, eşzamanlama problemleri ve oyun döngüsünde oluşan donmalar olabilir. Özellikle PvP odaklı sunucularda, bu hatalar doğrudan oyun deneyimini etkiler. Bu nedenle, geliştiricilerin bu sorunlara yönelik C++ tabanlı çözümler geliştirmesi büyük önem taşır.

Memory Leak Fixleri
Bellek sızıntısı, sunucunun zamanla yavaşlamasına ve sonunda çökmesine sebep olabilir. Bu durumu engellemek için, dinamik olarak tahsis edilen bellek alanlarının doğru şekilde serbest bırakılması gerekir. Örneğin, new anahtar kelimesiyle tahsis edilen bir nesne için mutlaka delete çağrısı yapılmalıdır. Ayrıca, smart pointer yapılarının kullanılması da bu tür hataları azaltmada etkili olur.

Veritabanı Bağlantı Hatalarının Giderilmesi
Metin2 sunucularında DBCore ve GameCore arasındaki veritabanı bağlantısında kopmalar, oyuncuların verilerinin kaybolmasına veya eşleşmelerin bozulmasına neden olabilir. Bu durumda, bağlantıların otomatik yeniden kurulduğu bir sistem tasarımı yapmak gereklidir. MySQL bağlantılarını yöneten sınıflara, bağlantı kesintisi durumunda tekrar bağlanma mekanizması eklenmelidir. Bu sayede, sistem daha dayanıklı hale gelir.

PvP Sistemlerinde Oluşan Buglar ve Düzeltmeleri
PvP sistemleri, Metin2 özel sunucularında en çok ilgi gören sistemler arasında yer alır. Ancak, bu sistemlerde zaman zaman canavar spawn hataları, skor takibi problemleri veya item drop oranlarında sapmalar olabilir. Bu gibi durumlarda, game/src klasöründeki ilgili sistem dosyalarında değişiklik yapılması gerekir. Örneğin, bir PvP turnuvasında skor hatası yaşanıyorsa, score_manager.cpp dosyasında gerekli kontrollerin yapılması ve veri senkronizasyonunun sağlanması önemlidir.

Client SRC ve Pack Dosyaları ile Entegrasyon
Sunucu tarafında yapılan değişikliklerin doğru şekilde istemcide de görünmesi için, client/src ve pack dosyalarıyla uyumlu çalışılması gerekir. Özellikle GUI ve UI script düzenlemeleri sırasında, Python betiklerinin C++ sistemlerle uyumlu olması sağlanmalıdır. Bu sayede, kullanıcı arayüzüne entegre edilen sistemler daha sorunsuz çalışır.

Martysama ve Diğer Geliştirici Kaynakları
Metin2 geliştirme sürecinde, Martysama gibi isimlerin sağladığı kaynaklar büyük destek sağlar. Özellikle py root ve uiscript düzenlemeleri için örnek sistemler sunar. Bu tür kaynaklardan yararlanmak, geliştiricilerin daha hızlı ve etkin çözümler üretmesini sağlar. Aynı zamanda, compile işlemleri sırasında karşılaşılan derleme hatalarını da gidermek için bu kaynaklar referans alınabilir.

Sonuç
Metin2 özel sunucularında C++ fixler uygulamak, hem oyunun kararlılığını artırır hem de oyuncuların daha keyifli bir deneyim yaşamasını sağlar. Bellek yönetimi, veritabanı bağlantıları, PvP sistemleri ve GUI entegrasyonu gibi konularda yapılan iyileştirmeler, uzun vadede sunucunun başarısını doğrudan etkiler. Bu bağlamda, geliştiricilerin güncel kalması ve toplulukla paylaşım yapması da oldukça faydalıdır.


[C++] Various Fixes

In the process of developing Metin2 private servers, resolving errors that occur in C++ based systems is highly critical. In this context, applying various fixes in [C++] helps the game server run more stably and allows players to enjoy a better PvP experience. In this article, we will discuss some common C++ based fixes frequently applied by developers on Metin2 private servers.

Common Errors on Game Servers
Among the most frequent errors encountered on Metin2 game servers are memory leaks, database connection errors, synchronization issues, and lags occurring within the game loop. Particularly in PvP-focused servers, these errors directly impact the gaming experience. Therefore, it's crucial for developers to implement C++ based solutions to address these issues.

Memory Leak Fixes
Memory leaks can cause the server to slow down over time and eventually crash. To prevent this, dynamically allocated memory areas must be correctly freed. For instance, if an object is allocated using the new keyword, a corresponding delete call must be made. Moreover, using smart pointer structures can also help reduce such errors.

Resolving Database Connection Errors
Connection breaks between DBCore and GameCore in Metin2 servers may lead to player data loss or corrupted matches. In such cases, a system design ensuring automatic reconnection upon disconnection is essential. The classes managing MySQL connections should include a reconnect mechanism when connection interruptions occur, making the system more resilient.

Bug Fixes in PvP Systems
PvP systems are among the most popular features in Metin2 private servers. However, there might occasionally be issues like monster spawn errors, score tracking problems, or deviations in item drop rates. In such cases, modifications need to be made in the relevant system files located under game/src. For example, if score errors occur during a PvP tournament, necessary checks in the score_manager.cpp file and data synchronization must be ensured.

Integration with Client SRC and Pack Files
To ensure changes made on the server side appear correctly on the client, compatibility with client/src and pack files is required. Especially during GUI and UI script modifications, it’s important to ensure Python scripts are compatible with C++ systems. This ensures that systems integrated into the user interface operate more smoothly.

Martysama and Other Developer Resources
During the Metin2 development process, resources provided by names like Martysama offer significant support. These resources provide example systems especially for py root and uiscript modifications. Utilizing such sources enables developers to create faster and more effective solutions. Additionally, these resources can serve as references for fixing compilation errors encountered during compile operations.

Conclusion
Implementing C++ fixes on Metin2 private servers enhances both the stability of the game and provides a more enjoyable experience for players. Improvements made regarding memory management, database connections, PvP systems, and GUI integration directly affect the long-term success of the server. In this regard, it is also highly beneficial for developers to stay updated and share with the community.
 

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

Benzer konular

Geri
Üst Alt