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
yımırin
beceremediğniide yapay zeka becerdi
update şimdilik stabil
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.
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; }
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.
