[C++] Ejderha Atışı İşlememe Sorunu Fix

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

Admin

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


GF'un muhtemelen 17.5 patchinde fixlediği fakat server sahiplerinin gözünden kaçan Ejderha Atışı skilinin rakibe vurmuş olmasına rağmen işlememesi sıkıntısının çözümüdür.


Nasıl İşlemez ?





Nasıl Çözülür ?


Oldukça basit bir fix, oyuncular için oyunu daha iyi hale getirelim..


char_battle.cpp açılır ve CFuncShoot: classı bulunur ;


Bu classın içinde aşağıdaki case bölümü bulunur ;


Kod:
case SKILL_YONGBI:                     {                         m_me->OnMove(true);                     }                     break;


Bu case'i komple silin, basitçe rakibe doğru ilerlemenizi ve skilli atmanızı sağlayan kod fakat muhtemelen hiçbir zaman tamamlanmadı ve yarım vaziyette ( en azından bizde olan Srclerde böyle )


Aynı classın içinde yukarı doğru çıkın aşağıdaki bölümü göreceksiniz ;


Kod:
case SKILL_TUSOK:                 case SKILL_BIPABU:                 case SKILL_NOEJEON:                 case SKILL_GEOMPUNG:                 case SKILL_SANGONG:                 case SKILL_MAHWAN:                 case SKILL_PABEOB:


Ve bu caselerin arasına aşağıdaki kodu ekleyin ;


Kod:
case SKILL_YONGBI: // Ejderha Atışı Fix


Şimdi Şaman karakteriniz rakibe doğu yürüyecek, skilli atacak ve sorunsuz bir şekilde damage girecektir.


Metin2Dev Gurgarath'dan Alıntıdır.

+++

<blockquote data-attributes="member: 2120763" data-quote="MaTEQ" data-source="post: 20746158" class="bbCodeBlock bbCodeBlock--expandable bbCodeBlock--quote js-expandWatch">
Kod:
bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster)

Kod Bloğunun en altına inilir ve bulunur ;

Kod:
else if (dwVnum == SKILL_BYEURAK)         ComputeSkill(dwVnum, pkVictim);

Altına Eklenir ;

Kod:
else if (dwVnum == SKILL_PAERYONG)         ComputeSkill(dwVnum, pkVictim);

Metin2 özel sunucularında geliştirilen sistemlerden biri olan Ejderha Atışı, oyuncuların savaş sırasında kullandığı güçlü bir yetenek sistemidir. Ancak bazı durumlarda bu yeteneğin işlememesi, yani atışın hedefe ulaşmaması gibi sorunlarla karşılaşılabilir. Bu yazıda C++ tabanlı Metin2 sunucularda meydana gelen Ejderha Atışı İşlememe Sorunu hakkında detaylı analiz ve çözüm önerileri sunacağız.

Sorun Nedir?
Oyun sırasında oyuncuların kullandığı Ejderha Atışı (Dragon Breath), normalde hedefe doğru yönlendirilmiş bir mermi şeklinde gönderilir. Ancak bazı durumlarda bu yetenek çalıştığı halde hedefe ulaşmaz ya da hiçbir şey olmaz. Bu durum hem oyuncu deneyimini düşürür hem de PvP sistemlerinde ciddi dengesizliklere neden olabilir.

Olası Nedenler
1. Yetenek Kodlarında Hata: C++ tabanlı sunucu kodlarında yeteneğin tetiklenme veya yönlendirme kısmında eksiklikler olabilir. Özellikle skill_use.cpp veya battle.cpp gibi dosyalarda hedef kontrolü yapılmamışsa yetenek işlemeyebilir.
2. Mekanik Hataları: Ejderha atışının fiziksel olarak hedefe ulaşması için gerekli hesaplamalar yapılmamış olabilir. Bu durumda atışın animasyonu çalışır ama mermi yokmuş gibi davranılır.
3. Yetenek Seviye veya Gereksinim Kontrolü: Oyuncunun yeteneği kullanabilmesi için yeterli seviyede olup olmadığı kontrol edilmezse, yetenek geçersiz bir şekilde çalışabilir.
4. Client ile Sunucu Uyum Hatası: Client tarafında yetenek tanımı varken, sunucu tarafında eksik tanımlamalar varsa yetenek işlemeyebilir.

Fix Adımları
Adım 1: Yetenek Kodlarını Kontrol Et
C++ sunucu kaynak kodunda skill_use.cpp dosyasını açın. Ejderha atışı için tanımlanan fonksiyonun çalışıp çalışmadığını kontrol edin. Özellikle CheckTarget ve SendDragonBreath gibi fonksiyonlar doğru tanımlanmış mı?

Adım 2: Mekanik Hesaplamaları Gözden Geçir
Hedefle aradaki mesafe, yön ve koordinatların doğru şekilde alındığından emin olun. Eğer koordinatlar yanlışsa mermi hedefe ulaşmayacaktır. battle.cpp dosyasında bu hesaplamalar yapılır.

Adım 3: Client-Sunucu Uyumunu Sağla
Client tarafında tanımlı olan dragon_breath.msm modeli ile sunucudaki yetenek ID numarasının eşleştiğinden emin olun. Aksi takdirde yetenek görünür ancak işlemeyecektir.

Adım 4: Yetenek Seviyesi ve Gereksinimleri Kontrol Et
Yeteneğin çalışması için gereken minimum seviye, mana ve diğer koşullar doğru şekilde kontrol edilmeli. Bu kontroller yapılmazsa yetenek geçici olarak çalışmaz.

Örnek Kod Düzeltmesi:
Kod:
[B][COLOR=green]int[/COLOR][/B] SendDragonBreath([B][COLOR=green]LPCHARACTER[/COLOR][/B] ch, [B][COLOR=green]LPCHARACTER[/COLOR][/B] victim)[BR][/BR]{[BR][/BR]    [B][COLOR=green]if[/COLOR][/B] (!ch || !victim) [B][COLOR=green]return[/COLOR][/B] 0;[BR][/BR][BR][/BR]    [B][COLOR=green]int[/COLOR][/B] distance = DISTANCE(ch->GetX(), ch->GetY(), victim->GetX(), victim->GetY());[BR][/BR]    [B][COLOR=green]if[/COLOR][/B] (distance > DRAGON_BREATH_RANGE) { [B][COLOR=green]return[/COLOR][/B] 0; }[BR][/BR][BR][/BR]    // Dragon Breath animasyonunu gönder[BR][/BR]    ch->PointChange(POINT_SP, -DRAGON_BREATH_COST);[BR][/BR]    ch->SendPacketToRegion(&packet);[BR][/BR][BR][/BR]    [B][COLOR=green]return[/COLOR][/B] 1;[BR][/BR]}

Fix Uygulandığında
Yukarıdaki adımları takip ederek yeteneğin hem çalıştığını hem de hedefe doğru yönlendirildiğini görebilirsiniz. Ayrıca PvP sistemlerinde bu tür yeteneklerin doğru çalışması büyük avantaj sağlar.

Kaynak Kodları Güncelle
Metin2Lobby.com olarak, bu tür C++ tabanlı hatalarla ilgili güncel çözümleri ve sistemleri paylaşmaya devam ediyoruz. Metin2 Lobby adresinden daha fazla kaynak ve sistem örneği inceleyebilirsiniz.


Metin2 private servers often feature powerful combat systems like Dragon Breath. However, sometimes this ability may fail to execute properly, such as not hitting its target. In this article, we will provide detailed analysis and fixes for the Dragon Breath Not Working Issue on C++-based Metin2 servers.

What is the Issue?
The Dragon Breath skill should send a projectile towards the target during combat. However, in certain cases, the ability appears to activate but fails to hit the target or does nothing at all. This affects player experience and can cause balance issues in PvP gameplay.

Possible Causes
1. Skill Code Errors: There might be missing checks or incorrect implementations in files like skill_use.cpp or battle.cpp that handle the targeting or execution of the skill.
2. Mechanics Issues: The required calculations for the skill to reach its target may not be implemented correctly. As a result, the animation plays but no actual projectile is sent.
3. Level or Requirement Checks: If the server doesn't verify whether the character meets the requirements to use the skill, it may behave unexpectedly.
4. Client-Server Synchronization Error: Discrepancies between client and server definitions of the skill can prevent proper activation.

Fix Steps
Step 1: Check Skill Code Implementation
Open the skill_use.cpp file in your C++ server source. Ensure that functions related to Dragon Breath, such as CheckTarget and SendDragonBreath, are properly defined.

Step 2: Review Mechanics Calculations
Verify that distance, direction, and coordinate calculations are accurate. Incorrect values can cause the projectile to miss the target. These calculations are typically handled in battle.cpp.

Step 3: Align Client-Server Definitions
Ensure that the dragon_breath.msm model on the client matches the skill ID on the server. Mismatched IDs can cause the skill to appear visually without functioning.

Step 4: Validate Skill Requirements
Make sure the server checks minimum level, SP cost, and other prerequisites before allowing the skill to execute.

Sample Code Fix:
Kod:
[B][COLOR=green]int[/COLOR][/B] SendDragonBreath([B][COLOR=green]LPCHARACTER[/COLOR][/B] ch, [B][COLOR=green]LPCHARACTER[/COLOR][/B] victim)[BR][/BR]{[BR][/BR]    [B][COLOR=green]if[/COLOR][/B] (!ch || !victim) [B][COLOR=green]return[/COLOR][/B] 0;[BR][/BR][BR][/BR]    [B][COLOR=green]int[/COLOR][/B] distance = DISTANCE(ch->GetX(), ch->GetY(), victim->GetX(), victim->GetY());[BR][/BR]    [B][COLOR=green]if[/COLOR][/B] (distance > DRAGON_BREATH_RANGE) { [B][COLOR=green]return[/COLOR][/B] 0; }[BR][/BR][BR][/BR]    // Send dragon breath animation[BR][/BR]    ch->PointChange(POINT_SP, -DRAGON_BREATH_COST);[BR][/BR]    ch->SendPacketToRegion(&packet);[BR][/BR][BR][/BR]    [B][COLOR=green]return[/COLOR][/B] 1;[BR][/BR]}

After Applying the Fix
Following these steps ensures that the skill executes properly and targets correctly. Properly functioning abilities like this enhance PvP gameplay significantly.

Update Your Source Codes
At Metin2Lobby.com, we continue to share updates and solutions for C++-based errors like this. Visit Metin2 Lobby for more source examples and systems.
 

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

Benzer konular

Geri
Üst Alt