extensions/tf2/criticals.cpp
changeset 4172 cd458f0d3fb2
parent 4093 da128cd7be77
     1.1 --- a/extensions/tf2/criticals.cpp	Fri Nov 08 10:42:30 2013 -0500
     1.2 +++ b/extensions/tf2/criticals.cpp	Sat Nov 09 19:33:06 2013 -0500
     1.3 @@ -87,8 +87,8 @@
     1.4  		if (!UTIL_ContainsDataTable(pNetworkable->GetServerClass()->m_pTable, TF_WEAPON_DATATABLE))
     1.5  			continue;
     1.6  
     1.7 -		SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
     1.8 -		SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
     1.9 +		SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelper), false);
    1.10 +		SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelperNoCrits), false);
    1.11  
    1.12  		m_entsHooked.Set(i);
    1.13  	}
    1.14 @@ -104,8 +104,8 @@
    1.15  	for (i; i != -1; i = m_entsHooked.FindNextSetBit(i))
    1.16  	{
    1.17  		CBaseEntity *pEntity = gamehelpers->ReferenceToEntity(i);
    1.18 -		SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
    1.19 -		SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
    1.20 +		SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelper), false);
    1.21 +		SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelperNoCrits), false);
    1.22  
    1.23  		m_entsHooked.Set(i, false);
    1.24  	}
    1.25 @@ -126,8 +126,8 @@
    1.26  	if (!UTIL_ContainsDataTable(pNetworkable->GetServerClass()->m_pTable, TF_WEAPON_DATATABLE))
    1.27  		return;
    1.28  
    1.29 -	SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
    1.30 -	SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
    1.31 +	SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelper), false);
    1.32 +	SH_ADD_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelperNoCrits), false);
    1.33  
    1.34  	m_entsHooked.Set(gamehelpers->EntityToBCompatRef(pEntity));
    1.35  }
    1.36 @@ -144,13 +144,23 @@
    1.37  	if (!m_entsHooked.IsBitSet(index))
    1.38  		return;
    1.39  
    1.40 -	SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
    1.41 -	SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelpers), false);
    1.42 +	SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelper, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelper), false);
    1.43 +	SH_REMOVE_MANUALHOOK(CalcIsAttackCriticalHelperNoCrits, pEntity, SH_MEMBER(&g_CritManager, &CritManager::Hook_CalcIsAttackCriticalHelperNoCrits), false);
    1.44  
    1.45  	m_entsHooked.Set(index, false);
    1.46  }
    1.47  
    1.48 -bool CritManager::Hook_CalcIsAttackCriticalHelpers()
    1.49 +bool CritManager::Hook_CalcIsAttackCriticalHelper()
    1.50 +{
    1.51 +	return Hook_CalcIsAttackCriticalHelpers(false);
    1.52 +}
    1.53 +
    1.54 +bool CritManager::Hook_CalcIsAttackCriticalHelperNoCrits()
    1.55 +{
    1.56 +	return Hook_CalcIsAttackCriticalHelpers(true);
    1.57 +}
    1.58 +
    1.59 +bool CritManager::Hook_CalcIsAttackCriticalHelpers(bool noCrits)
    1.60  {
    1.61  	CBaseEntity *pWeapon = META_IFACEPTR(CBaseEntity);
    1.62  	
    1.63 @@ -171,7 +181,15 @@
    1.64  		RETURN_META_VALUE(MRES_IGNORED, false);
    1.65  	}
    1.66  
    1.67 -	int returnValue = 0;
    1.68 +	int returnValue;
    1.69 +	if (noCrits)
    1.70 +	{
    1.71 +		returnValue = SH_MCALL(pWeapon, CalcIsAttackCriticalHelperNoCrits)() ? 1 : 0;
    1.72 +	}
    1.73 +	else
    1.74 +	{
    1.75 +		returnValue = SH_MCALL(pWeapon, CalcIsAttackCriticalHelper)() ? 1 : 0;
    1.76 +	}
    1.77  
    1.78  	int ownerIndex = -1;
    1.79  	CBaseHandle &hndl = *(CBaseHandle *) ((intptr_t)pWeapon + info.actual_offset);
    1.80 @@ -191,9 +209,9 @@
    1.81  
    1.82  	g_critForward->Execute(&result);
    1.83  
    1.84 -	if (result && returnValue)
    1.85 +	if (result > Pl_Continue)
    1.86  	{
    1.87 -		RETURN_META_VALUE(MRES_SUPERCEDE, true);
    1.88 +		RETURN_META_VALUE(MRES_SUPERCEDE, returnValue);
    1.89  	}
    1.90  	
    1.91  	RETURN_META_VALUE(MRES_IGNORED, false);