Mai jos aveti un FIX pentru o problema legata de atacul la saman de pe cal sau mount.
Problema este ca atunci cand samanii ataca si au viteza de atac peste 145 puncte, acestia nu dau damage la fiecare hit. (nu se vede dmg cu galben)
De ce se intampla acest bug vizual?
Deoarece nu sunt sincronizate unele chestii sursa <-> client, iar animatia de la atac pe shaman este mai rapida decat proceseaza sursa binary + client, astfel dmg nu este afisat.
Cum reproducem acest bug?
Faceti-va un caracter de saman -> dati-va viteza de atac 200 -> urcati pe un mount -> atacati o piatra metin
*Poze / Video:
Dupa FIX, atacul va fi rezolvat exact ca la celalalte caractere:
![[FIX] Bug Atac Shaman si Lycan de pe Mount/Cal - Mesaj 1 - Imagine 1 [FIX] Bug Atac Shaman si Lycan de pe Mount/Cal - Mesaj 1 - Imagine 1](https://i.imgur.com/KBqaYxI.gif)
Deschidem ActorInstance.h si cautam:
protected:
void __RunNextCombo();
void __ClearCombo();
void __OnEndCombo();
void __ProcessDataAttackSuccess(const NRaceData::TAttackData & c_rAttackData, CActorInstance & rVictim, const D3DXVECTOR3 & c_rv3Position, UINT uiSkill = 0, BOOL isSendPacket = TRUE);
void __ProcessMotionEventAttackSuccess(DWORD dwMotionKey, BYTE byEventIndex, CActorInstance & rVictim);
void __ProcessMotionAttackSuccess(DWORD dwMotionKey, CActorInstance & rVictim);
Deschidem acum ActorInstanceBattle.cpp si cautam:
void CActorInstance::__ProcessDataAttackSuccess(const NRaceData::TAttackData & c_rAttackData, CActorInstance & rVictim, const D3DXVECTOR3 & c_rv3Position, UINT uiSkill, BOOL isSendPacket)
{
if (NRaceData::HIT_TYPE_NONE == c_rAttackData.iHittingType)
return;
InsertDelay(c_rAttackData.fStiffenTime);
if (__CanPushDestActor(rVictim) && c_rAttackData.fExternalForce > 0.0f)
{
__PushCircle(rVictim);
// VICTIM_COLLISION_TEST
const D3DXVECTOR3& kVictimPos = rVictim.GetPosition();
rVictim.m_PhysicsObject.IncreaseExternalForce(kVictimPos, c_rAttackData.fExternalForce); //*nForceRatio/100.0f);
// VICTIM_COLLISION_TEST_END
}
// Invisible Time
if (IS_PARTY_HUNTING_RACE(rVictim.GetRace()))
{
if (uiSkill) // ÆÄƼ »ç³É ¸ó½ºÅÍ¶óµµ ½ºÅ³ÀÌ¸é ¹«Àû½Ã°£ Àû¿ë
rVictim.m_fInvisibleTime = CTimer::Instance().GetCurrentSecond() + c_rAttackData.fInvisibleTime;
if (m_isMain) // #0000794: [M2KR] Æú¸®¸ðÇÁ - ¹ë·±½Ì ¹®Á¦ ŸÀÎ °ø°Ý¿¡ ÀÇÇÑ ¹«Àû ŸÀÓÀº °í·ÁÇÏÁö ¾Ê°í Àڽаø°Ý¿¡ ÀÇÇѰ͸¸ üũÇÑ´Ù
rVictim.m_fInvisibleTime = CTimer::Instance().GetCurrentSecond() + c_rAttackData.fInvisibleTime;
}
else // ÆÄƼ »ç³É ¸ó½ºÅͰ¡ ¾Æ´Ò °æ¿ì¸¸ Àû¿ë
{
rVictim.m_fInvisibleTime = CTimer::Instance().GetCurrentSecond() + c_rAttackData.fInvisibleTime;
}
Adaugam la sfarsitul fisierului:
#ifdef __ENABLE_SHAMAN_ATTACK_FIX__
float CActorInstance::__GetInvisibleTimeAdjust(const UINT uiSkill, const NRaceData::TAttackData& c_rAttackData) {
static const int shamanw = 3, shamanm = 7;
if ((GetRace() != shamanw && GetRace() != shamanm) ||
uiSkill != 0 ||
m_fAtkSpd < 1.3)
return 0.0f;
const auto scale = (m_fAtkSpd - 1.3) / 1.3;
const auto inv = c_rAttackData.fInvisibleTime * 0.5;
return inv * scale;
}
#endif
Nota! Aveti grija sa aveti urmatorul include:Code:#include "../UserInterface/Locale_inc.h"
Pentru Lycan, cautam:
shamanm = 7
Cautam:
if ((GetRace() != shamanw && GetRace() != shamanm) ||
uiSkill != 0 ||
m_fAtkSpd < 1.3)
return 0.0f;