Sosyal açıldı! Bir göz at → Hemen gir →

KAYNAK KOD PK BOTLARININ ÖLÜM ANİMASYONU YOKSA YAPILABİLECEKLER HK.

Slepperx

KY Uzman Üye
KAYIT
2 Eki 2025
Mesajlar
143
Çözümler
1
Tepki puanı
103
Konum
Macedonia

@Deafsoft Sezer'in paylaştığı source üzerinde denenmiştir. << ISTIRAP ALT YAPISI​

? Sorunun Kaynağı: Yanlış Paket ve Yanlış Zamanlama​

Botların ölüm efektinin görünmemesinin iki ana nedeni vardır:
Yanlış Paket Tipi: Sunucu, bir Bot öldüğünde yanlışlıkla bir Oyuncu öldüğünde gönderilmesi gereken paketi (WIZ_DEAD) gönderiyor. İstemcinin doğru animasyonu göstermesi için NPC Ölüm Paketi (WIZ_NPC_FALL) gönderilmelidir.
  1. Yanlış Çağrı Zamanlaması: Animasyon paketi gönderme komutu, botun durumu zaten "ölü" (BOT_DEAD) olarak işaretlendikten sonra çalışıyor. Bu yüzden istemci, paketi görmezden geliyor.
Bu sorunları çözmek için 4 adım atacağız.

?️ Çözüm Adımları (Kod Düzeltmeleri)​

Adım 1: Yeni NPC Ölüm Opcode'unu Tanımlama​

Öncelikle, botlar için kullanacağımız yeni pakete bir isim ve benzersiz bir numara (opcode) atamalıyız. WIZ_NPC_FALL genellikle 54'tür, ancak bu numara başka bir paketle (WIZ_CONCURRENTUSER) çakışabileceği için, güvenli ve boş bir numara seçiyoruz: 254.

Yapılacak Yer: Define.h veya paket opcode'larının tanımlandığı başlık dosyanız.
Kod:
// Opcode çakışmasını önlemek için benzersiz bir numara atıyoruz.
#define WIZ_NPC_FALL 254

Adım 2: Bot Sınıfında Animasyon Metodunu Geçersiz Kılma (Override)​

Bot sınıfı (CBot), temel sınıf olan Unit'ten yanlış paketi gönderen SendDeathAnimation metodunu miras alır. Bu metodu CBot sınıfında yeniden tanımlamamız gerektiğini belirtmeliyiz.

Yapılacak Yer: CBot.h başlık dosyası.
Kod:
// CBot.h (public metotlar arasına ekleyin)

class CBot : public Unit
{
public:
    // Bu tanım, Unit sınıfındaki metodu geçersiz kılacağımızı belirtir.
    virtual void SendDeathAnimation(Unit* pKiller = nullptr);
    
    // ... diğer metotlar ...
};

Adım 3: Doğru NPC Ölüm Paketini Uygulama​

Şimdi, Adım 2'de tanımladığımız metot için doğru paket gönderim kodunu yazıyoruz.

Yapılacak Yer: CBot.cpp uygulama dosyası.
Kod:
// CBot.cpp dosyası içine, diğer metotların arasına ekleyin:

void CBot::SendDeathAnimation(Unit* pKiller /*= nullptr*/)
{
    // Doğru paket olan WIZ_NPC_FALL'u (254) kullanıyoruz.
    Packet result(WIZ_NPC_FALL);
    
    // Botun ID'sini pakete ekle
    result << GetID();
    
    // Çevredeki kullanıcılara göndererek animasyonu tetikle
    SendToRegion(&result);
}

Adım 4: Çağrı Zamanlamasını Düzeltme (Kritik)​

Paketin doğru zamanda, yani bot henüz "ölü" olarak işaretlenmeden hemen önce gönderildiğinden emin olmalıyız.

Yapılacak Yer: CBot.cpp dosyasındaki CBot::OnDeath metodu.

Kod:
void CBot::OnDeath(Unit* pKiller)
{
    if (m_bResHpType == USER_DEAD)
        return;

    // 1. Önce botu ölü olarak işaretle
    m_bResHpType = USER_DEAD;
    m_BotState = BOT_DEAD;
    isReset(false);

    // 2. Şimdi animasyonu gönder (client artık botun öldüğünü bilir)
    SendDeathAnimation(pKiller);

    // 3. Ölüm efekti aktifse uygula
    if (g_pMain->UserDeathEffect)
        ShowEffect(492027); // oyuncu ölme efekti

    // 4. Katili işle
    if (pKiller != nullptr)
    {
        if (pKiller->isPlayer())
        {
            CUser* pUserKiller = TO_USER(pKiller);
            if (pUserKiller != nullptr)
                OnDeathKilledPlayer(pUserKiller);
        }
        else if (pKiller->isNPC())
        {
            CNpc* pNpcKiller = TO_NPC(pKiller);
            if (pNpcKiller != nullptr)
                OnDeathKilledNpc(pNpcKiller);
        }
        else if (pKiller->isBot())
        {
            CBot* pBotKiller = TO_BOT(pKiller);
            if (pBotKiller != nullptr)
                OnDeathKilledBot(pBotKiller);
        }
        else
        {
            printf("OnDeath warning\n");
            TRACE("OnDeath warning\n");
        }
    }

    // 5. Ölüm sonrası sıfırlama işlemleri
    InitOnDeath(pKiller);
}

######### BU KISIM DA DEGISSE IYI OLUR #########
void CBot::SendDeathAnimation(Unit* pKiller /*= nullptr*/)
{
    // Bölge kontrolü: güvenlik önlemi
    if (GetRegion() == nullptr)
        return;

    // 254: WIZ_NPC_FALL - ölüm animasyonu paketi
    Packet result(WIZ_NPC_FALL);

    // Botun ID'si
    result << GetID();

    // Kimin öldürdüğü bilgisi (isteğe bağlı)
    if (pKiller != nullptr)
        result << uint16(pKiller->GetID());
    else
        result << uint16(0);

    // Bölgedeki tüm oyunculara gönder
    SendToRegion(&result);
}


NOT; ALDIĞIM TESTLERE GÖRE %10-15 ARASI BOT ANİMASYONA GİRMEDEN ÖLÜYOR ONU DAHA ÇÖZEMEDİM ÇÖZEBİLEN VARSA O KODLARI KULLANALIM
 

Mstk59

KY Saygın Üye
Coder
Yardımsever
Server Sahibi
KAYIT
12 May 2021
Mesajlar
483
Çözümler
9
Tepki puanı
520
Yaş
32
verdiğiniz tüm bilgilerin hepsi gereksiz ve dolaylı

void CBot::OnDeath(Unit* pKiller)

içerisine


if (m_bResHpType == USER_DEAD)
return;
m_bResHpType = USER_DEAD;
m_BotState = BOT_DEAD;

kısmının hemen altına

if (isDead())
SendDeathAnimation();

eklemeniz yeterli olacaktır, artık botlar öldüğü zaman direk animasyona girecektir.

DİPNOT: animasyonun tamamen tamamlanması için botlara respawn süresi eklemelisiniz min. 6 saniye şeklinde.
 

Slepperx

KY Uzman Üye
KAYIT
2 Eki 2025
Mesajlar
143
Çözümler
1
Tepki puanı
103
Konum
Macedonia
verdiğiniz tüm bilgilerin hepsi gereksiz ve dolaylı

void CBot::OnDeath(Unit* pKiller)

içerisine


if (m_bResHpType == USER_DEAD)
return;
m_bResHpType = USER_DEAD;
m_BotState = BOT_DEAD;

kısmının hemen altına

if (isDead())
SendDeathAnimation();

eklemeniz yeterli olacaktır, artık botlar öldüğü zaman direk animasyona girecektir.

DİPNOT: animasyonun tamamen tamamlanması için botlara respawn süresi eklemelisiniz min. 6 saniye şeklinde.
teşekkürler hocam,
Gereksiz demeyelim de, ben dolaylı yoldan öğreniyorum diyelim. çalıştığını görünce de paylaşıyorum.
Respawn süresini uzatma kısmını paylaşırsanız onun için saatler harcamayalım
 
Anasayfa Kayıt ol Giriş yap
Üst Alt