You'll need
DHooks with dynamic detour support. The gist of it is that you'll create a detour on
CBaseCombatWeapon::IsAllowedToWithdrawFromCritBucket() and check that it returns true.
Untested code:
Code:
{
hWithdrawFromCritBucket = DHookCreateDetour(Address_Null, CallConv_THISCALL, ReturnType_Bool, ThisPointer_CBaseEntity);
DHookSetFromConf(hWithdrawFromCritBucket, hGameData, SDKConf_Signature, "CBaseCombatWeapon::IsAllowedToWithdrawFromCritBucket()");
DHookAddParam(hWithdrawFromCritBucket, HookParamType_Float);
DHookEnableDetour(hWithdrawFromCritBucket, true, OnWithdrawFromCritBucketPost);
}
public MRESReturn OnWithdrawFromCritBucketPost(int weapon, Handle hReturn, Handle hParams) {
bool bIsCritical = DHookGetReturn(hReturn);
if (bIsCritical) {
// is a random crit
}
return MRES_Ignored;
}
You'll need gamedata for this; that's left as an exercise for you.
__________________