//Очередная записка, с полей реверса сервера.
*С буквы М
Сейчас поясню за свой "базар", на примере ошибки, благодаря которой возможна накрутка через снятие рас. дэбафа.
Имеем функцию
Код:
CPotionMgr::PreCheckPotion
Казалось бы, функция должна производить только проверку условий использования капы, но хуй там, не угадали:
Код:
if ( pFld->m_nTempEffectType == 56 && !(*pTargetCharacter)->m_ObjID.m_byID )
{
pkPlayer = (CPlayer *)*pTargetCharacter;
v13 = CRaceBuffManager::Instance();
v40 = CRaceBuffManager::GetRaceBuffLevel(v13, pkPlayer);
v13 = CRaceBuffManager::Instance();
v41 = CRaceBuffManager::CancelPlayerRaceBuff(v13, pkPlayer, RT_LOSE, v40);
if ( (v40 & 0x80000000) != 0 || (signed int)v40 > 2 )
return 35i64;
if ( v41 == -3 || (float)(signed int)(v40 + 1) > pFld->m_fTempValue[0] )
return 36i64;
}
Ой, а что же мы видим? А это ни что иное, как вызов функции которая снимает рас. дэбаф:
Код:
CRaceBuffManager::CancelPlayerRaceBuff(v13, pkPlayer, RT_LOSE, v40);
COMMIT
Добавлено через 2 часа 52 минуты
Немного поясню, почему же этот кусок кода позволяет делать накрутку
При вызове CancelPlayerRaceBuff передаётся текущий уровень дэбафа, а поскольку внутри есть проверка текущего уровня и снимаемого(то что передали), то эта проверка будет всегда валидна
По сути, даже если снимать легально, то дэбаф будет снят дважды, при проверке и в функции которая более полно реализует снятие дэбафа
Так же в этом месте не хватает проверки IsUseReleaseRaceBuffPotion, это даёт возможность повторного снятия дэбафа, даже если он уже снят на постоянно основе