Jump to content

Attacking Pets System


Recommended Posts

M2 Download Center

This is the hidden content, please
( Internal )

I'm releasing self-tipped Source-Code extension for attacking Pets 😃

Preview:

 
 
In Scope Square - the hottest P-Server project that will ever start -
the whole thing is of course 1000x better, fixed with possible bugs, and a gui,
with which the pet can then essentially control where the target of the
Can choose pets himself, and can also launch skills of the pet 😃
 
you open "PetSystem.h" and insert under "void unmount();"
bool Attack(LPCHARACTER pkVictim = NULL);
Should then look like this:
Spoiler

223348ss-2015-02-26-at-10.33.30-.png

Same file, looks for:

CPetActor * GetByVnum(DWORD vnum) const;

and inserts below:

void LaunchAttack(LPCHARACTER pkVictim = NULL);
Should then look like this:
Spoiler

223348fce8dd05ac.png.4fb8e99014283638cd6

you open "PetSystem.cpp" and:

searches for
bool CPetActor::Update(DWORD deltaTime)

Replace complete function with:

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;
}
Same file, looks for the function:
void CPetActor::ClearBuff()

Adds the following func AFTER this function (not IN the function):

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;
}
should then look like this:
Spoiler

223348a0b99abacf.png.1988b5ee5dbe08b3742

You are looking for the function:

bool CPetSystem::Update(DWORD deltaTime)

and ABOVE inserts the following function:

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);
}
}
should then look like this:
Spoiler

223348b5ab31cc31.png.efafa0e663ccd2896b5

and last but not least - open the file:

"char_battle.cpp", looks for the function:
bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)

and adds under the following content:

// only pc sets victim null. For npc, state machine will reset this.
if (BATTLE_DEAD == iRet && IsPC())
SetVictim(NULL);
This one:
if (BATTLE_DEAD != iRet && IsPC())
{
if (m_petSystem && m_petSystem->CountSummoned() > 0)
m_petSystem->LaunchAttack(pkVictim);
}
Should then look like this:
Spoiler

22334890c9d5797d.png.1ab8130fab96238d9dd

So 😃 that would increase the biceps buttock opening by - for my part - 2 meters.

 
#Edt: So that the pets can also die:
Opens the pvp.cpp, searches for
bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim)

and inserts:

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

2233488a379645c3.png.6ac540a818120a8826a

Enjoy!

  • Metin2 Dev 13
  • Confused 1
  • Good 5
  • Love 26
Link to comment
Share on other sites

  • Premium

Corrected tabulation, code, include and english How-To :D


 

[HowTo]
 
Search in petsystem.h "void unmount();" and add this under :
bool            Attack(LPCHARACTER pkVictim = NULL);

It's look like this :

57e1f1668b.png
 
Then search "CPetActor* GetByVnum(DWORD vnum) const;"
and add this under :
void        LaunchAttack(LPCHARACTER pkVictim = NULL);

 

It's look like this :

 
fce8dd05ac.png
 
-> Save and then open PetSystem.cpp:
 
Search the "bool CPetActor::Update(DWORD deltaTime)" function

And replace it with this :

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

    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;
}
 
Search the "void CPetActor::ClearBuff()" function
 
And add this function under :
 
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;
}

It will look like this:

 
a0b99abacf.png
 
Search "bool CPetSystem::Update(DWORD deltaTime)"
 
And add this above:
 
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);
    }
}

 
It will look like this:
 
b5ab31cc31.png
 
Save and open "char_battle.cpp" :
 
Add a the begining :
 
#include "PetSystem.h"
 
Then search this function :
 
"bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)"
 
And especially this part:
 
        // only pc sets victim null. For npc, state machine will reset this.
        if (BATTLE_DEAD == iRet && IsPC())
            SetVictim(NULL);
 
Add this under:
 
        if (BATTLE_DEAD != iRet && IsPC())
        {
            if (m_petSystem && m_petSystem->CountSummoned() > 0)
                m_petSystem->LaunchAttack(pkVictim);
        }
 
It will look like this:
 
90c9d5797d.png
 
Save and open "pvp.cpp"
 

Then search this function : "bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim)"

 
And add this under :
 
    if (pkChr->IsPet() && pkVictim->IsMonster())
    {
        return true;
    }
 
    if (pkChr->IsMonster() && pkVictim->IsPet())
    {
        return true;
    }
 
Like this:
8a379645c3.png

 

Recompile, and done :D

Edited by Metin2 Dev
Core X - External 2 Internal
  • Good 1
  • Love 6
Link to comment
Share on other sites

  • Premium

Corrected tabulation and english How-To :D

 

[HowTo]
 
Search in petsystem.h "void unmount();" and add this under :
bool            Attack(LPCHARACTER pkVictim = NULL);

It's look like this :

57e1f1668b.png
 
Then search "CPetActor* GetByVnum(DWORD vnum) const;"
and add this under :
void        LaunchAttack(LPCHARACTER pkVictim = NULL);

 

It's look like this :

 
fce8dd05ac.png
 
-> Save and then open PetSystem.cpp:
 
Search the "bool CPetActor::Update(DWORD deltaTime)" function

And replace it with this :

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

    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;
}
 
Search the "void CPetActor::ClearBuff()" function
 
And add this function under :
 
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;
}

It will look like this:

 
a0b99abacf.png
 
Search "bool CPetSystem::Update(DWORD deltaTime)"
 
And add this above:
 
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);
    }
}

 
It will look like this:
 
b5ab31cc31.png
 
Save and open "char_battle.cpp" :
 
Then search this function :
 
"bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)"
 
And especially this part:
 
        // only pc sets victim null. For npc, state machine will reset this.
        if (BATTLE_DEAD == iRet && IsPC())
            SetVictim(NULL);
 
Add this under:
 
        if (BATTLE_DEAD != iRet && IsPC())
        {
            if (m_petSystem && m_petSystem->CountSummoned() > 0)
                m_petSystem->LaunchAttack(pkVictim);
        }
 
It will look like this:
 
90c9d5797d.png
 
Save and open "pvp.cpp"
 

Then search this function : "bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim)"

 
And add this under :
 
    if (pkChr->IsPet() && pkVictim->IsMonster())
    {
        return true;
    }
 
    if (pkChr->IsMonster() && pkVictim->IsPet())
    {
        return true;
    }
 
Like this:
8a379645c3.png

 

Recompile, and done :D

 

bfGh.png

Edited by Metin2 Dev
Core X - External 2 Internal
Link to comment
Share on other sites

 

Corrected tabulation and english How-To :D

 

[HowTo]
 
Search in petsystem.h "void unmount();" and add this under :
bool            Attack(LPCHARACTER pkVictim = NULL);

It's look like this :

57e1f1668b.png
 
Then search "CPetActor* GetByVnum(DWORD vnum) const;"
and add this under :
void        LaunchAttack(LPCHARACTER pkVictim = NULL);

 

It's look like this :

 
fce8dd05ac.png
 
-> Save and then open PetSystem.cpp:
 
Search the "bool CPetActor::Update(DWORD deltaTime)" function

And replace it with this :

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

    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;
}
 
Search the "void CPetActor::ClearBuff()" function
 
And add this function under :
 
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;
}

It will look like this:

 
a0b99abacf.png
 
Search "bool CPetSystem::Update(DWORD deltaTime)"
 
And add this above:
 
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);
    }
}

 
It will look like this:
 
b5ab31cc31.png
 
Save and open "char_battle.cpp" :
 
Then search this function :
 
"bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)"
 
And especially this part:
 
        // only pc sets victim null. For npc, state machine will reset this.
        if (BATTLE_DEAD == iRet && IsPC())
            SetVictim(NULL);
 
Add this under:
 
        if (BATTLE_DEAD != iRet && IsPC())
        {
            if (m_petSystem && m_petSystem->CountSummoned() > 0)
                m_petSystem->LaunchAttack(pkVictim);
        }
 
It will look like this:
 
90c9d5797d.png
 
Save and open "pvp.cpp"
 

Then search this function : "bool CPVPManager::CanAttack(LPCHARACTER pkChr, LPCHARACTER pkVictim)"

 
And add this under :
 
    if (pkChr->IsPet() && pkVictim->IsMonster())
    {
        return true;
    }
 
    if (pkChr->IsMonster() && pkVictim->IsPet())
    {
        return true;
    }
 
Like this:
8a379645c3.png

 

Recompile, and done :D

 

bfGh.png

 

char_battle.cpp add to Includes: #include "PetSystem.h", should work =)

Edited by Metin2 Dev
Core X - External 2 Internal
  • Love 1
Link to comment
Share on other sites

It's all good, I don't know, upload your whole file in pastebin, i'll correct for you.

http://pastebin.com/hCCQE23C

You've lost your bracket here

 

            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());
Link to comment
Share on other sites

Announcements



×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.