Saldıır ve ahreket hızını server taraflı engelleyelim.

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
aslında oyunda bunun syseri veriyordu fakat oyundan çıkar gibi bi kdo yoktu yapay zeka yardımıyla güncellendi.

neden syser oalrak düzenlemişler çünkü durudk yere oyundan atıyor hilesiz oyuncuları.

örneğin a oyuncusu b oyuncusuna saldırınca b oyuncusu kordinat değişiyor.
hile algılıyor.

yapay zekaya böyle sorunca saldırı sırasında oluyor atakla ilgili bi sıkıntı var dedi

sornasıdna atak fonskiyonunu güncelelyince çözüldü

artık server taraflı hareket ve saldırı hızı hilesi tespit yapan kodumuz var
beceriksiz yımıri





char.cpp

Kod:
bool CHARACTER::Sync(long x, long y) {     if (!GetSectree())         return false;     LPSECTREE new_tree = SECTREE_MANAGER::instance().Get(GetMapIndex(), x, y);     if (!new_tree)     {         if (GetDesc())         {             sys_err("cannot find tree at %d %d (name: %s)", x, y, GetName());             // @fixme313 BEGIN             new_tree = GetSectree();             x = GetX();             y = GetY();             if (!new_tree)             {                 GetDesc()->SetPhase(PHASE_CLOSE);                 sys_err("cannot find old tree at %d %d (name: %s)", x, y, GetName());             }             // @fixme313 END         }         else         {             sys_err("no tree: %s %d %d %d", GetName(), x, y, GetMapIndex());             Dead();         }         return false;     }     SetRotationToXY(x, y);     SetXYZ(x, y, 0);     if (GetDungeon())     {         int iLastEventAttr = m_iEventAttr;         m_iEventAttr = new_tree->GetEventAttribute(x, y);         if (m_iEventAttr != iLastEventAttr)         {             if (GetParty())             {                 quest::CQuestManager::instance().AttrOut(GetParty()->GetLeaderPID(), this, iLastEventAttr);                 quest::CQuestManager::instance().AttrIn(GetParty()->GetLeaderPID(), this, m_iEventAttr);             }             else             {                 quest::CQuestManager::instance().AttrOut(GetPlayerID(), this, iLastEventAttr);                 quest::CQuestManager::instance().AttrIn(GetPlayerID(), this, m_iEventAttr);             }         }     } //duzenlenen yer if (GetSectree() != new_tree) {     if (!IsNPC())     {         SECTREEID id = new_tree->GetID();         SECTREEID old_id = GetSectree()->GetID();         // Mevcut ve onceki pozisyon arasİndaki mesafeyi hesapla         const float fDist = DISTANCE_SQRT(id.coord.x - old_id.coord.x, id.coord.y - old_id.coord.y);         // Zaman farkİnİ kontrol et         static DWORD lastMoveTime = get_global_time();         DWORD currentMoveTime = get_global_time();         DWORD timeDiff = currentMoveTime - lastMoveTime;         // Hİz hesaplama         float speed = (timeDiff > 0) ? (fDist / (timeDiff / 1000.0f)) : 0.0f; // m/s cinsinden         // Oyuncu hİzİnİ al ve kar?İla?tİr         const float playerSpeed = GetLimitPoint(POINT_MOV_SPEED);         const float maxAllowableSpeed = playerSpeed * 1.5f; // Bir tolerans ekliyoruz if (speed > maxAllowableSpeed) {     // Loglama: Detaylı bilgi verir     sys_log(0,             "POTANSİYEL HİLE ALGILANDI: %s | SECTREE FARKI: %dx%d -> %dx%d | MESAFE: %.1fm | HIZ: %.2fm/s (İZİN VERİLEN: %.2fm/s)",             GetName(),             id.coord.x, id.coord.y,             old_id.coord.x, old_id.coord.y,             fDist, speed, maxAllowableSpeed);     // Hız sınırı ihlali yapan karakter için ceza     LPCHARACTER ch = static_cast<LPCHARACTER>(this);     if (ch)     {         // Oyuncuya bilgilendirme mesajı         ch->ChatPacket(CHAT_TYPE_INFO,                        "Hız sınırını aştığınız tespit edildi! Lütfen oyun istemcisi dışında müdahale yapmayın.");         // Eğer oyuncunun bağlantısı varsa         if (GetDesc())         {             // 2-7 saniye arasında rastgele bir gecikmeyle bağlantıyı kes             int delay = number(2, 7);             GetDesc()->DelayedDisconnect(delay);             sys_log(0,                     "HİLEYE BAĞLANTI KESİLDİ: %s (İsim: %s, Saniye: %d)",                     GetName(), ch->GetName(), delay);             // Hile log kaydı ekleniyor             LogManager::instance().HackLog("SpeedHack", this);         }     } }         // Zaman ve konumu guncelle         lastMoveTime = currentMoveTime;     } //duzenlenen yer     new_tree->InsertEntity(this); }

yımırin
beceremediğniide yapay zeka becerdi


update şimdilik stabil


Kod:
bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType) {     if (test_server)         sys_log(0, "[TEST_SERVER] Attack : %s type %d, MobBattleType %d", GetName(), bType, !GetMobBattleType() ? 0 : GetMobAttackRange());     if (!CanMove())         return false;     // CASTLE     if (IS_CASTLE_MAP(GetMapIndex()) && false == castle_can_attack(this, pkVictim))         return false;     // CASTLE     // Savaşta saldırılabilirlik kontrolü     if (!battle_is_attackable(this, pkVictim))         return false;     // Duel veya GM kontrolü     if (CPVPManager::instance().IsFighting(this) == false && CPVPManager::instance().IsFighting(pkVictim) == true)         return false;     if (IsPC() && pkVictim->IsGM())         return false;     DWORD dwCurrentTime = get_dword_time();     if (IsPC())     {         // Hız hilesi kontrolü         if (IS_SPEED_HACK(this, pkVictim, dwCurrentTime))             return false;         // Yetenek kullanımı arasındaki süre kontrolü         if (bType == 0 && dwCurrentTime < GetSkipComboAttackByTime())             return false;         // Yumrukla saldırı engelleme         if (!GetWear(WEAR_WEAPON))             return false;     }     else     {         MonsterChat(MONSTER_CHAT_ATTACK);     }     pkVictim->SetSyncOwner(this);     if (pkVictim->CanBeginFight())         pkVictim->BeginFight(this);     int iRet;     // Saldırı türüne göre işlem yapılır     if (bType == 0)     {         switch (GetMobBattleType())         {             case BATTLE_TYPE_MELEE:             case BATTLE_TYPE_POWER:             case BATTLE_TYPE_TANKER:             case BATTLE_TYPE_SUPER_POWER:             case BATTLE_TYPE_SUPER_TANKER:                 iRet = battle_melee_attack(this, pkVictim);                 break;             case BATTLE_TYPE_RANGE:                 FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);                 iRet = Shoot(0) ? BATTLE_DAMAGE : BATTLE_NONE;                 break;             case BATTLE_TYPE_MAGIC:                 FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);                 iRet = Shoot(1) ? BATTLE_DAMAGE : BATTLE_NONE;                 break;             default:                 sys_err("Unhandled battle type %d", GetMobBattleType());                 iRet = BATTLE_NONE;                 break;         }     }     else     {         if (IsPC() == true)         {             if (dwCurrentTime - m_dwLastSkillTime > 1500)             {                 sys_log(1, "HACK: Too long skill using term. Name(%s) PID(%u) delta(%u)",                         GetName(), GetPlayerID(), (dwCurrentTime - m_dwLastSkillTime));                 return false;             }         }         sys_log(1, "Attack call ComputeSkill %d %s", bType, pkVictim?pkVictim->GetName():"");         iRet = ComputeSkill(bType, pkVictim);     }     if (iRet == BATTLE_DAMAGE || iRet == BATTLE_DEAD)     {         OnMove(true);         pkVictim->OnMove();         // Yalnızca PC, düşmanı null yapar. NPC için, durum makinesi bunu sıfırlar.         if (BATTLE_DEAD == iRet && IsPC())             SetVictim(NULL);         // **Sectree Güncellemesi**         if (GetX() != pkVictim->GetX() || GetY() != pkVictim->GetY())  // Koordinatlar değiştiyse         {             // Oyuncu veya hedef, sektördeki yeni yerini alacak.             LPSECTREE newSectree = pkVictim->GetSectree();             if (newSectree)             {                 newSectree->InsertEntity(pkVictim);                 sys_log(0, "Sektör güncellendi: (%f, %f) -> (%f, %f)", pkVictim->GetX(), pkVictim->GetY(), GetX(), GetY());             }         }         return true;     }     return false; }
hareket hızını hile yapmıyım saldırı hızını hile yaapyım onuda tespit edip diconnet veriyor
Saldırı ve Hareket Hızını Sunucu Tarafında Engelleme

Metin2 özel sunucularında performans ve oyun dengesi açısından önemli olan konulardan birisi de saldırı ve hareket hızlarının[/BR] sunucu tarafında kontrol edilmesidir. Bu kontrol, hem hile kullanımını engeller hem de adil bir PvP ortamı sağlar. Bu yazıda, C++ tabanlı game server üzerinde nasıl saldırı ve hareket hızları kontrol edileceği anlatılacaktır.

Sunucu Tarafı Kontrol Nedir?

Sunucu tarafı kontrol, oyun istemcisinin (client) gönderdiği verilerin, sunucu tarafından doğrulanması ve kabul edilip edilmeyeceğine karar verilmesidir. Bu sayede, client-side olarak değiştirilen değerlerin oyun içinde etkisi olmaz. Özellikle PvP sunucularında bu kontrol önemlidir çünkü bazı kullanıcılar hile programları kullanarak hareket ya da saldırı hızlarını artırabilirler.

Hareket Hızı Sınırlandırması

Metin2 sunucusunda bir karakterin hareket hızı, genellikle motion veya movement tabanlı sistemlerle yönetilir. Bu hızı kontrol etmek için, game/src/char_movement.cpp gibi dosyalarda gerekli kontroller yapılmalıdır. Örneğin, bir oyuncunun belli bir sürede belli bir mesafe kat edebilmesi gibi sınırlamalar getirilebilir.

Sunucu tarafında bu işlem için timestamp mantığı kullanılabilir. Oyuncudan gelen move paketleri, önceki paketle karşılaştırılır. Eğer belirlenen süre içinde fazla mesafe kat edildiyse, hile yapıldığı varsayılır ve paket reddedilir.

Saldırı Hızı Sınırlandırması

Saldırı hızı kontrolü de benzer şekilde yapılır. Bir karakterin attack komutları belirli aralıklarla sunucuya gönderilir. Bu aralıklar ölçülerek, hile ile hızlandırılmış saldırı tespit edilebilir. Bunun için game/src/char_attack.cpp dosyasında gerekli kontrol mekanizmaları kurulabilir.

Örneğin, bir karakterin belli bir bekleme süresinden daha kısa aralıklarla saldırı yapması engellenir. Bu süreye cooldown süresi denir ve her sınıf için farklı olabilir. Bu sürenin kontrolü sunucu tarafında sağlanmalıdır.

Python Script ile Kontrol

Eğer PyRoot veya UIScript gibi Python tabanlı sistemler kullanıyorsanız, bu kontrolleri server side üzerinden de yapabilirsiniz. Ancak temel kontrol mekanizmaları yine de C++ kısmında olmalıdır. Python tarafı destekleyici rollerde kullanılabilir.

Sonuç

Sunucu tarafında hareket ve saldırı hızının kontrolü, Metin2 özel sunucularında güvenlik ve oyun dengesi açısından kritik öneme sahiptir. Bu kontrol mekanizmaları, C++ seviyesinde yazılmalı ve timestamp, cooldown, packet validation gibi teknik yöntemlerle sağlanmalıdır. Bu sayede adil bir PvP ortamı oluşturulabilir ve hile kullanımı en aza indirgenebilir.


Blocking Attack and Movement Speed Server-Side

In Metin2 private servers, one of the important topics regarding performance and game balance is controlling attack and movement speeds on the server-side. This control prevents cheating and ensures a fair PvP environment. In this article, we will explain how to control attack and movement speeds on a C++-based game server.

What is Server-Side Control?

Server-side control refers to validating the data sent by the game client (client) on the server and deciding whether to accept it. This way, values modified on the client-side have no effect in-game. This is especially important on PvP servers since some users can use cheat programs to increase their movement or attack speed.

Movement Speed Limitation

In Metin2 servers, a character's movement speed is usually managed through motion or movement-based systems. To control this speed, necessary validations must be made in files like game/src/char_movement.cpp. For example, a player can be limited to moving only a certain distance within a specific time interval.

For this process, timestamp logic can be used on the server-side. The move packets sent by the player are compared with previous packets. If too much distance is covered within the allowed time, cheating is assumed and the packet is rejected.

Attack Speed Limitation

Attack speed control works similarly. A character's attack commands are sent to the server at specific intervals. These intervals are measured to detect attacks accelerated by cheats. Necessary control mechanisms can be set up in game/src/char_attack.cpp.

For example, attacks performed by a character at intervals shorter than a specific waiting time can be blocked. This time is called the cooldown period and may vary for each class. Such controls must be handled on the server-side.

Control via Python Script

If you are using Python-based systems such as PyRoot or UIScript, you can also perform these checks from the server side. However, the main control mechanisms should still be implemented in the C++ part. Python can serve a supporting role.

Conclusion

Controlling movement and attack speeds on the server-side is critical for security and game balance in Metin2 private servers. These control mechanisms should be written at the C++ level and implemented using technical methods like timestamp, cooldown, and packet validation. This way, a fair PvP environment can be created and cheating usage can be minimized.
 

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

Benzer konular

Geri
Üst Alt