Fethi Polat 1
Fethi Polat
Mt2Hizmet 1
Mt2Hizmet
Sevdamsın 1
Sevdamsın
Nedved35 1
Nedved35
Bvural41 1
Bvural41
-TuRKuaZ- 1
-TuRKuaZ-
farkmt2official 1
farkmt2official
Hikaye Ekle

[C++] Source Pet Atak Sistemi

  • Konuyu başlatan Konuyu başlatan DevSheen
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 37
  • Görüntüleme Görüntüleme 11K
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Petsystem.h Açılır ve aratılır

Kod:
void            Unmount();

Altına Eklenir
Kod:
bool Attack(LPCHARACTER pkVictim = NULL);

Tekrar Aratılır
Kod:
CPetActor*    GetByVnum(DWORD vnum) const;

Altına Eklenir

Kod:
void LaunchAttack(LPCHARACTER pkVictim = NULL);

Petsystem.h ile işimiz bitti Şimdi PetSystem.cpp Açalım Ve Aratalım.

Kod:
bool CPetActor::Update(DWORD deltaTime)

Kod:
bool CPetActor::Update(DWORD deltaTime)
{
    bool bResult = true;

    // Æê ÁÖÀÎÀÌ Á×¾ú°Å³ª, ¼ÒȯµÈ ÆêÀÇ »óŰ¡ ÀÌ»óÇÏ´Ù¸é ÆêÀ» ¾ø¾Ú. (NOTE: °¡²û°¡´Ù ÀÌ·± Àú·± ÀÌÀ¯·Î ¼ÒȯµÈ ÆêÀÌ DEAD »óÅ¿¡ ºüÁö´Â °æ¿ì°¡ ÀÖÀ½-_-;)
    // ÆêÀ» ¼ÒȯÇÑ ¾ÆÀÌÅÛÀÌ ¾ø°Å³ª, ³»°¡ °¡Áø »óŰ¡ ¾Æ´Ï¶ó¸é ÆêÀ» ¾ø¾Ú.
    if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) 
        || NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())
        || ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner()
        )
    {
        this->Unsummon();
        return true;
    }

    if (this->IsSummoned() && HasOption(EPetOption_Followable))
        bResult = bResult && this->_UpdateFollowAI();

    return bResult;
}

Yukarıdaki Satırı Komple Aşağıdaki Gibi Değiştirin.

Kod:
bool CPetActor::Update(DWORD deltaTime)
{
bool bResult = false;
  
//  Æê ÁÖÀÎÀÌ Á×¾ú°Å³ª, ¼ÒȯµÈ ÆêÀÇ »óŰ¡ ÀÌ»óÇÏ´Ù¸é ÆêÀ» ¾ø¾Ú. (NOTE:  °¡²û°¡´Ù ÀÌ·± Àú·± ÀÌÀ¯·Î ¼ÒȯµÈ ÆêÀÌ DEAD »óÅ¿¡ ºüÁö´Â °æ¿ì°¡  ÀÖÀ½-_-;)
// ÆêÀ» ¼ÒȯÇÑ ¾ÆÀÌÅÛÀÌ ¾ø°Å³ª, ³»°¡ °¡Áø »óŰ¡ ¾Æ´Ï¶ó¸é ÆêÀ» ¾ø¾Ú.
if (m_pkOwner->IsDead() || (IsSummoned() && m_pkChar->IsDead()) 
|| NULL == ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())
|| ITEM_MANAGER::instance().FindByVID(this->GetSummonItemVID())->GetOwner() != this->GetOwner()
)
{
this->Unsummon();
return true;
}
if (this->GetCharacter()->GetVictim())
{
bResult = this->Attack();
}
  
if (!bResult)
{
if (this->IsSummoned() && HasOption(EPetOption_Followable))
bResult = this->_UpdateFollowAI();
}
  
return bResult;
}

Şimdi Tekrar Aratalım
Kod:
void CPetActor::ClearBuff()

Kod:
void CPetActor::ClearBuff()
{
    if (NULL == m_pkOwner)
        return ;
    TItemTable* item_proto = ITEM_MANAGER::instance().GetTable(m_dwSummonItemVnum);
    if (NULL == item_proto)
        return;
    for (int i = 0; i < ITEM_APPLY_MAX_NUM; i++)
    {
        if (item_proto->aApplies[i].bType == APPLY_NONE)
            continue;
        m_pkOwner->ApplyPoint(item_proto->aApplies[i].bType, -item_proto->aApplies[i].lValue);
    }

    return ;
}

Altına Eklenir.

Kod:
bool CPetActor::Attack(LPCHARACTER pkVictim)
{
if (pkVictim)
{
if (!pkVictim->IsMonster() || pkVictim->IsDead())
return false;
  
if (m_pkChar->GetVictim())
return false;
}
else
{
  
pkVictim = m_pkChar->GetVictim();
  
if (!pkVictim)
return false;
}
  
m_pkChar->SetVictim(pkVictim);
  
const PIXEL_POSITION& rkPetPos = m_pkChar->GetXYZ();
const PIXEL_POSITION& rkVictimPos = pkVictim->GetXYZ();
  
int iDistance = DISTANCE_APPROX(rkPetPos.x - rkVictimPos.x, rkPetPos.y - rkVictimPos.y);
  
if (iDistance >= m_pkChar->GetMobAttackRange())
{
m_pkChar->Follow(pkVictim, m_pkChar->GetMobAttackRange());
}
else
{
if (get_dword_time() - m_pkChar->GetLastAttackTime() >= 3000)
{
if (m_pkChar->Attack(pkVictim))
{
m_pkChar->SendMovePacket(FUNC_ATTACK, 0, rkPetPos.x, rkPetPos.y, 0, get_dword_time());
m_pkChar->SetLastAttacked(get_dword_time());
}
  
}
}
  
return true;
}

Aratalım

Kod:
bool CPetSystem::Update(DWORD deltaTime)

Üstüne Ekleyelim

Kod:
void CPetSystem::LaunchAttack(LPCHARACTER pkVictim)
{
if (!pkVictim)
return;
  
for (itertype(m_petActorMap) it = m_petActorMap.begin(); it != m_petActorMap.end(); ++it)
{
CPetActor* pkPetActor = it->second;
if (pkPetActor->IsSummoned())
pkPetActor->Attack(pkVictim);
}
}
PetSystem.cpp İle İşimiz Bitti Şimdi char_battle.cpp açalım

En Başına Ekleyelim

Kod:
#include "PetSystem.h"

Sonra Aratalım:
Kod:
if (BATTLE_DEAD == iRet && IsPC())
SetVictim(NULL);

Altına Eklenir

Kod:
if (BATTLE_DEAD != iRet && IsPC())
{
if (m_petSystem && m_petSystem->CountSummoned() > 0)
m_petSystem->LaunchAttack(pkVictim);
}

Şimdi char_battle.cpp ile işimiz bitti pvp.cpp açalım ve aratalım

Kod:
bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim)

Altına Eklenir:

Kod:
if (pkChr->IsPet() && pkVictim->IsMonster())
{
return true;
}
  
if (pkChr->IsMonster() && pkVictim->IsPet())
{
return true;
}

Ve Pet Atak Sistemini Eklemiş Oluyoruz 1 Teşekkür Yeterlidir. İyi Forumlar.
 
Son düzenleme:

En Çok Reaksiyon Alan Mesajlar

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst