- 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
- M2 Yang
- 488,879
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.
