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);