-
Автор темы
- #1
Пожалуйста, авторизуйтесь для просмотра ссылки.
Все что вам нужно сделать, это исправить тип оружия перед вызовом функции и восстановить его после завершения. Также вы не можете перехватить ShouldDrawCrosshair, который является виртуальным с индексом 338 и всегда возвращает 1. Сама функция DrawCrosshair также является виртуальной и имеет индекс 339.
GetWpnData это оболочка для GetWeaponInfoFromHandle
Также вы можете включить отдачу используя ScreenHeight и ScreenWidth.
C++:
void __fastcall Hooked_DrawCrosshair(CWeapon* pThis, void*)
{
typedef void(__thiscall * fn_t)(CWeapon*);
CCSWeaponInfo& pData = pThis->GetCSWpnData();
CSWeaponType restore = *(CSWeaponType*)((size_t)&pData + 1788);
if (g_pGameChangesCon->m_pForceCrosshair->Value())
{
*(CSWeaponType*)((size_t)&pData + 1788) = CSWeaponType(CSWeaponType::WEAPONTYPE_UNKNOWN + 1);
}
g_pDrawCrosshairHook->Restore();
((fn_t)g_pDrawCrosshairHook->GetTarget())(pThis);
g_pDrawCrosshairHook->Hook();
*(CSWeaponType*)((size_t)&pData + 1788) = restore;
}
C++:
CCSWeaponInfo& GetCSWpnData()
{
return *(CCSWeaponInfo*)&GetWpnData();
}
C++:
ileWeaponInfo_t& CBaseCombatWeapon::GetWpnData(void)
{
static size_t sig = g_pSignature->GetClientSignature("0F B7 81 ? ? ? ? 50 E8 ? ? ? ? 83 C4 04 C3");
typedef FileWeaponInfo_t& (__thiscall * fn_t)(CBaseCombatWeapon*);
return ((fn_t)sig)(this);
}