-
Автор темы
- #1
я мог сделать по другому, но посмотрел как сделано в гладиаторе. вроде всё так же, мб я чет не заметил
C++:
bool F_Ragebot::CalculateChance(float& flFinalChance, CLagRecord* pRecord, const Vector vecAngles, const float flChance, int iHitbox, matrix* pMatrix)
{
IBaseCombatWeapon* pWeapon; CCSWeaponInfo* pWeaponData;
if ( (pWeapon = g_Global->pWeapon) == nullptr || (pWeaponData = g_Global->pWeaponData) == nullptr || flChance == 0.0f) {
flFinalChance = 0.0f; return true;
}
Vector vecForward, vecRight, vecUp; Vector vecStart = g_Global->pLocal->GetEyePosition();
Math::AngleVector4(vecAngles, vecForward, vecRight, vecUp);
int iHits = 0;
int iNeededHits = static_cast<int>(255.0f * (flChance / 100.0f));
float flSpread = pWeapon->GetSpread();
float flInaccuracy = pWeapon->GetInaccuracy();
for (int i = 0; i < 255; i++)
{
RandomSeed(i);
float a = RandomFloat(0.0f, 1.0f);
float b = RandomFloat(0.0f, 2.0f * PI);
float c = RandomFloat(0.0f, 1.0f);
float d = RandomFloat(0.0f, 2.0f * PI);
float m_flInaccuracy = a * flInaccuracy;
float m_flSpread = c * flSpread;
if (pWeapon->GetItemDefinitionIndex() == WEAPON_REVOLVER)
a = 1.0f - pow(a, 2.0f), a = 1.0f - pow(c, 2.0f);
Vector vecSpreadView((cos(b) * m_flInaccuracy) + (cos(d) * m_flSpread), (sin(b) * m_flInaccuracy) + (sin(d) * m_flSpread), 0.f), vecDirection;
vecDirection.x = vecForward.x + (vecSpreadView.x * vecRight.x) + (vecSpreadView.y * vecUp.x);
vecDirection.y = vecForward.y + (vecSpreadView.x * vecRight.y) + (vecSpreadView.y * vecUp.y);
vecDirection.z = vecForward.z + (vecSpreadView.x * vecRight.z) + (vecSpreadView.y * vecUp.z);
vecDirection.Normalized();
Vector vecViewanglesSpread;
Math::VectorAngles(vecDirection, vecUp, vecViewanglesSpread);
Math::Normalize(vecViewanglesSpread);
Vector vecViewForward;
Math::AngleVectors2(vecViewanglesSpread, vecViewForward);
vecViewForward.NormalizeInPlace();
vecViewForward = vecStart + (vecViewForward * pWeaponData->m_flRange);
g_Interfaces.iDebugOverlay->AddLineOverlay(vecStart, vecViewForward, 0, 0, 255, false, 0.02f);
if (CanHitHitbox(vecStart, vecViewForward, pRecord, iHitbox, pMatrix))
++iHits;
if (static_cast<int>((static_cast<float>(iHits) / 255.0f) * 100.0f) >= flChance)
return true;
if ((255 - i + iHits) < iNeededHits)
return false;
}
return false;
}