Tek kanala mob sabitleme.

AhmetTeyfik

Süper Moderatör
Süper Moderatör
Premium Üye
Geliştirici
Yardımsever Üye
Editör
Mesaj
833
Çözümler
43
Beğeni
880
Puan
959
Örneğin çöle bir boss sabitlerken tek kanal olması için çölü game99 a taşıyorduk. Ben bunu yapmak istemiyordum bu yüzden regen.cpp de birkaç değişiklik yaptım. Başlığa tek kanal yazdım ama istediğiniz kanala ayarlayabiliyorsunuz. Yani mobun sadece ch1 ve ch3 de çıkmasını kolaylıkla ayarlayabiliyorsunuz. Baştan söyleyeyim anlatması kod yazmasından daha zor.
regen.txt dosyasında ki z kısmını sistem kullanmıyordu bende orayı ch ye çevirdim.
Bu kısmı;
Hiç değiştirmezseniz (0) bütün kanallarda çıkar.
1 yaparsanız sadece ch1
2 yaparsanız sadece ch2
4 yaparsanız sadece ch3
8 yaparsanız sadece ch4
16 yaparsanız sadece ch5
32 yaparsanız sadece ch6
1+2 yani 3 yaparsanız ch1 ve ch2
1+2+4 yani 7 yaparsanız ch1 ve ch2 ve ch3
1+4 yani 5 yaparsanız ch1 ve ch3
2+8 yani 10 yaparsanız ch2 ve ch4

Antiflag hesaplamayla aynı.
Örnek bu videoya ben sadece ch2 ye sabitledim.

Anlatım:
Not: Anlatımda yanlışlık yapmam ihtimaline karşılık regen.cpp ve regen.h dosyasını aşağıya ekliyorum.
common/services.h:
#define ELISIA_REGEN_CHANNEL_SECTION // Bir ve ya birden fazla ch ye mob sabitleme
game/regen.h:
enum
{
    REGEN_TYPE_MOB,
    REGEN_TYPE_GROUP,
    REGEN_TYPE_EXCEPTION,
    REGEN_TYPE_GROUP_GROUP,
    REGEN_TYPE_ANYWHERE,
    REGEN_TYPE_MAX_NUM
};
// ALTINA EKLE

#ifdef ELISIA_REGEN_CHANNEL_SECTION
enum REGEN_CHANNEL
{
    REGEN_CHANNEL_CH1 = (1 << 0), // 1
    REGEN_CHANNEL_CH2 = (1 << 1), // 2
    REGEN_CHANNEL_CH3 = (1 << 2), // 4
    REGEN_CHANNEL_CH4 = (1 << 3), // 8
    REGEN_CHANNEL_CH5 = (1 << 4), // 16
    REGEN_CHANNEL_CH6 = (1 << 5), // 32
};
#endif

// typedef struct regen içerisinde ARAT
    bool    is_aggressive;
// ALTINA EKLE
#ifdef ELISIA_REGEN_CHANNEL_SECTION
    DWORD channelFlag;
#endif
// typedef struct regen içerisinde ARAT
        is_aggressive(0),
// ALTINA EKLE
#ifdef ELISIA_REGEN_CHANNEL_SECTION
        channelFlag(0),
#endif
game/regen.cpp:
// static bool read_line(FILE *fp, LPREGEN regen) İÇİNDE ARAT
str_to_number(regen->z_section, szTmp);
// DEĞİŞTİR
#ifdef ELISIA_REGEN_CHANNEL_SECTION
                str_to_number(regen->z_section, 0);
                str_to_number(regen->channelFlag, szTmp);
#else
                str_to_number(regen->z_section, szTmp);
#endif

// ARAT
static void regen_spawn(LPREGEN regen, bool bOnce)
// KOMPLE DEĞİŞTİR
static void regen_spawn(LPREGEN regen, bool bOnce)
{
    DWORD    num;
    DWORD    i;

    num = (regen->max_count - regen->count);

    if (!num)
        return;

    for (i = 0; i < num; ++i)
    {
        LPCHARACTER ch = NULL;

        if (regen->type == REGEN_TYPE_ANYWHERE)
        {
            ch = CHARACTER_MANAGER::instance().SpawnMobRandomPosition(regen->vnum, regen->lMapIndex);

            if (ch)
                ++regen->count;
        }
        else if (regen->sx == regen->ex && regen->sy == regen->ey)
        {
#ifdef ELISIA_REGEN_CHANNEL_SECTION
            if (regen->channelFlag > 0)
            {
                if ((g_bChannel == 1 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH1))
                    || (g_bChannel == 2 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH2))
                    || (g_bChannel == 3 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH3))
                    || (g_bChannel == 4 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH4))
                    || (g_bChannel == 5 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH5))
                    || (g_bChannel == 6 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH6)))
                {
                    ch = CHARACTER_MANAGER::instance().SpawnMob(regen->vnum,
                        regen->lMapIndex,
                        regen->sx,
                        regen->sy,
                        regen->z_section,
                        false,
                        regen->direction == 0 ? number(0, 7) * 45 : (regen->direction - 1) * 45);
                    if (ch)
                        ++regen->count;
                }
            }
            else
            {
                ch = CHARACTER_MANAGER::instance().SpawnMob(regen->vnum,
                    regen->lMapIndex,
                    regen->sx,
                    regen->sy,
                    regen->z_section,
                    false,
                    regen->direction == 0 ? number(0, 7) * 45 : (regen->direction - 1) * 45);

                if (ch)
                    ++regen->count;
            }
#else
            ch = CHARACTER_MANAGER::instance().SpawnMob(regen->vnum,
                    regen->lMapIndex,
                    regen->sx,
                    regen->sy,
                    regen->z_section,
                    false,
                    regen->direction == 0 ? number(0, 7) * 45 : (regen->direction - 1) * 45);

            if (ch)
                ++regen->count;
#endif
        }
        else
        {
            if (regen->type == REGEN_TYPE_MOB)
            {
#ifdef ELISIA_REGEN_CHANNEL_SECTION

                if (regen->channelFlag > 0)
                {
                    if ((g_bChannel == 1 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH1))
                        || (g_bChannel == 2 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH2))
                        || (g_bChannel == 3 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH3))
                        || (g_bChannel == 4 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH4))
                        || (g_bChannel == 5 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH5))
                        || (g_bChannel == 6 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH6)))
                    {
                        ch = CHARACTER_MANAGER::Instance().SpawnMobRange(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, true, regen->is_aggressive, regen->is_aggressive);
                        if (ch)
                            ++regen->count;
                    }
                }
                else
                {
                    ch = CHARACTER_MANAGER::Instance().SpawnMobRange(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, true, regen->is_aggressive, regen->is_aggressive);

                    if (ch)
                        ++regen->count;
                }

#else
                ch = CHARACTER_MANAGER::Instance().SpawnMobRange(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, true, regen->is_aggressive, regen->is_aggressive );

                if (ch)
                    ++regen->count;
#endif
            }
            else if (regen->type == REGEN_TYPE_GROUP)
            {

#ifdef ELISIA_REGEN_CHANNEL_SECTION
                if (regen->channelFlag > 0)
                {
                    if ((g_bChannel == 1 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH1))
                        || (g_bChannel == 2 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH2))
                        || (g_bChannel == 3 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH3))
                        || (g_bChannel == 4 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH4))
                        || (g_bChannel == 5 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH5))
                        || (g_bChannel == 6 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH6)))
                    {
                        if (CHARACTER_MANAGER::Instance().SpawnGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
                            ++regen->count;
                    }
                }
                else
                {
                    if (CHARACTER_MANAGER::Instance().SpawnGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
                        ++regen->count;
                }

#else
                if (CHARACTER_MANAGER::Instance().SpawnGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
                    ++regen->count;
#endif
            }
            else if (regen->type == REGEN_TYPE_GROUP_GROUP)
            {
#ifdef ELISIA_REGEN_CHANNEL_SECTION
                if (regen->channelFlag > 0)
                {
                    if ((g_bChannel == 1 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH1))
                        || (g_bChannel == 2 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH2))
                        || (g_bChannel == 3 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH3))
                        || (g_bChannel == 4 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH4))
                        || (g_bChannel == 5 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH5))
                        || (g_bChannel == 6 && IS_SET(regen->channelFlag, REGEN_CHANNEL_CH6)))
                    {
                        if (CHARACTER_MANAGER::Instance().SpawnGroupGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
                            ++regen->count;
                    }
                }
                else
                {
                    if (CHARACTER_MANAGER::Instance().SpawnGroupGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
                        ++regen->count;
                }

#else
                if (CHARACTER_MANAGER::Instance().SpawnGroupGroup(regen->vnum, regen->lMapIndex, regen->sx, regen->sy, regen->ex, regen->ey, bOnce ? NULL : regen, regen->is_aggressive))
                    ++regen->count;
#endif
            }
        }

        if (ch && !bOnce)
            ch->SetRegen(regen);
    }
}
 

Dosya Eklentileri

  • regen.zip
    4,3 KB · Gösterim: 11
ayrıca birşey daha sormak istiyorum bu konuyla alakalı ben şimdi bossu sabitledim ama oyuncu bossu alıp başka bir yere götürüyor belirli bir mesafeden sonra geri dönmesini nasıl ayarlayabilirim?
 
Geri
Üst