Mai jos vei afla cum sa faci un NPC (sau orice mob) sa atace alt mob sau un jucator.
Functiile sunt deja bagate in sursa oricarui serverfiles, deoarece ymir a vrut sa faca ceva cu acestea - dar s-a razgandit eventual (evident
Cum functioneaza sistemul gandit de ymir?
- Acestia voiau sa puna gardieni in mapele de la regate ca sa "apere regatul".
- De exemplu, daca erai in Regatul Albastru si puneai un NPC Gardian (11004) sau / Administratorul Luptelor (11005), iar un jucator din Regatul Galben venea in regatul tau, acesta era omorat instant de acesti NPC. (One hit kill)
De aceea avem 3 variante de gardieni pentru fiecare regat, cu alt cod.
Va las varianta originala unde NPC va omori instant jucatorul/mob-ul
Si o varianta cu damage setat de voi.
Puteti modifica singuri sa ia DMG-ul din mob_proto.
*Poze / Video:
![[C++] Tutorial NPC ataca alt mob/player - Mesaj 1 - Imagine 1 [C++] Tutorial NPC ataca alt mob/player - Mesaj 1 - Imagine 1](https://i.imgur.com/MktHerN.gif)
Ca sa adaugam un mob care sa atace mergem in char.cpp si cautam:Inainte de toate mergeti la npc/mob in mob_proto.txt si scoateti flag-ul NOMOVE!
bool CHARACTER::IsGuardNPC() const
{
return IsNPC() && (GetRaceNum() == 11000 || GetRaceNum() == 11001 || GetRaceNum() == 11002 || GetRaceNum() == 11003 || GetRaceNum() == 11004 || GetRaceNum() == 11005);
}Nota! Aici adaugam in lista mobii/npc care vrei sa atace alti mobi/playeri.
Dupa care mergem in char_state.cpp si cautam:
void CHARACTER::__StateIdle_NPC()Acum cautam:
else if (IsGuardNPC())
{
if (!quest::CQuestManager::instance().GetEventFlag("noguard"))
{
FuncFindGuardVictim f(this, 50000);
if (GetSectree())
GetSectree()->ForEachAround(f);
LPCHARACTER victim = f.GetVictim();
if (victim)
{
m_dwStateDuration = passes_per_sec/2;
if (CanBeginFight())
BeginFight(victim);
}
}
}Daca vrem ca NPC/Mob sa atace alti mobi, cautam in char_state.cpp:
if (pkChr->IsPC() && pkChr->GetEmpire() != m_pkChr->GetEmpire())Va jucati cu functia asta si o modificati dupa bunul plac.. puteti folosi argumente specifice precum:si multe altele - aici tine de imaginatia voastra!Code:(GetRaceNum() == cod mob aici
Acum cauta si comenteaza ca mai jos:
Daca vrem ca damage-ul sa nu fie 100% (insta kill) mergem in char_battle.cpp si cautam:
else if (pAttacker->IsGuardNPC())
{
SET_BIT (m_pointsInstant.instant_flag, INSTANT_FLAG_NO_REWARD);
Stun();
return true;
}Asa setam 10k atacu la acesti NPC/Mobi.
Putet modifica sa citeasca dmg din mob_proto.txt, adaptati voi


la acest mesaj și conținutul se va afișa automat.



