Krallık Koruyucu NPC Yapmak

xxicecupexx

Üye
Üye
Mesaj
40
Çözümler
1
Beğeni
22
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.

char.cpp:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
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);
                }
            }
        }
    }

2024-08-17 22-45-47.gif
 
Paylaşım için teşekkürler. Moblar tek mi atıyor yoksa ayarlayabiliyormuyuz damagesini?
 
Eline sağlık. Soru cevaptaki konu nasıl çözülecek diye merak ediyordum, c++ ile çözülmüş olması güzel olmuş. Bir kaç değişiklik yapıp Ronark için kullanmayı düşünüyorum
 
bir de tkmt2 de diğer krallıklar kesebiliyordu okçuları bu sekilde vurulmaz. Kullanmak isteyenler tercih edebilir.
Tkmt2de koruyucu okçuları kesebiliyomuyduk şu an hatırlamıyorum :( İ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

şuradaki if bloğunu bitişine kadar tamamen yorum satırına alabilirsin. O şekilde mobda aynı işlevi görür. Koruyucu mob hasar alır hale getirilir ama üstünde bayrak işareti çıkmaz mob olduğu için
char_state.cpp:
Genişlet Daralt Kopyala
            //if (!new_victim)
            //{
            //    switch (GetMobBattleType())
            //    {
            //        case BATTLE_TYPE_MELEE:
            //        case BATTLE_TYPE_SUPER_POWER:
            //        case BATTLE_TYPE_SUPER_TANKER:
            //        case BATTLE_TYPE_POWER:
            //        case BATTLE_TYPE_TANKER:
            //        {
            //            float fx, fy;
            //            float fDist = number (400, 1500);

            //            GetDeltaByDegree (number (0, 359), fDist, &fx, &fy);

            //            if (SECTREE_MANAGER::instance().IsMovablePosition (victim->GetMapIndex(),
            //                    victim->GetX() + (int) fx,
            //                    victim->GetY() + (int) fy) &&
            //                    SECTREE_MANAGER::instance().IsMovablePosition (victim->GetMapIndex(),
            //                            victim->GetX() + (int) fx/2,
            //                            victim->GetY() + (int) fy/2))
            //            {
            //                float dx = victim->GetX() + fx;
            //                float dy = victim->GetY() + fy;

            //                SetRotation (GetDegreeFromPosition (dx, dy));

            //                if (Goto ((long) dx, (long) dy))
            //                {
            //                    sys_log (0, "KILL_AND_GO: %s distance %.1f", GetName(), fDist);
            //                    SendMovePacket (FUNC_WAIT, 0, 0, 0, 0);
            //                }
            //            }
            //        }
            //    }
            //}


NPC olarak ayarladığında tek atmamasını istiyorsan ise char_battle.cpp'den aşağıdaki bloğu düzenleyebilirsin.


char_battle.cpp:
Genişlet Daralt Kopyala
        else if (pAttacker->IsGuardNPC())
        {
            SET_BIT (m_pointsInstant.instant_flag, INSTANT_FLAG_NO_REWARD);
            Stun();
            return true;
        }
Bu alanı örneğin aşağıdaki şekilde sabit damage verebilirsiniz örnek olarak 10.000 verilmiştir.
else if (pAttacker->IsGuardNPC())
        {
            dam = 10000;
        }

Ekran Görüntüsü (122).webp
 
Son düzenleme:
Daha ronark için offshop bitirip sonra aynasına geçecem sonra k envanter bitecek anca öyle ronark a geçerim :cautious:. Anlayacağın benim daha işlerim var sen önde gidiyorsun :cautious:
Benim de 1 ay oldu geliştirmeye başlayalı :D 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
 
Benim de 1 ay oldu geliştirmeye başlayalı :D 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
1 ay civarı da benim oldu. Benim hedef yıl sonu.
 
Güzel paylaşım, bunu hem npc hem de moblara saldıracak şekilde ayarlamış olsaydınız daha iyiydi. İki türlü de kullanılırdı. Tek npc biraz yavan kalmış gibi görünüyor.
 
Güzel paylaşım, bunu hem npc hem de moblara saldıracak şekilde ayarlamış olsaydınız daha iyiydi. İki türlü de kullanılırdı. Tek npc biraz yavan kalmış gibi görünüyor.
Merhaba, npcyi kendi ihtiyacıma göre ayarlarıp sizlerinde düzenleyebilmeniz için paylaşımı yaptım. Moblara saldırcak şekilde ayarlamak istiyorsanız çok kısa bir değişiklik ile bunu yapabilirsiniz. Paylaştığım kodda FuncGuardFindVictim(Guard Npc için Düşman Ara) fonksiyonunda görüldüğü üzere aşağıdaki if koşulunda düşman araması yaparken düşman birpc ve kendi krallığından değilse koşulu var. Bu koşula küçük bir mantık ile pkChr->IsMonster() || eklerseniz victim(düşman) olarak monsterlarıda arayacaktır.

Mevcut hali->
if (pkChr->IsPC() && pkChr->GetEmpire() != m_pkChr->GetEmpire())

Ekleme yapıldıktan sonraki if koşulu aşağıdaki şekilde olacaktır ve düşman ararken IsMonster' ise de kod bloğu çalışıp moblara saldırı yapacaktır.
if (pkChr->IsMonster() || pkChr->IsPC() && pkChr->GetEmpire() != m_pkChr->GetEmpire())
 
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.

char.cpp:
Genişlet Daralt Kopyala
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:
Genişlet Daralt Kopyala
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);
                }
            }
        }
    }

18408 eklentisini görüntüle
bunu nasıl yaptın kodu vermisin de o karakter nasıl ekledin oyuna
 
Bunu pete uyarlayacaksın, hop oyun bir anda pokemona dönecek ve petlere vs attıracaz.
 
bunu nasıl yaptın kodu vermisin de o karakter nasıl ekledin oyuna
Oyuna bir mob eklemesi yapmadım aslında mevcut savaş sorumlusu npcleri mevcut onların mobprotodaki vnumu char.cpp'de ekledim o kadar başka mob/npcyide char.cpp'ye ekleyerek yapabilirsin. Atıyorum azrailidie mobprotoda npc olarak ayarlayıp char.cpp'ye eklersin o da koruycu npcye dönüşür.

Bunu pete uyarlayacaksın, hop oyun bir anda pokemona dönecek ve petlere vs attıracaz.
Pete uyarlaması yapılabilir ama petlerin saldırı animasyonları vs olması gerekir bence. Bu sistem mantığı kullanılarak geliştirilebilir.
 
En son bir moderatör tarafından düzenlenmiş:
Allods online deki muhafızlar gibi olmuş. Ancak tek atmasın, krallıklara baskın yapıldığı zaman kesilebilmesi lazım bunların.
Birde şöyle bir durum var. Genelde aktif oyuncu olduğu krallıkta pazarlar kurulur, diğer bayraklardan pazar kurmak için gelen oyuncuları da düşünmek gerek.
 
Allods online deki muhafızlar gibi olmuş. Ancak tek atmasın, krallıklara baskın yapıldığı zaman kesilebilmesi lazım bunların.
Birde şöyle bir durum var. Genelde aktif oyuncu olduğu krallıkta pazarlar kurulur, diğer bayraklardan pazar kurmak için gelen oyuncuları da düşünmek gerek.
Mob olarakta yapılabilir ISNOATTJINNO-ISNOATTSHINSO gibi aiflaglar var bu flaglar kullanılarak. O zaman kesilebilir olur. Damage ayarlanabiliyor ben 10.000 sabit olarak ayarladım filesimde bir de pazar için ortak mapler var artık ya o yüzden çok problem olmaz gibi geldi bana :D
 
Geri
Üst