- Mesaj
- 42
- Çözümler
- 1
- Beğeni
- 23
- Puan
- 664
- Ticaret Puanı
- 0
Merhaba,
Geçtiğimiz gün bu şekilde bir npc yapma arayışım olmuştu fakat npc olarak bulamamıştım. Kodları araştırmam sonucu guardNPC diye bir özellik ekli olduğunu gördüm bu npc yakındaki mobları görünce onlara saldırıp öldürüyordu. Bende bu yapıyı kendi istediğim yapıya dönüştürdüm.
GuardNPC olan npcler kendi krallığından olmayan oyunculara saldırıp anında öldürüyor. Aşağıda nasıl yapabileceğiniz paylaşıyorum.
Geçtiğimiz gün bu şekilde bir npc yapma arayışım olmuştu fakat npc olarak bulamamıştım. Kodları araştırmam sonucu guardNPC diye bir özellik ekli olduğunu gördüm bu npc yakındaki mobları görünce onlara saldırıp öldürüyordu. Bende bu yapıyı kendi istediğim yapıya dönüştürdüm.
GuardNPC olan npcler kendi krallığından olmayan oyunculara saldırıp anında öldürüyor. Aşağıda nasıl yapabileceğiniz paylaşıyorum.
char.cpp:
bool CHARACTER::IsGuardNPC() const
{
return IsNPC() && (GetRaceNum() == 11000 || GetRaceNum() == 11001 || GetRaceNum() == 11002 || GetRaceNum() == 11003 || GetRaceNum() == 11004 || GetRaceNum() == 11005);
}
//GetRaceNum() == xxxx --> xxx alanı npc vnum'udur. İstediğiniz kadar npcyi || ile ayırıp ekleyebilirsiniz.
char_state.cpp:
void CHARACTER::__StateIdle_NPC() üstüne ekle.
class FuncGuardFindVictim
{
public:
FuncGuardFindVictim(LPCHARACTER pkChr) :
m_pkChr(pkChr),
m_pkVictim(nullptr),
m_iMaxDistance(pkChr->GetMobAttackRange())
{}
void operator()(LPENTITY ent)
{
if (!ent->IsType(ENTITY_CHARACTER))
return;
LPCHARACTER pkChr = static_cast<LPCHARACTER>(ent);
if (pkChr->IsPC() && pkChr->GetEmpire() != m_pkChr->GetEmpire())
{
int iDistance = DISTANCE_APPROX(m_pkChr->GetX() - pkChr->GetX(), m_pkChr->GetY() - pkChr->GetY());
if (iDistance <= m_iMaxDistance)
{
m_pkVictim = pkChr;
}
}
}
LPCHARACTER GetVictim() const
{
return m_pkVictim;
}
private:
LPCHARACTER m_pkChr;
LPCHARACTER m_pkVictim;
int m_iMaxDistance;
};
else if (IsGuardNPC()) bu else ifi komple aşağıdaki ile değiştir.
else if (IsGuardNPC())
{
if (!quest::CQuestManager::instance().GetEventFlag("noguard"))
{
FuncGuardFindVictim f(this);
if (GetSectree())
{
GetSectree()->ForEachAround(f);
}
LPCHARACTER victim = f.GetVictim();
if (victim)
{
m_dwStateDuration = passes_per_sec / 2;
if (CanBeginFight())
{
BeginFight(victim);
}
}
}
}
İstediğim krallıkların basesine diğer krallıkların girememesi için koruyu npc şu an bu senaryoyu karşılıyor. Mob olarak yapılabiliyor ama moblarda şöyle bir özlelik var hedefi kesince hareket eder mob nomove olarak ayarlasan bile o kod bloğunu char_state.cpp'den kapatman gerekli. Onun içinde
. Anlayacağın benim daha işlerim var sen önde gidiyorsun
ekliceğim o kadar şey var ki her akşam mesaimin bitip ekliceğim şeyleri araştıroyum kendime 1 yıl verdim bakalım 1 yıl sonunda nasıl bir şey çıkacak ortaya