[C++] [FIX] Karakter Kayması ile İlgili Yapılabilecek Tüm Düzenlemeler

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

Admin

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

Video ve Ekran Görüntüsü paylaşımlarında karakter kayması ile ilgili düzenlemelerin bu sıra popülerleştiğini gördüm. Öncelikle bu durum ile ilgili 1-2 sene önce ortalama bir platformda konu açtım ve aşağıdaki video ile problemi belirttim.



Daha sonra konu üzerinden bir çok kullanıcı tartışma başlattılar ve aşağıdaki düzenlemeler ile sorun ortadan kalkmış oldu.


ActorInstanceSync.cpp içerisinde void CActorInstance::__Push(int x, int y)
Kod:
void CActorInstance::__Push(int x, int y) {     const D3DXVECTOR3& c_rv3Src=GetPosition();     const D3DXVECTOR3 c_v3Dst=D3DXVECTOR3(x, -y, c_rv3Src.z);     const D3DXVECTOR3 c_v3Delta=c_v3Dst-c_rv3Src;     const auto LoopValue = 100;     const D3DXVECTOR3 inc = c_v3Delta / LoopValue;     D3DXVECTOR3 v3Movement(0.0f, 0.0f, 0.0f);     IPhysicsWorld* pWorld = IPhysicsWorld::GetPhysicsWorld();     if (!pWorld)         return;     for (int i = 0; i < LoopValue; ++i)     {         if (pWorld->isPhysicalCollision(c_rv3Src + v3Movement))         {             ResetBlendingPosition();             return;         }         v3Movement += inc;     }     SetBlendingPosition(c_v3Dst);     if (IsResistFallen())         return;     if (!IsUsingSkill())     {         const int len = sqrt(c_v3Delta.x*c_v3Delta.x+c_v3Delta.y*c_v3Delta.y);         if (len > 150.0f)         {             InterceptOnceMotion(CRaceMotionData::NAME_DAMAGE_FLYING);             PushOnceMotion(CRaceMotionData::NAME_STAND_UP);         }     } }

ActorInstanceBattle.cpp CActorInstance::__ProcessDataAttackSuccess
Kod:
// VICTIM_COLLISION_TEST         const D3DXVECTOR3& kVictimPos = rVictim.GetPosition();         auto externalForceRatio = 1.0f;         if (rVictim.IsResistFallen())             externalForceRatio = 0.8f; // reduce external force almost like before         rVictim.m_PhysicsObject.IncreaseExternalForce(kVictimPos, c_rAttackData.fExternalForce * externalForceRatio);         // VICTIM_COLLISION_TEST_END


178345_9385278fa1c99050e3c6bbeada9bcbe2.png



Güncel hali :
C++ ile Metin2 özel sunucularında geliştirilen sistemlerde, karakter kayması gibi hatalar zaman zaman karşılaşılan ve oyuncu deneyimini ciddi şekilde etkileyebilecek sorunlardır. Bu makalede, karakter kayması ile ilgili yapılabilecek tüm düzenlemeleri detaylı olarak ele alacağız. Metin2 özel sunucu geliştirme sürecinde, hem client hem de server tarafında dikkat edilmesi gereken önemli konulara değinerek bu hatayı minimuma indirmeye çalışacağız.

Karakter Kayması Nedir?
Karakter kayması, oyuncunun karakterinin ekran üzerinde beklenmedik bir şekilde farklı bir konuma geçmesiyle oluşur. Bu durum, genellikle ağ gecikmeleri, senkronizasyon eksiklikleri veya kodsal hatalardan kaynaklanabilir. Özellikle PvP sistemlerinde, bu durum büyük avantaj ve dezavantajlar doğurabilir. Oyuncuların konumları doğru okunmadığında, saldırılar, bloklar veya hareketler hatalı sonuçlar verebilir.

Sunucu Tarafında Yapılacak Ayarlamalar
Game Server tarafında karakter konumlarının senkronize edilmesi oldukça kritiktir. C++ tabanlı game src dosyalarında bulunan movement fonksiyonları üzerinde değişiklikler yaparak, konum güncellemelerini daha sık ve doğru hale getirebilirsiniz. Örneğin, CMD_MOVE komutu ile gelen konum bilgileri, doğruluk açısından kontrol edilmelidir. Ayrıca, anti-cheat mekanizmaları da bu tür hataları engellemek adına optimize edilmelidir.

Client Tarafında Konum Senkronizasyonu
Client tarafında, karakterin konumu ile sunucuya gönderilen konum arasında fark varsa, bu da kaymaya neden olabilir. UIScript dosyalarında bulunan character sınıfı üzerinden konum güncellemeleri yapılırken, bu verilerin zamanlaması ve doğruluğu önemlidir. Python GUI üzerinden çalışan sistemlerde de benzer kontroller yapılmalıdır. Martysama gibi bilinen frameworklerde, bu tür güncellemeler için örnek yapılar mevcuttur.

Network Paketleri ve Gecikme Kontrolü
Karakter konum bilgileri, network üzerinden paketlenerek gönderilir. Eğer bu paketlerin gönderilme ve alınma süresi uzunsa, karakter kayması kaçınılmazdır. Auth ve game sunucuları arasındaki bağlantı süresi minimize edilmelidir. Paketlerin tekrar gönderilme (resend) mantığı da gözden geçirilmelidir. Metin2 Lobby gibi platformlarda, bu tür optimizasyonların yapıldığı sistemlerin daha kararlı çalıştığı görülmüştür.

Kaynak Kod Seviyesinde İnce Ayarlar
C++ seviyesinde, thread yönetimi, mutex kilitlemeleri ve callback yapıları karakter konum güncellemelerinde kritik rol oynar. Özellikle core yapılarında, db core ile uyumlu çalışan sistemlerde, konum verisi zamanında işlenmelidir. Source edit yaparken bu durumlar dikkate alınmalıdır.

Özet ve Tavsiyeler
Karakter kaymasının önüne geçmek için, Metin2 özel sunucularında hem server hem de client tarafında detaylı testler yapılmalı ve sistemsel optimizasyonlar yapılmalıdır. C++ bilgisi olan geliştiriciler, bu tür hataları_minimuma indirgemek için game server programming süreçlerini iyi anlamalıdır. Metin2dev ve metin2 development toplulukları da bu konuda birçok kaynak sunmaktadır.


C++ based systems developed for Metin2 private servers often encounter issues like character movement shift, which can significantly affect the player experience. In this article, we will examine all possible adjustments related to character shifting in detail. We will address important points on both client and server sides during Metin2 private server development, aiming to minimize such errors as much as possible.

What is Character Shift?
Character shift occurs when a player's character unexpectedly moves to a different position on screen. This issue generally stems from network delays, synchronization failures, or code-related bugs. Especially in PvP systems, this can cause major advantages or disadvantages. When players' positions are not read correctly, attacks, blocks, or movements may produce incorrect results.

Server-Side Adjustments
Synchronizing character positions on the Game Server side is critical. By modifying the movement functions located in game src files based on C++, you can make location updates more frequent and accurate. For instance, position data received via CMD_MOVE commands must be validated accurately. Additionally, anti-cheat mechanisms should also be optimized to prevent such errors.

Client-Side Position Synchronization
If there is a discrepancy between the character's position on the client and the position sent to the server, this too can cause shifts. While updating character positions through the character class found in UIScript files, timing and accuracy of these data are crucial. Similar checks should be made in systems running via Python GUI. Frameworks like Martysama offer example structures for such updates.

Network Packets and Latency Control
Character position data is transmitted over network as packets. If sending and receiving times for these packets are long, character shifting becomes inevitable. Connection time between auth and game servers must be minimized. The logic of resending packets should also be reviewed. On platforms like Metin2 Lobby, systems with such optimizations have shown more stable performance.

Fine-Tuning at Source Code Level
At the C++ level, thread management, mutex locking, and callback structures play a key role in character position updates. Especially within core structures, position data must be processed timely in systems compatible with db core. Such considerations must be taken into account while performing source edit.

Summary and Recommendations
To prevent character shifting, detailed testing and systematic optimizations must be carried out on both server and client[/BR] sides in Metin2 private servers. Developers familiar with C++ should thoroughly understand game server programming processes to minimize such errors. Communities like Metin2dev and metin2 development offer many resources on this topic.
 

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

Benzer konular

Geri
Üst Alt