Давненько я тут не писал
Сегодня сказ пойдёт про функцию
Код:
CPlayer::pc_ExchangeItem
Собственно именно она отвечает за открытие коробки, и всё бы ничего, но можно открывать стек с коробками, когда там 0 коробок, как это сделать это отдельная тема, но если коротко то можно дропать 0 коробок и лутать их.
Итак, вот тот кусок кода, который является виновником торжества:
Поскольку функция IsOverLapItem(стекается ли) с кодом коробок код возвращает true, то мы заходим в первую ветку и как видим результат от Emb_AlterDurPoint никоим образом не проверяется и из-за этого возможно открытие коробки, когда в стеке 0 предметов.
Теперь фикс:
Код:
void WINAPIV CPlayer::pc_ExchangeItem(
ATF::CPlayer * pPlayer,
unsigned __int16 wManualIndex,
unsigned __int16 wItemSerial,
ATF::Info::CPlayerpc_ExchangeItem1711_ptr next)
{
uint8_t byResult = -1;
do
{
auto pCon = pPlayer->m_Param.m_dbInven.GetPtrFromSerial(wItemSerial);
if (!pCon)
{
byResult = 4;
break;
}
if (pCon->m_bLock)
{
byResult = 4;
break;
}
if (pCon->m_byTableCode != (uint8_t)e_code_item_table::tbl_code_box)
{
byResult = 12;
break;
}
// Вот нужная проверка
if (pCon->m_dwDur <= 0 || pCon->m_dwDur > 99)
{
break;
}
next(pPlayer, wManualIndex, wItemSerial);
return;
} while (false);
_STORAGE_LIST::_db_con pNewItem;
pPlayer->SendMsg_ExchangeItemResult(byResult, &pNewItem);
}
Да, этот фикс не запрещает дропать на землю 0 коробок, передавать 0 коробок через почту и хер знает что ещё, но самое главное - больше нельзя открыть такие коробки.
PS: судя по всему багу подвержены все апдейты где есть коробки