Boss Becerisi Fix (Duvarın içine atma) {SKILL_FLAG_CRUSH | SKILL_FLAG_CRUSH_LONG}

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

Admin

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

Boss ile savaşırken, boss size SKILL_FLAG_CRUSH veya SKILL_FLAG_CRUSH_LONG olan bir beceriyle vurursa sizi duvarların içine atabileceği iğrenç bir hatadır.

Kod:
// char_skill.cpp // Arat:             if (IS_SET(m_pkSk->dwFlag, SKILL_FLAG_CRUSH | SKILL_FLAG_CRUSH_LONG) &&                 !IS_SET(pkChrVictim->GetAIFlag(), AIFLAG_NOMOVE))             {                 ...             } // Değiştir :             if (IS_SET(m_pkSk->dwFlag, SKILL_FLAG_CRUSH | SKILL_FLAG_CRUSH_LONG) &&                 !IS_SET(pkChrVictim->GetAIFlag(), AIFLAG_NOMOVE))             {                 float fCrushSlidingLength = 200;                 if (m_pkChr->IsNPC())                     fCrushSlidingLength = 400;                 if (IS_SET(m_pkSk->dwFlag, SKILL_FLAG_CRUSH_LONG))                     fCrushSlidingLength *= 2;                 float fx, fy;                 float degree = GetDegreeFromPositionXY(m_pkChr->GetX(), m_pkChr->GetY(), pkChrVictim->GetX(), pkChrVictim->GetY());                 if (m_pkSk->dwVnum == SKILL_HORSE_WILDATTACK)                 {                     degree -= m_pkChr->GetRotation();                     degree = fmod(degree, 360.0f) - 180.0f;                     if (degree > 0)                         degree = m_pkChr->GetRotation() + 90.0f;                     else                         degree = m_pkChr->GetRotation() - 90.0f;                 }                 GetDeltaByDegree(degree, fCrushSlidingLength, &fx, &fy);                                  long startX = (long)(pkChrVictim->GetX());                 long startY = (long)(pkChrVictim->GetY());                                  long endX = (long)(pkChrVictim->GetX() + fx);                 long endY = (long)(pkChrVictim->GetY() + fy);                 // Başlangıç ve bitiş noktası arasındaki tüm konumların hareketli olduğunu varsayıyoruz                 bool allPositionsMovable = true;                                  // Başlangıç ve bitiş noktaları arasındaki mesafeyi hesaplayın                 double distance = std::sqrt((endX - startX) * (endX - startX) + (endY - startY) * (endY - startY));                 // Her koordinat için adım boyutunu hesaplayın                 double stepX = (endX - startX) / distance;                 double stepY = (endY - startY) / distance;                 // Yörünge üzerindeki startX, startY ve endX, endY arasındaki tüm noktaların hareketli olup olmadığını kontrol edin                 for (double i = 0; i <= distance; ++i) {                     double currentX = startX + i * stepX;                     double currentY = startY + i * stepY;                     long roundedX = static_cast<long>(std::round(currentX));                     long roundedY = static_cast<long>(std::round(currentY));                     if (!SECTREE_MANAGER::instance().IsMovablePosition(pkChrVictim->GetMapIndex(), roundedX, roundedY)) {                         allPositionsMovable = false;                         break;                     }                 }                 if (allPositionsMovable)                 {                     sys_log(0, "CRUSH SUCCESS! %s -> %s (%d %d) -> (%d %d)", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), (long)(pkChrVictim->GetX()+fx), (long)(pkChrVictim->GetY()+fy));                                      pkChrVictim->Sync(endX, endY);                     pkChrVictim->Goto(endX, endY);                     pkChrVictim->CalculateMoveDuration();                 }                 else                 {                     sys_log(0, "CRUSH FAIL! %s -> %s (%d %d) -> (%d %d)", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), (long)(pkChrVictim->GetX()+fx), (long)(pkChrVictim->GetY()+fy));                    }                 if (m_pkChr->IsPC() && m_pkChr->m_SkillUseInfo[m_pkSk->dwVnum].GetMainTargetVID() == (DWORD) pkChrVictim->GetVID())                 {                     SkillAttackAffect(pkChrVictim, 1000, IMMUNE_STUN, m_pkSk->dwVnum, POINT_NONE, 0, AFF_STUN, 4, m_pkSk->szName);                 }                 else                 {                     if (allPositionsMovable)                         pkChrVictim->SyncPacket();                 }             }

Alıntıdır,
Ancak doğru alıntı...
Boss Becerisi Fix (Duvarın içine atma) {SKILL_FLAG_CRUSH | SKILL_FLAG_CRUSH_LONG}

Metin2 özel sunucularında oyun içi dengeleri korumak ve istenmeyen exploitlerin önüne geçmek oldukça kritiktir. Bu bağlamda, boss becerileri gibi güçlü yeteneklerin kontrolsüz çalışması sunucu deneyimini ciddi şekilde etkileyebilir. Özellikle SKILL_FLAG_CRUSH ve SKILL_FLAG_CRUSH_LONG bayraklarına sahip becerilerin, karakterlerin duvarların içine düşmesine veya harita sınırlarının dışına taşmasına neden olması, büyük problemler yaratabilir. Bu yazıda, bu tür becerilerin potansiyel risklerini ve nasıl düzeltilmesi gerektiğini ele alacağız.

Boss Becerilerinde Meydana Gelen Sorunlar
Metin2 özel sunucularda bazı boss karakterler, saldırıları sırasında oyuncuları harita dışına itebilir veya duvar içine gömebilir. Bu durum, özellikle PK (Player Kill) sunucularında büyük avantaj/diskalifikasyon sorunlarına yol açabilir. Oyuncular, beceriyle itildikten sonra harita dışı bölgelere düşerek oyun dışı kalabilir veya beklenmedik şekilde öldürülebilir. Bu tür olaylar, hem oyun deneyimini bozar hem de sunucu yöneticileri için büyük bir teknik problem teşkil eder.

SKILL_FLAG_CRUSH ve SKILL_FLAG_CRUSH_LONG Nedir?
Bu iki beceri bayrağı, Metin2 oyun motorunda fiziksel itme (crush) efektini tanımlamaktadır. SKILL_FLAG_CRUSH, normal boyutlu itme efektidir. SKILL_FLAG_CRUSH_LONG ise daha uzun menzilli ve güçlü bir itme sağlar. Bu bayraklar, genellikle boss karakterlerin özel saldırılarında kullanılır. Ancak, doğru şekilde sınırlanmadıklarında, oyuncuların harita sınırlarını aşmasına veya engellerin içine geçmesine sebep olabilirler.

Fix Uygulama Yöntemleri
Bu sorunu çözmek için öncelikle beceri sistemlerinde değişiklik yapılması gerekir. Bu değişiklikler genellikle C++ server kaynak kodlarında yapılır. Özellikle game/src/char_battle.cpp veya benzeri dosyalarda bu becerilerin işlendiği fonksiyonlar incelenmelidir. Burada crush becerilerinin koordinat kontrolü yapılmadan uygulanıp uygulanmadığı kontrol edilmelidir.

Koordinat Kontrolü Ekleme
Crush becerileri uygulanmadan önce, hedef konumun geçerli bir harita koordinatı olup olmadığı kontrol edilmelidir. Eğer hedef konum, duvarın içinde veya harita dışında ise, becerinin uygulanmaması sağlanmalıdır. Bu işlem, IsValidCoordinate veya benzeri bir fonksiyonla yapılabilir. Böylece, karakterler duvarların içine geçmeyecek ve harita sınırlarını aşmayacaktır.

Alternatif Çözüm: Itme Mesafesini Sınırlamak
Diğer bir yöntem ise itme mesafesini sınırlamaktır. Özellikle SKILL_FLAG_CRUSH_LONG için, maksimum itme mesafesi belirlenip bu değerden fazlası engellenebilir. Bu, becerilerin hâlâ işlevsel kalmasını sağlarken, harita sınırlarını aşmayı önleyecektir.

Python Tarafında GUI ile Kontrol
Sunucu tarafında C++ ile yapılan değişikliklere ek olarak, geliştiriciler beceri parametrelerini kontrol edebilecek bir Python GUI arayüzü oluşturabilir. Bu sayede, beceri bayrakları ve etkileri daha kolay takip edilebilir. Örneğin, Py Root[/COORD] kullanılarak bir beceri yönetim paneli oluşturulabilir. Böylece, sunucu yöneticileri, becerileri gerçek zamanlı olarak gözlemleyebilir ve gerekirse müdahale edebilir.

Sonuç
Metin2 özel sunucularında boss becerilerinin doğru şekilde işlev görmesi, oyun deneyimi açısından kritik öneme sahiptir. SKILL_FLAG_CRUSH ve SKILL_FLAG_CRUSH_LONG gibi bayraklar, güçlü efektler sunsa da, kontroller yapılmadığında istenmeyen durumlara yol açabilir. Bu nedenle, sunucu geliştiricilerinin bu becerileri dikkatli şekilde yönetmesi ve gerekli kontrolleri sağlaması büyük önem taşır. Bu fixler, sunucu güvenliğini artırırken, adil bir PvP ortamı oluşturur.


Boss Skill Fix (Pushing Into Wall) {SKILL_FLAG_CRUSH | SKILL_FLAG_CRUSH_LONG}

In Metin2 private servers, maintaining in-game balance and preventing unwanted exploits are crucial. In this context, powerful abilities like boss skills can seriously impact the gameplay experience if they malfunction. Especially skills flagged with SKILL_FLAG_CRUSH and SKILL_FLAG_CRUSH_LONG may cause characters to get pushed into walls or outside map boundaries. This article will address these potential risks and how to fix them.

Issues with Boss Skills
In Metin2 private servers, certain bosses can push players outside the map or embed them inside walls during attacks. This can lead to major advantage/disqualification issues, especially on PK (Player Kill) servers. Players might become stuck in unreachable areas after being pushed by a skill, causing unexpected deaths or disconnections. Such events not only disrupt gameplay but also pose significant technical challenges for server administrators.

What Are SKILL_FLAG_CRUSH and SKILL_FLAG_CRUSH_LONG?
These two skill flags define the physical knockback (crush) effect within the Metin2 game engine. SKILL_FLAG_CRUSH represents standard knockback, while SKILL_FLAG_CRUSH_LONG provides longer-range and more powerful knockback. These flags are typically used in boss character special attacks. However, without proper limitation, they can cause players to cross map boundaries or enter solid obstacles.

How to Apply Fixes
To resolve this issue, changes must first be made within the skill system. These changes are usually done in the C++ server source code. Specifically, functions where these skills are processed, such as game/src/char_battle.cpp, should be examined. Here, it's important to check whether coordinate validation is performed before applying crush effects.

Adding Coordinate Validation
Before applying crush skills, the target location must be checked to ensure it is a valid map coordinate. If the target is inside a wall or outside the map, the skill should not be applied. This can be achieved using a function like IsValidCoordinate. This way, characters will not pass through walls or exceed map boundaries.

Alternative Solution: Limiting Knockback Distance
Another approach is to limit the distance of knockbacks. For SKILL_FLAG_CRUSH_LONG specifically, a maximum knockback distance can be set and any value beyond that can be blocked. This ensures that skills remain functional while preventing map boundary violations.

GUI Control via Python
In addition to C++ server-side changes, developers can create a Python-based GUI to control skill parameters. This allows skill flags and their effects to be monitored more easily. For example, a skill management panel can be built using Py Root. Thus, server administrators can observe skills in real-time and intervene when necessary.

Conclusion
Proper functioning of boss skills in Metin2 private servers is critical for gameplay quality. While flags like SKILL_FLAG_CRUSH and SKILL_FLAG_CRUSH_LONG provide strong effects, they can cause unintended issues if not properly controlled. Therefore, server developers must manage these skills carefully and implement necessary validations. These fixes enhance server security and create a fair PvP environment.
 

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

Geri
Üst Alt