Bvural41 1
Bvural41
-TuRKuaZ- 1
-TuRKuaZ-
farkmt2official 1
farkmt2official
Sevdamsın 1
Sevdamsın
mavzermete 1
mavzermete
xranzei 1
xranzei
Best Studio 1
Best Studio
Hikaye Ekle

MaviAyGames | Yere Düşme İle İlgili Engeller

HERAKLES Otomatik Avlı kalıcı sunucu. 19 Haziran'da açılıyor. Atius & Wizard güvencesiyle hemen kayıt ol, ön kayıt ödülleri aktif. HEMEN TIKLA!

Örneğin güçlü beden skili açık iken mavi ejder skil attığındaki yere düşmenin çözümü aşağıdadır.
Service.h
Ekle:
Kod:
#define ENABLE_FALL_FIX

BlueDragon_Skill.h

Arat:
Kod:
                    ch->Sync(tx, ty);
                    ch->Goto(tx, ty);
                    ch->CalculateMoveDuration();

                    ch->SyncPacket();

Değiştir:
Kod:
#ifdef ENABLE_FALL_FIX
                    if (ch->CanFall())
                    {
                        ch->Sync(tx, ty);
                        ch->Goto(tx, ty);
                        ch->CalculateMoveDuration();

                        ch->SyncPacket();
                    }
#else
                    ch->Sync(tx, ty);
                    ch->Goto(tx, ty);
                    ch->CalculateMoveDuration();

                    ch->SyncPacket();
#endif

Arat:
Kod:
LPREGEN CHARACTER::GetRegen()
{
    return m_pkRegen;
}

Altına ekle:

Kod:
#ifdef ENABLE_FALL_FIX
bool CHARACTER::CanFall()
{

    if (IsAffectFlag(AFF_CHEONGEUN) && !IsAffectFlag(AFF_CHEONGEUN_WITH_FALL)) //Taichi skill
        return false;

    if (IsImmune(IMMUNE_FALL)) //Immune flag
        return false;

    if (!IsPC() &&
        GetRaceNum() == 1097 &&
        GetRaceNum() == 1098 &&
        GetRaceNum() == 1099 &&
        GetRaceNum() == 2496 &&
        GetRaceNum() == 2497 &&
        GetRaceNum() == 2498
        )
        return false;

    return true;
}
#endif

Char.h
Arat:
Kod:
private:
    std::shared_ptr<CInventory> m_inventory;

Üstüne ekle:

Kod:
#ifdef ENABLE_FALL_FIX
public:
    bool            CanFall();
#endif

char_skill.cpp
Arat:
Kod:
                GetDeltaByDegree(degree, fCrushSlidingLength, &fx, &fy);
                sys_log(0, "CRUSH! %s -> %s (%d %d) -> (%d %d)", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), (long)(pkChrVictim->GetX() + fx), (long)(pkChrVictim->GetY() + fy));
                long tx = (long)(pkChrVictim->GetX() + fx);
                long ty = (long)(pkChrVictim->GetY() + fy);

                pkChrVictim->Sync(tx, ty);
                pkChrVictim->Goto(tx, ty);
                pkChrVictim->CalculateMoveDuration();

Değiştir:
Kod:
#ifdef ENABLE_FALL_FIX
                GetDeltaByDegree(degree, fCrushSlidingLength, &fx, &fy);

                bool victimCanFall = pkChrVictim->CanFall();
                sys_log(0, "CRUSH! %s -> %s (%d %d) -> (%d %d) executed (fall): %d", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), static_cast<int32_t>(pkChrVictim->GetX() + fx), static_cast<int32_t>(pkChrVictim->GetY() + fy), victimCanFall);

                if (victimCanFall)
                {

                    int32_t tx = static_cast<int32_t>(pkChrVictim->GetX() + fx);
                    int32_t ty = static_cast<int32_t>(pkChrVictim->GetY() + fy);

                    if (true == SECTREE_MANAGER::instance().IsMovablePosition(pkChrVictim->GetMapIndex(), tx, ty))
                        return;

                    pkChrVictim->Sync(tx, ty);
                    pkChrVictim->Goto(tx, ty);
                    pkChrVictim->CalculateMoveDuration();
                }
#else
                GetDeltaByDegree(degree, fCrushSlidingLength, &fx, &fy);
                sys_log(0, "CRUSH! %s -> %s (%d %d) -> (%d %d)", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), (long)(pkChrVictim->GetX() + fx), (long)(pkChrVictim->GetY() + fy));
                long tx = (long)(pkChrVictim->GetX() + fx);
                long ty = (long)(pkChrVictim->GetY() + fy);

                pkChrVictim->Sync(tx, ty);
                pkChrVictim->Goto(tx, ty);
                pkChrVictim->CalculateMoveDuration();
#endif
 
Son düzenleme:
Service.h
Ekle:
Kod:
#define ENABLE_FALL_FIX

BlueDragon_Skill.h

Arat:
Kod:
                    ch->Sync(tx, ty);
                    ch->Goto(tx, ty);
                    ch->CalculateMoveDuration();

                    ch->SyncPacket();

Değiştir:
Kod:
#ifdef ENABLE_FALL_FIX
                    if (ch->CanFall())
                    {
                        ch->Sync(tx, ty);
                        ch->Goto(tx, ty);
                        ch->CalculateMoveDuration();

                        ch->SyncPacket();
                    }
#else
                    ch->Sync(tx, ty);
                    ch->Goto(tx, ty);
                    ch->CalculateMoveDuration();

                    ch->SyncPacket();
#endif

Arat:
Kod:
LPREGEN CHARACTER::GetRegen()
{
    return m_pkRegen;
}

Altına ekle:

Kod:
#ifdef ENABLE_FALL_FIX
bool CHARACTER::CanFall()
{

    if (IsAffectFlag(AFF_CHEONGEUN) && !IsAffectFlag(AFF_CHEONGEUN_WITH_FALL)) //Taichi skill
        return false;

    if (IsImmune(IMMUNE_FALL)) //Immune flag
        return false;

    if (!IsPC() &&
        GetRaceNum() == 1097 &&
        GetRaceNum() == 1098 &&
        GetRaceNum() == 1099 &&
        GetRaceNum() == 2496 &&
        GetRaceNum() == 2497 &&
        GetRaceNum() == 2498
        )
        return false;
   
    return true;
}
#endif

Char.h
Arat:
Kod:
private:
    std::shared_ptr<CInventory> m_inventory;

Üstüne ekle:

Kod:
#ifdef ENABLE_FALL_FIX
public:
    bool            CanFall();
#endif

char_skill.cpp
Arat:
Kod:
                GetDeltaByDegree(degree, fCrushSlidingLength, &fx, &fy);
                sys_log(0, "CRUSH! %s -> %s (%d %d) -> (%d %d)", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), (long)(pkChrVictim->GetX() + fx), (long)(pkChrVictim->GetY() + fy));
                long tx = (long)(pkChrVictim->GetX() + fx);
                long ty = (long)(pkChrVictim->GetY() + fy);

                pkChrVictim->Sync(tx, ty);
                pkChrVictim->Goto(tx, ty);
                pkChrVictim->CalculateMoveDuration();

Değiştir:
Kod:
#ifdef ENABLE_FALL_FIX
                GetDeltaByDegree(degree, fCrushSlidingLength, &fx, &fy);

                bool victimCanFall = pkChrVictim->CanFall();
                sys_log(0, "CRUSH! %s -> %s (%d %d) -> (%d %d) executed (fall): %d", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), static_cast<int32_t>(pkChrVictim->GetX() + fx), static_cast<int32_t>(pkChrVictim->GetY() + fy), victimCanFall);

                if (victimCanFall)
                {

                    int32_t tx = static_cast<int32_t>(pkChrVictim->GetX() + fx);
                    int32_t ty = static_cast<int32_t>(pkChrVictim->GetY() + fy);

                    if (true == SECTREE_MANAGER::instance().IsMovablePosition(pkChrVictim->GetMapIndex(), tx, ty))
                        return;

                    pkChrVictim->Sync(tx, ty);
                    pkChrVictim->Goto(tx, ty);
                    pkChrVictim->CalculateMoveDuration();
                }
#else
                GetDeltaByDegree(degree, fCrushSlidingLength, &fx, &fy);
                sys_log(0, "CRUSH! %s -> %s (%d %d) -> (%d %d)", m_pkChr->GetName(), pkChrVictim->GetName(), pkChrVictim->GetX(), pkChrVictim->GetY(), (long)(pkChrVictim->GetX() + fx), (long)(pkChrVictim->GetY() + fy));
                long tx = (long)(pkChrVictim->GetX() + fx);
                long ty = (long)(pkChrVictim->GetY() + fy);

                pkChrVictim->Sync(tx, ty);
                pkChrVictim->Goto(tx, ty);
                pkChrVictim->CalculateMoveDuration();
#endif
Paylaşım için teşekkürler.
 
Merhabalar, eski bir konuyu hortlatıyorum ama belki başkası da bu sorunu çözümünü arıyordur diye yazayım dedim.
Bu fix eklendiği zaman hamle, kılıç darbesi gibi skillerin sersemletmediğini farkedeceksiniz. Bu fixi yapmayan kişilerde bu sorunla karşılaşmayacaktır. Sorunun kaynağı ise fixteki şu satırlar:
C++:
                    if (true == SECTREE_MANAGER::instance().IsMovablePosition(pkChrVictim->GetMapIndex(), tx, ty))
                        return;
                    pkChrVictim->Sync(tx, ty);
                    pkChrVictim->Goto(tx, ty);
                    pkChrVictim->CalculateMoveDuration();
burada haritanın hareket edilebilen bir bölgesinde olduğunuz zaman fonksiyon erken çıkış yapıyor ve sersemletme affectine gelmiyor.
Haritanın hareket edilemeyen yani bir yerin ucuna gittiğinizde o karakterin sersemlediğini farkedebilirsiniz. bunu düzeltmek için verdiğim kodu şu şekilde düzenlemelisiniz:

C++:
                    if (!SECTREE_MANAGER::instance().IsMovablePosition(pkChrVictim->GetMapIndex(), tx, ty))
                    {
                        pkChrVictim->Sync(tx, ty);
                        pkChrVictim->Goto(tx, ty);
                        pkChrVictim->CalculateMoveDuration();
                    }
Bu çözüm deneyseldir. erken return edilmesinin başka bir sebebi olabilir. Ana fonksiyonun devamını pek incelemedim. Ama bir sorun çıkacağını zannetmiyorum.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst