Neler yeni

Foruma hoş geldin, Ziyaretçi

Metin2Lobby.com Metin2 Private Server Tanıtım Advertising Ve Geliştirme Forumudur.Metin2 pvp serverler,1-99,1-105,1-120,55-120 global serverları paylaş yada ara.
Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Server taraflı hareket hızı kontrol

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Konular
48,291
Mesajlar
48,601
Tepkime puanı
75
M2 Yaşı
3 yıl 11 ay 10 gün
Trophy Puan
48
Konum
Web sitesi
M2 Yang
488,879
Ticaret : 1 / 0 / 0
Ticaret Oranı : 100%
Kod:
bool CHARACTER::CheckInstantSpeedHack(long x, long y) {     // GM'leri kontrol etme     if (IsGM())         return true;        // Ölü veya savaşta olmayan karakterleri kontrol et     if (IsDead() || IsStun())         return true;        DWORD dwCurrentTime = get_dword_time();        // Hareket geçmişini güncelle (son 10 hareket)     m_qMovementHistory.push(std::make_pair(dwCurrentTime, std::make_pair(x, y)));        // Sadece son 10 hareketi tut     while (m_qMovementHistory.size() > 10)         m_qMovementHistory.pop();        // En az 2 hareket kaydı yoksa kontrol yapma     if (m_qMovementHistory.size() < 2)         return true;        // Son 2 hareketi al     auto last1 = m_qMovementHistory.back();     auto last2 = m_qMovementHistory.front(); // ikinci son hareket        // Zaman farkını hesapla     DWORD dwDeltaTime = last1.first - last2.first;        // Minimum zaman (10ms'den az ise hack olabilir)     if (dwDeltaTime < 10)     {         m_iSpeedHackCount += 3;         sys_err("INSTANT_SPEED_HACK: %s - Extremely fast movement packets (%dms)",                GetName(), dwDeltaTime);         return false;     }        // Mesafe hesaplama     long dx = last1.second.first - last2.second.first;     long dy = last1.second.second - last2.second.second;     double fDistance = sqrt(static_cast<double>(dx*dx + dy*dy));        // Çok kısa mesafe kontrolü     if (fDistance < 10.0)         return true;        // Anlık hız hesaplama     double fSpeed = fDistance / (dwDeltaTime / 1000.0);        // WS durumunda daha yüksek hız limiti     float fMaxSpeed = GetMoveSpeed();     if (IsInWarState())         fMaxSpeed *= 1.5f; // WS'de %50 daha hızlı     else         fMaxSpeed *= 1.2f; // Normalde %20 tolerans              // Eğer hız limitini aşarsa     if (fSpeed > fMaxSpeed)     {         m_iSpeedHackCount++;         m_iConsecutiveSpeedViolations++;                sys_err("INSTANT_SPEED_HACK: %s - Speed: %.2f > Max: %.2f, Distance: %.2f, Time: %dms",                GetName(), fSpeed, fMaxSpeed, fDistance, dwDeltaTime);                // Ardışık 3 ihlal varsa hile kabul et         if (m_iConsecutiveSpeedViolations >= 3)         {             LogManager::instance().HackLog("Instant_SpeedHack", this);             return false;         }                return true; // İlk ihlallerde affet     }     else     {         // Normal hızda ise ardışık ihlal sayacını sıfırla         if (m_iConsecutiveSpeedViolations > 0)             m_iConsecutiveSpeedViolations--;     }        return true; } void CHARACTER::ResetSpeedHack() {     m_dwLastMoveCheckTime = 0;     m_lLastMoveCheckX = 0;     m_lLastMoveCheckY = 0;     m_iSpeedHackCount = 0; } bool CHARACTER::__CheckSpeedHackFrequency() {     DWORD dwCurrentTime = get_dword_time();        if (m_dwLastMoveCheckTime == 0)     {         m_dwLastMoveCheckTime = dwCurrentTime;         return true;     }        DWORD dwDeltaTime = dwCurrentTime - m_dwLastMoveCheckTime;        // 50ms'den daha sık hareket paketi kontrolu     if (dwDeltaTime < 50)     {         m_iSpeedHackCount++;                // 5 kez ardı?ık hızlı paket tespiti         if (m_iSpeedHackCount > 5)         {             sys_err("SPEED_HACK_FREQUENCY: %s (PID: %d) - Too frequent movement packets (%dms interval)",                    GetName(), GetPlayerID(), dwDeltaTime);             return false;         }     }     else     {         // Normal aralıkta ise sayacı sıfırla         if (m_iSpeedHackCount > 0)             m_iSpeedHackCount--;     }        return true; } bool CHARACTER::__CheckSpeedHackDistance(long x, long y) {     DWORD dwCurrentTime = get_dword_time();        if (m_dwLastMoveCheckTime == 0 || m_lLastMoveCheckX == 0 || m_lLastMoveCheckY == 0)     {         m_dwLastMoveCheckTime = dwCurrentTime;         m_lLastMoveCheckX = x;         m_lLastMoveCheckY = y;         return true;     }        DWORD dwDeltaTime = dwCurrentTime - m_dwLastMoveCheckTime;        // Minimum zaman kontrolu (50ms'den az ise gecerli de?il)     if (dwDeltaTime < 50)         return true;        // Mesafe hesaplama     long dx = x - m_lLastMoveCheckX;     long dy = y - m_lLastMoveCheckY;     double fDistance = sqrt(static_cast<double>(dx*dx + dy*dy));        // Zamanı saniyeye cevir     double fTimeInSec = dwDeltaTime / 1000.0;        // Hız hesaplama (birim/saniye)     double fSpeed = fDistance / fTimeInSec;        // Maksimum izin verilen hız (karakterin mevcut move_speed de?eri + %20 tolerans)     float fMaxSpeed = GetMoveSpeed() * 1.2f;        // E?er hız limitini a?arsa     if (fSpeed > fMaxSpeed)     {         m_iSpeedHackCount += 2; // Mesafe hack'i daha ciddi                sys_err("SPEED_HACK_DISTANCE: %s (PID: %d) - Speed: %.2f > Max: %.2f, Distance: %.2f, Time: %dms",                GetName(), GetPlayerID(), fSpeed, fMaxSpeed, fDistance, dwDeltaTime);                // 3 kez mesafe hack'i tespiti         if (m_iSpeedHackCount > 3)         {             return false;         }     }     else     {         // Normal hızda ise sayacı azalt         if (m_iSpeedHackCount > 0)             m_iSpeedHackCount--;     }        return true; } bool CHARACTER::CheckSpeedHack(long x, long y) {     // GM'leri kontrol etme     if (IsGM())         return true;        // Olu veya sava?ta olmayan karakterleri kontrol et     if (IsDead())         return true;        // Frekans kontrolu     if (!__CheckSpeedHackFrequency())         return false;        // Mesafe kontrolu     if (!__CheckSpeedHackDistance(x, y))         return false;        // Zaman ve pozisyonu guncelle     m_dwLastMoveCheckTime = get_dword_time();     m_lLastMoveCheckX = x;     m_lLastMoveCheckY = y;        return true; } bool CHARACTER::Move(long x, long y) {        // Hareket hızı anti-cheat kontrolu     if (!CheckSpeedHack(x, y))     {         sys_err("SPEED_HACK_BLOCKED: %s (PID: %d) - Movement blocked due to speed hack detection",                GetName(), GetPlayerID());                // Hile tespit edildi?inde karakteri sync et         Sync(x, y);                // Gerekirse ceza uygula (orne?in: 10 saniye donma)         if (m_iSpeedHackCount > 10)         {             AddAffect(AFFECT_SPEED_HACK_PENALTY, APPLY_NONE, 0, AFF_STUN, 10, 0, true);             ChatPacket(CHAT_TYPE_INFO, "Speed hack detected! You have been frozen for 10 seconds.");         }                return false;     }        if (GetX() == x && GetY() == y)         return true;     if (test_server)         if (m_bDetailLog)             sys_log(0, "%s position %u %u", GetName(), x, y);     OnMove();     return Sync(x, y); }

günün sözleri

  • <li data-xf-list-type="ul">"En büyük hakikat, imandır. İmandan sonra en büyük hakikat namazdır." – İmanı hayatın merkezine alan bir yaklaşım. <li data-xf-list-type="ul">"Kâinatı bize tanıttıran, Kendini bize sevdiren, Kur'an'dır." – Evren kitabı (kâinat) ile vahiy kitabı (Kur'an) arasındaki uyuma dikkat çeker. <li data-xf-list-type="ul">"Her şey Allah'ı gösteriyor, her şey Allah'ı bildiriyor, her şey Allah'a şehadet ediyor." – Onun tevhid anlayışının özü. <li data-xf-list-type="ul">"Marifetullah (Allah'ı tanımak), en büyük saadettir. Şükür ise, o saadetin anahtarıdır."

Server Taraflı Hareket Hızı Kontrolü Nedir?
Metin2 özel sunucularında performans ve dengeli oyun deneyimi sunabilmek adına bazı mekanizmalar geliştirilmelidir. Bunlardan birisi de server taraflı hareket hızı kontrol sistemidir. Bu sistem sayesinde oyuncuların istenmeyen yollarla hareket hızlarını artırmaları engellenir. Bu da hem adil oyun ortamı sağlar hem de sunucu tarafında oluşabilecek senkronizasyon sorunlarını önler.

Neden Server Taraflı Kontrol Gereklidir?
Metin2 özel sunucularında bazı oyuncular, modifiye edilmiş clientler veya hile programları aracılığıyla kendi karakterlerinin hareket hızını artırmaya çalışabilir. Bu durum, oyun içi dengeleri bozar ve diğer oyunculara karşı adaletsiz bir üstünlük sağlayabilir. Bu nedenle sunucu tarafında hareket hızı kontrol mekanizması kurmak büyük önem taşır. Bu kontrol sayesinde, her oyuncunun belirlenen standart hız limiti dahilinde hareket etmesi sağlanır.

Hareket Hızı Kontrolü Nasıl Gerçekleştirilir?
Sunucu tarafında hareket hızı kontrolü genellikle C++ ile yazılmış game server kaynak kodları üzerinde yapılır. Her oyuncudan gelen konum ve yön bilgileri, belirli zaman aralıklarında kontrol edilerek, izin verilen maksimum hızın üzerine çıkılıp çıkılmadığı analiz edilir. Eğer bir oyuncunun hareketi izin verilen hızın çok üzerindeyse, bu oyuncuya uyarı gönderilir ya da sunucudan atılır.

Teknik Uygulama Detayları
C++ tabanlı Metin2 sunucu kaynak kodlarında, oyuncu hareketleri genellikle CHARACTER_MANAGER::Update gibi fonksiyonlar üzerinden takip edilir. Bu fonksiyonlar sayesinde karakterin konumu, yönü ve hızı hesaplanabilir. Burada önemli olan, her hareket paketi geldiğinde zaman damgasının da kontrol edilmesidir. Böylece, kısa sürede çok fazla mesafe kat eden karakterler tespit edilebilir. Bu işlem sırasında Python tabanlı GUI sistemlerle loglama yapılarak, şüpheli durumlar kolayca analiz edilebilir.

Olası Riskler ve Çözümler
Server taraflı kontrol mekanizması kurulurken dikkat edilmesi gereken bazı durumlar vardır. Örneğin, ping değerleri yüksek olan oyuncuların normal hareketlerinde bile hız limitine takılması mümkündür. Bu yüzden ping bazlı toleranslar tanımlanmalıdır. Ayrıca, bazı itemlerin veya buff'ların karakterin hızını artırdığı durumlar göz önünde bulundurularak, bu etkiler dinamik olarak hesaplanmalıdır. Bu gibi durumlarda, db_core üzerinden karakterin mevcut buff listesi kontrol edilerek, gerçek hız değeri hesaplanabilir.

Sonuç
Server taraflı hareket hızı kontrol sistemi, Metin2 özel sunucularında adil bir oyun ortamı sağlamak için kritik öneme sahiptir. Doğru uygulandığında, hile kullanımı engellenir, oyun içi denge korunur ve sunucu güvenliği artırılır. Geliştiriciler bu sistemi C++ ve Python destekli kaynak kodlar üzerinden entegre ederek, hem stabil hem de güvenli bir oyun ortamı sağlayabilirler.


What Is Server-Side Movement Speed Control?
In Metin2 private servers, certain mechanisms must be developed to ensure performance and balanced gameplay. One such mechanism is server-side movement speed control. This system prevents players from increasing their character's movement speed through unauthorized means. It ensures both fair play and prevents potential synchronization issues on the server side.

Why Is Server-Side Control Necessary?
In Metin2 private servers, some players may attempt to increase their character's movement speed by using modified clients or cheating programs. Such behavior disrupts in-game balance and grants unfair advantages over other players. Therefore, implementing a movement speed control mechanism on the server side is highly important. This ensures that all players move within the defined standard speed limits.

How Is Movement Speed Control Implemented?
Server-side movement speed control is typically implemented within the C++ based game server source code. Position and direction data sent by each player are periodically checked to determine if they exceed the allowed maximum speed. If a player's movement exceeds the permitted threshold, warnings can be issued or the player may be disconnected from the server.

Technical Implementation Details
In C++ based Metin2 server source codes, player movements are generally tracked through functions like CHARACTER_MANAGER::Update. These functions allow calculation of the character’s position, direction, and speed. An important aspect here is to check the timestamp with every movement packet received. This allows detection of characters covering excessive distances in short periods. During this process, logging via Python-based GUI systems can help analyze suspicious cases easily.

Potential Risks and Solutions
Certain precautions must be taken when implementing server-side control mechanisms. For instance, players with high ping values might trigger speed limits even during normal movement. Therefore, ping-based tolerance thresholds should be defined. Additionally, situations where certain items or buffs increase character speed must be considered, and these effects should be calculated dynamically. In such cases, the character's active buff list can be checked via db_core to calculate the actual speed value.

Conclusion
Server-side movement speed control is critical for ensuring fair gameplay in Metin2 private servers. When properly implemented, it prevents cheating, maintains in-game balance, and enhances server security. Developers can integrate this system using C++ and Python supported source codes to provide both stable and secure gaming environments.
 

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kaydol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Üye ol
Giriş Yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş Yap

Tema düzenleyici

Tema özelletirmeleri