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:
BlueDragon_Skill.h
Arat:
Değiştir:
Arat:
Altına ekle:
Char.h
Arat:
Üstüne ekle:
char_skill.cpp
Arat:
Değiştir:
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:
yere düşme engeli değil ejder skill kullandığında gb affecti varsa fırlatmıyor geri sadece 

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:
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:
Bu çözüm deneyseldir. erken return edilmesinin başka bir sebebi olabilir. Ana fonksiyonun devamını pek incelemedim. Ama bir sorun çıkacağını zannetmiyorum.
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();
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();
}
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 8
- Görüntüleme
- 327
- Cevaplar
- 10
- Görüntüleme
- 961
- Cevaplar
- 0
- Görüntüleme
- 288
- Cevaplar
- 6
- Görüntüleme
- 1K
