mirror of
https://github.com/rei-2/Amalgam
synced 2026-10-10 12:53:10 +08:00
assistive aim type
add projectile hitbox dropdown & move some options from modifiers over (settings may need to be fixed) improve stickybomb aim performance misc changes & fixes
This commit is contained in:
@@ -184,8 +184,15 @@ bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWea
|
||||
return false;
|
||||
|
||||
auto pOwner = pBuilding->m_hBuilder().Get();
|
||||
if (pOwner && F::PlayerUtils.IsIgnored(pOwner->entindex()))
|
||||
return true;
|
||||
if (pOwner)
|
||||
{
|
||||
if (F::PlayerUtils.IsIgnored(pOwner->entindex()))
|
||||
return true;
|
||||
|
||||
if (Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Friends && H::Entities.IsFriend(pOwner->entindex())
|
||||
|| Vars::Aimbot::General::Ignore.Value & Vars::Aimbot::General::IgnoreEnum::Party && H::Entities.InParty(pOwner->entindex()))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -193,6 +200,9 @@ bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWea
|
||||
{
|
||||
auto pProjectile = pEntity->As<CTFGrenadePipebombProjectile>();
|
||||
|
||||
if (!(Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Stickies))
|
||||
return true;
|
||||
|
||||
if (pLocal->m_iTeamNum() == pEntity->m_iTeamNum())
|
||||
return true;
|
||||
|
||||
@@ -210,6 +220,9 @@ bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWea
|
||||
case ETFClassID::CMerasmus:
|
||||
case ETFClassID::CTFBaseBoss:
|
||||
{
|
||||
if (!(Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::NPCs))
|
||||
return true;
|
||||
|
||||
if (pEntity->m_iTeamNum() != 5)
|
||||
return true;
|
||||
|
||||
@@ -218,11 +231,22 @@ bool CAimbotGlobal::ShouldIgnore(CBaseEntity* pEntity, CTFPlayer* pLocal, CTFWea
|
||||
case ETFClassID::CTFTankBoss:
|
||||
case ETFClassID::CZombie:
|
||||
{
|
||||
if (!(Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::NPCs))
|
||||
return true;
|
||||
|
||||
if (pLocal->m_iTeamNum() == pEntity->m_iTeamNum())
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
case ETFClassID::CTFPumpkinBomb:
|
||||
case ETFClassID::CTFGenericBomb:
|
||||
{
|
||||
if (!(Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Bombs))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
@@ -184,7 +184,7 @@ int CAimbotHitscan::GetHitboxPriority(int nHitbox, CTFPlayer* pLocal, CTFWeaponB
|
||||
}
|
||||
}
|
||||
|
||||
if (Vars::Aimbot::Hitscan::Modifiers.Value & Vars::Aimbot::Hitscan::ModifiersEnum::BodyaimIfLethal && bHeadshot)
|
||||
if (Vars::Aimbot::Hitscan::Hitboxes.Value & Vars::Aimbot::Hitscan::HitboxesEnum::BodyaimIfLethal && bHeadshot)
|
||||
{
|
||||
auto pPlayer = pTarget->As<CTFPlayer>();
|
||||
|
||||
@@ -331,12 +331,16 @@ int CAimbotHitscan::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* p
|
||||
std::rotate(vRecords.begin(), pivot, pivot + 1);
|
||||
}
|
||||
|
||||
auto RayToOBB = [](const Vec3& origin, const Vec3& direction, const Vec3& min, const Vec3& max, const matrix3x4& matrix) -> bool
|
||||
auto RayToOBB = [&](const Vec3& vOrigin, const Vec3& vDirection, const Vec3& vMins, const Vec3& vMaxs, const matrix3x4& mMatrix, float flScale = 1.f) -> bool
|
||||
{
|
||||
if (Vars::Aimbot::General::AimType.Value != Vars::Aimbot::General::AimTypeEnum::Smooth)
|
||||
return true;
|
||||
switch (Vars::Aimbot::General::AimType.Value)
|
||||
{
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
return Math::RayToOBB(vOrigin, vDirection, vMins, vMaxs, mMatrix, flScale);
|
||||
}
|
||||
|
||||
return Math::RayToOBB(origin, direction, min, max, matrix);
|
||||
return true;
|
||||
};
|
||||
|
||||
int iReturn = false;
|
||||
@@ -369,7 +373,9 @@ int CAimbotHitscan::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* p
|
||||
|
||||
for (auto& [pBox, iHitbox, _] : vHitboxes)
|
||||
{
|
||||
float flModelScale = powf(target.m_pEntity->As<CBaseAnimating>()->m_flModelScale(), 2);
|
||||
float flModelScale = target.m_pEntity->As<CBaseAnimating>()->m_flModelScale();
|
||||
float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::PointScale.Value / 100.f);
|
||||
float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value;
|
||||
|
||||
Vec3 vAngle; Math::MatrixAngles(aBones[pBox->bone], vAngle);
|
||||
Vec3 vMins = pBox->bbmin;
|
||||
@@ -386,7 +392,9 @@ int CAimbotHitscan::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* p
|
||||
std::vector<Vec3> vPoints = { Vec3() };
|
||||
if (Vars::Aimbot::Hitscan::PointScale.Value > 0.f)
|
||||
{
|
||||
bool bTriggerbot = Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth && Vars::Aimbot::General::Smoothing.Value == 100.f;
|
||||
bool bTriggerbot = (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth
|
||||
|| Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive)
|
||||
&& !Vars::Aimbot::General::AssistStrength.Value;
|
||||
|
||||
if (!bTriggerbot)
|
||||
{
|
||||
@@ -427,17 +435,21 @@ int CAimbotHitscan::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* p
|
||||
auto vAngles = Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(pLocal->GetShootPos(), vOrigin));
|
||||
Vec3 vForward; Math::AngleVectors(vAngles, &vForward);
|
||||
|
||||
target.m_vAngleTo = vAngles;
|
||||
if (RayToOBB(vEyePos, vForward, vMins * flModelScale, vMaxs * flModelScale, aBones[pBox->bone])) // for the time being, no vischecks against other hitboxes
|
||||
// for the time being, no vischecks against other hitboxes
|
||||
Vec3 vCheckMins = (vMins + flBoneSubtract / flModelScale) * flBoneScale, vCheckMaxs = (vMaxs - flBoneSubtract / flModelScale) * flBoneScale;
|
||||
if (RayToOBB(vEyePos, vForward, vCheckMins, vCheckMaxs, aBones[pBox->bone], flModelScale))
|
||||
{
|
||||
flPreferredRecord = tRecord.m_flSimTime;
|
||||
|
||||
target.m_vAngleTo = vAngles;
|
||||
target.m_tRecord = tRecord;
|
||||
target.m_vPos = vOrigin;
|
||||
target.m_nAimedHitbox = iHitbox;
|
||||
target.m_bBacktrack = true;
|
||||
return true;
|
||||
}
|
||||
else if (iReturn == 2 && vAngles.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() < target.m_vAngleTo.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D())
|
||||
target.m_vAngleTo = vAngles;
|
||||
iReturn = 2;
|
||||
}
|
||||
}
|
||||
@@ -445,13 +457,18 @@ int CAimbotHitscan::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* p
|
||||
}
|
||||
else
|
||||
{
|
||||
float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::PointScale.Value / 100.f);
|
||||
float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value;
|
||||
|
||||
Vec3 vMins = target.m_pEntity->m_vecMins();
|
||||
Vec3 vMaxs = target.m_pEntity->m_vecMaxs();
|
||||
|
||||
std::vector<Vec3> vPoints = { Vec3() };
|
||||
//if (Vars::Aimbot::Hitscan::PointScale.Value > 0.f)
|
||||
{
|
||||
bool bTriggerbot = Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth && Vars::Aimbot::General::Smoothing.Value == 100.f;
|
||||
bool bTriggerbot = (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth
|
||||
|| Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive)
|
||||
&& !Vars::Aimbot::General::AssistStrength.Value;
|
||||
|
||||
if (!bTriggerbot)
|
||||
{
|
||||
@@ -493,13 +510,16 @@ int CAimbotHitscan::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* p
|
||||
auto vAngles = Aim(G::CurrentUserCmd->viewangles, Math::CalcAngle(pLocal->GetShootPos(), vTransformed));
|
||||
Vec3 vForward; Math::AngleVectors(vAngles, &vForward);
|
||||
|
||||
target.m_vAngleTo = vAngles;
|
||||
if (RayToOBB(vEyePos, vForward, vMins, vMaxs, transform))
|
||||
Vec3 vCheckMins = (vMins + flBoneSubtract) * flBoneScale, vCheckMaxs = (vMaxs - flBoneSubtract) * flBoneScale;
|
||||
if (RayToOBB(vEyePos, vForward, vCheckMins, vCheckMaxs, transform))
|
||||
{
|
||||
target.m_vAngleTo = vAngles;
|
||||
target.m_tRecord = tRecord;
|
||||
target.m_vPos = vTransformed;
|
||||
return true;
|
||||
}
|
||||
else if (iReturn == 2 && vAngles.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D() < target.m_vAngleTo.DeltaAngle(G::CurrentUserCmd->viewangles).Length2D())
|
||||
target.m_vAngleTo = vAngles;
|
||||
iReturn = 2;
|
||||
}
|
||||
}
|
||||
@@ -591,17 +611,15 @@ Vec3 CAimbotHitscan::Aim(Vec3 vCurAngle, Vec3 vToAngle, int iMethod)
|
||||
vReturn = vToAngle;
|
||||
break;
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
{
|
||||
auto shortDist = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
const float flDelta = fmodf((flAngleA - flAngleB), 360.f);
|
||||
return fmodf(2 * flDelta, 360.f) - flDelta;
|
||||
};
|
||||
const float t = 1.f - Vars::Aimbot::General::Smoothing.Value / 100.f;
|
||||
vReturn.x = vCurAngle.x - shortDist(vCurAngle.x, vToAngle.x) * t;
|
||||
vReturn.y = vCurAngle.y - shortDist(vCurAngle.y, vToAngle.y) * t;
|
||||
vReturn = vCurAngle.LerpAngle(vToAngle, Vars::Aimbot::General::AssistStrength.Value / 100.f);
|
||||
break;
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
Vec3 vMouseDelta = G::CurrentUserCmd->viewangles.DeltaAngle(G::LastUserCmd->viewangles);
|
||||
Vec3 vTargetDelta = vToAngle.DeltaAngle(G::LastUserCmd->viewangles);
|
||||
float flMouseDelta = vMouseDelta.Length2D(), flTargetDelta = vTargetDelta.Length2D();
|
||||
vTargetDelta = vTargetDelta.Normalized() * std::min(flMouseDelta, flTargetDelta);
|
||||
vReturn = vCurAngle - vMouseDelta + vMouseDelta.LerpAngle(vTargetDelta, Vars::Aimbot::General::AssistStrength.Value / 100.f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return vReturn;
|
||||
@@ -614,6 +632,7 @@ void CAimbotHitscan::Aim(CUserCmd* pCmd, Vec3& vAngle)
|
||||
{
|
||||
case Vars::Aimbot::General::AimTypeEnum::Plain:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
pCmd->viewangles = vAngle;
|
||||
I::EngineClient->SetViewAngles(vAngle);
|
||||
break;
|
||||
|
||||
@@ -116,8 +116,8 @@ int CAimbotMelee::GetSwingTime(CTFWeaponBase* pWeapon)
|
||||
}
|
||||
|
||||
void CAimbotMelee::SimulatePlayers(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, std::vector<Target_t> targets,
|
||||
Vec3& vEyePos, std::unordered_map<CBaseEntity*, std::deque<TickRecord>>& pRecordMap,
|
||||
std::unordered_map<CBaseEntity*, std::deque<Vec3>>& mPaths)
|
||||
Vec3& vEyePos, std::unordered_map<int, std::deque<TickRecord>>& pRecordMap,
|
||||
std::unordered_map<int, std::deque<Vec3>>& mPaths)
|
||||
{
|
||||
// swing prediction / auto warp
|
||||
const int iSwingTicks = GetSwingTime(pWeapon);
|
||||
@@ -128,11 +128,11 @@ void CAimbotMelee::SimulatePlayers(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, st
|
||||
if ((Vars::Aimbot::Melee::SwingPrediction.Value || iDoubletapTicks) && pWeapon->m_flSmackTime() < 0.f && iMax)
|
||||
{
|
||||
PlayerStorage localStorage;
|
||||
std::unordered_map<CBaseEntity*, PlayerStorage> targetStorage;
|
||||
std::unordered_map<int, PlayerStorage> targetStorage;
|
||||
|
||||
F::MoveSim.Initialize(pLocal, localStorage, false, iDoubletapTicks);
|
||||
for (auto& target : targets)
|
||||
F::MoveSim.Initialize(target.m_pEntity, targetStorage[target.m_pEntity], false);
|
||||
F::MoveSim.Initialize(target.m_pEntity, targetStorage[target.m_pEntity->entindex()], false);
|
||||
|
||||
for (int i = 0; i < iMax; i++) // intended for plocal to collide with targets
|
||||
{
|
||||
@@ -146,12 +146,14 @@ void CAimbotMelee::SimulatePlayers(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, st
|
||||
{
|
||||
for (auto& target : targets)
|
||||
{
|
||||
F::MoveSim.RunTick(targetStorage[target.m_pEntity]);
|
||||
if (!targetStorage[target.m_pEntity].m_bFailed)
|
||||
pRecordMap[target.m_pEntity].push_front({
|
||||
!Vars::Aimbot::Melee::SwingPredictLag.Value || targetStorage[target.m_pEntity].m_bPredictNetworked ? target.m_pEntity->m_flSimulationTime() + TICKS_TO_TIME(i + 1) : 0.f,
|
||||
auto& tStorage = targetStorage[target.m_pEntity->entindex()];
|
||||
|
||||
F::MoveSim.RunTick(tStorage);
|
||||
if (!tStorage.m_bFailed)
|
||||
pRecordMap[target.m_pEntity->entindex()].push_front({
|
||||
!Vars::Aimbot::Melee::SwingPredictLag.Value || tStorage.m_bPredictNetworked ? target.m_pEntity->m_flSimulationTime() + TICKS_TO_TIME(i + 1) : 0.f,
|
||||
{},
|
||||
Vars::Aimbot::Melee::SwingPredictLag.Value ? targetStorage[target.m_pEntity].m_vPredictedOrigin : targetStorage[target.m_pEntity].m_MoveData.m_vecAbsOrigin
|
||||
Vars::Aimbot::Melee::SwingPredictLag.Value ? tStorage.m_vPredictedOrigin : tStorage.m_MoveData.m_vecAbsOrigin
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -163,9 +165,9 @@ void CAimbotMelee::SimulatePlayers(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, st
|
||||
const bool bAlwaysDraw = !Vars::Aimbot::General::AutoShoot.Value || Vars::Debug::Info.Value;
|
||||
if (!bAlwaysDraw)
|
||||
{
|
||||
mPaths[pLocal] = localStorage.m_vPath;
|
||||
mPaths[pLocal->entindex()] = localStorage.m_vPath;
|
||||
for (auto& target : targets)
|
||||
mPaths[target.m_pEntity] = targetStorage[target.m_pEntity].m_vPath;
|
||||
mPaths[target.m_pEntity->entindex()] = targetStorage[target.m_pEntity->entindex()].m_vPath;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -175,22 +177,22 @@ void CAimbotMelee::SimulatePlayers(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, st
|
||||
|
||||
if (Vars::Colors::PlayerPath.Value.a)
|
||||
{
|
||||
G::PathStorage.push_back({ localStorage.m_vPath, I::GlobalVars->curtime + 5.f, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
G::PathStorage.push_back({ localStorage.m_vPath, I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
for (auto& target : targets)
|
||||
G::PathStorage.push_back({ targetStorage[target.m_pEntity].m_vPath, I::GlobalVars->curtime + 5.f, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
G::PathStorage.push_back({ targetStorage[target.m_pEntity->entindex()].m_vPath, I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
}
|
||||
if (Vars::Colors::PlayerPathClipped.Value.a)
|
||||
{
|
||||
G::PathStorage.push_back({ localStorage.m_vPath, I::GlobalVars->curtime + 5.f, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
G::PathStorage.push_back({ localStorage.m_vPath, I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
for (auto& target : targets)
|
||||
G::PathStorage.push_back({ targetStorage[target.m_pEntity].m_vPath, I::GlobalVars->curtime + 5.f, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
G::PathStorage.push_back({ targetStorage[target.m_pEntity->entindex()].m_vPath, I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
F::MoveSim.Restore(localStorage);
|
||||
for (auto& target : targets)
|
||||
F::MoveSim.Restore(targetStorage[target.m_pEntity]);
|
||||
F::MoveSim.Restore(targetStorage[target.m_pEntity->entindex()]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -366,7 +368,8 @@ int CAimbotMelee::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* pWe
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth)
|
||||
else if (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth
|
||||
|| Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive)
|
||||
{
|
||||
auto vAngle = Math::CalcAngle(vEyePos, target.m_vPos);
|
||||
|
||||
@@ -398,17 +401,15 @@ Vec3 CAimbotMelee::Aim(Vec3 vCurAngle, Vec3 vToAngle, int iMethod)
|
||||
vReturn = vToAngle;
|
||||
break;
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
{
|
||||
auto shortDist = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
const float flDelta = fmodf((flAngleA - flAngleB), 360.f);
|
||||
return fmodf(2 * flDelta, 360.f) - flDelta;
|
||||
};
|
||||
const float t = 1.f - Vars::Aimbot::General::Smoothing.Value / 100.f;
|
||||
vReturn.x = vCurAngle.x - shortDist(vCurAngle.x, vToAngle.x) * t;
|
||||
vReturn.y = vCurAngle.y - shortDist(vCurAngle.y, vToAngle.y) * t;
|
||||
vReturn = vCurAngle.LerpAngle(vToAngle, Vars::Aimbot::General::AssistStrength.Value / 100.f);
|
||||
break;
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
Vec3 vMouseDelta = G::CurrentUserCmd->viewangles.DeltaAngle(G::LastUserCmd->viewangles);
|
||||
Vec3 vTargetDelta = vToAngle.DeltaAngle(G::LastUserCmd->viewangles);
|
||||
float flMouseDelta = vMouseDelta.Length2D(), flTargetDelta = vTargetDelta.Length2D();
|
||||
vTargetDelta = vTargetDelta.Normalized() * std::min(flMouseDelta, flTargetDelta);
|
||||
vReturn = vCurAngle - vMouseDelta + vMouseDelta.LerpAngle(vTargetDelta, Vars::Aimbot::General::AssistStrength.Value / 100.f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return vReturn;
|
||||
@@ -421,6 +422,7 @@ void CAimbotMelee::Aim(CUserCmd* pCmd, Vec3& vAngle)
|
||||
{
|
||||
case Vars::Aimbot::General::AimTypeEnum::Plain:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
pCmd->viewangles = vAngle;
|
||||
I::EngineClient->SetViewAngles(vAngle);
|
||||
break;
|
||||
@@ -467,13 +469,13 @@ void CAimbotMelee::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd
|
||||
const bool bShouldSwing = iDoubletapTicks <= (GetSwingTime(pWeapon) ? 14 : 0) || Vars::CL_Move::Doubletap::AntiWarp.Value && pLocal->m_hGroundEntity();
|
||||
|
||||
Vec3 vEyePos = pLocal->GetShootPos();
|
||||
std::unordered_map<CBaseEntity*, std::deque<TickRecord>> pRecordMap;
|
||||
std::unordered_map<CBaseEntity*, std::deque<Vec3>> mPaths;
|
||||
std::unordered_map<int, std::deque<TickRecord>> pRecordMap;
|
||||
std::unordered_map<int, std::deque<Vec3>> mPaths;
|
||||
SimulatePlayers(pLocal, pWeapon, targets, vEyePos, pRecordMap, mPaths);
|
||||
|
||||
for (auto& target : targets)
|
||||
{
|
||||
const auto iResult = CanHit(target, pLocal, pWeapon, vEyePos, pRecordMap[target.m_pEntity]);
|
||||
const auto iResult = CanHit(target, pLocal, pWeapon, vEyePos, pRecordMap[target.m_pEntity->entindex()]);
|
||||
if (!iResult) continue;
|
||||
if (iResult == 2)
|
||||
{
|
||||
@@ -519,13 +521,13 @@ void CAimbotMelee::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd
|
||||
{
|
||||
if (Vars::Colors::PlayerPath.Value.a)
|
||||
{
|
||||
G::PathStorage.push_back({ mPaths[pLocal], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
G::PathStorage.push_back({ mPaths[target.m_pEntity], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
G::PathStorage.push_back({ mPaths[pLocal->entindex()], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
G::PathStorage.push_back({ mPaths[target.m_pEntity->entindex()], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPath.Value, Vars::Visuals::Simulation::PlayerPath.Value });
|
||||
}
|
||||
if (Vars::Colors::PlayerPathClipped.Value.a)
|
||||
{
|
||||
G::PathStorage.push_back({ mPaths[pLocal], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
G::PathStorage.push_back({ mPaths[target.m_pEntity], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
G::PathStorage.push_back({ mPaths[pLocal->entindex()], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
G::PathStorage.push_back({ mPaths[target.m_pEntity->entindex()], I::GlobalVars->curtime + Vars::Visuals::Simulation::DrawDuration.Value, Vars::Colors::PlayerPathClipped.Value, Vars::Visuals::Simulation::PlayerPath.Value, true });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@ class CAimbotMelee
|
||||
|
||||
int GetSwingTime(CTFWeaponBase* pWeapon);
|
||||
void SimulatePlayers(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, std::vector<Target_t> targets, Vec3& vEyePos,
|
||||
std::unordered_map<CBaseEntity*, std::deque<TickRecord>>& pRecordMap,
|
||||
std::unordered_map<CBaseEntity*, std::deque<Vec3>>& mPaths);
|
||||
std::unordered_map<int, std::deque<TickRecord>>& pRecordMap,
|
||||
std::unordered_map<int, std::deque<Vec3>>& mPaths);
|
||||
bool CanBackstab(CBaseEntity* pTarget, CTFPlayer* pLocal, Vec3 vEyeAngles);
|
||||
int CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Vec3 vEyePos, std::deque<TickRecord>& vSimRecords);
|
||||
|
||||
|
||||
@@ -10,6 +10,11 @@
|
||||
//#define SPLASH_DEBUG2 // obstructed splash visualization
|
||||
//#define SPLASH_DEBUG3 // points visualization
|
||||
//#define SPLASH_DEBUG4 // trace visualization
|
||||
//#define SPLASH_DEBUG5 // trace count
|
||||
|
||||
#ifdef SPLASH_DEBUG5
|
||||
static std::unordered_map<std::string, int> mTraceCount = {};
|
||||
#endif
|
||||
|
||||
std::vector<Target_t> CAimbotProjectile::GetTargets(CTFPlayer* pLocal, CTFWeaponBase* pWeapon)
|
||||
{
|
||||
@@ -186,30 +191,43 @@ static inline float PrimeTime(CTFWeaponBase* pWeapon)
|
||||
|
||||
int CAimbotProjectile::GetHitboxPriority(int nHitbox, Target_t& target, Info_t& tInfo)
|
||||
{
|
||||
bool bHeadshot = target.m_iTargetType == TargetEnum::Player && tInfo.m_pWeapon->GetWeaponID() == TF_WEAPON_COMPOUND_BOW;
|
||||
if (Vars::Aimbot::Projectile::Modifiers.Value & Vars::Aimbot::Projectile::ModifiersEnum::BodyaimIfLethal && bHeadshot)
|
||||
bool bHeadshot = target.m_iTargetType == TargetEnum::Player && tInfo.m_pWeapon->GetWeaponID() == TF_WEAPON_COMPOUND_BOW
|
||||
&& Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Head;
|
||||
if (Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::BodyaimIfLethal && bHeadshot)
|
||||
{
|
||||
float charge = I::GlobalVars->curtime - tInfo.m_pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime();
|
||||
float damage = Math::RemapValClamped(charge, 0.f, 1.f, 50.f, 120.f);
|
||||
float flCharge = I::GlobalVars->curtime - tInfo.m_pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime();
|
||||
float flDamage = Math::RemapValClamped(flCharge, 0.f, 1.f, 50.f, 120.f);
|
||||
if (tInfo.m_pLocal->IsMiniCritBoosted())
|
||||
damage *= 1.36f;
|
||||
if (damage >= target.m_pEntity->As<CTFPlayer>()->m_iHealth())
|
||||
flDamage *= 1.36f;
|
||||
if (flDamage >= target.m_pEntity->As<CTFPlayer>()->m_iHealth())
|
||||
bHeadshot = false;
|
||||
|
||||
if (tInfo.m_pLocal->IsCritBoosted()) // for reliability
|
||||
bHeadshot = false;
|
||||
}
|
||||
const bool bLower = target.m_iTargetType == TargetEnum::Player && Vars::Aimbot::Projectile::Modifiers.Value & Vars::Aimbot::Projectile::ModifiersEnum::AimBlastAtFeet
|
||||
bool bLower = target.m_iTargetType == TargetEnum::Player && Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::AimBlastAtFeet
|
||||
&& target.m_pEntity->As<CTFPlayer>()->IsOnGround() && tInfo.m_flRadius;
|
||||
|
||||
if (bHeadshot)
|
||||
target.m_nAimedHitbox = HITBOX_HEAD;
|
||||
|
||||
switch (nHitbox)
|
||||
if (!(Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Auto))
|
||||
{
|
||||
case 0: return bHeadshot ? 0 : 2; // head
|
||||
case 1: return bHeadshot ? 3 : (bLower ? 1 : 0); // body
|
||||
case 2: return bHeadshot ? 3 : (bLower ? 0 : 1); // feet
|
||||
switch (nHitbox)
|
||||
{
|
||||
case 0: return Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Head ? 0 : 3;
|
||||
case 1: return Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Body ? 1 : 3;
|
||||
case 2: return Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Feet ? 2 : 3;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (nHitbox)
|
||||
{
|
||||
case 0: return Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Head ? (bHeadshot ? 0 : 2) : 3;
|
||||
case 1: return Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Body ? (bHeadshot ? 3 : (bLower ? 1 : 0)) : 3;
|
||||
case 2: return Vars::Aimbot::Projectile::Hitboxes.Value & Vars::Aimbot::Projectile::HitboxesEnum::Feet ? (bHeadshot ? 3 : (bLower ? 0 : 1)) : 3;
|
||||
}
|
||||
}
|
||||
|
||||
return 3;
|
||||
@@ -375,6 +393,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
bool bErase = false, bNormal = false;
|
||||
|
||||
SDK::TraceHull(vTargetEye, vPoint, tInfo.m_vHull * -1, tInfo.m_vHull, MASK_SOLID, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash regular"]++;
|
||||
#endif
|
||||
#ifndef SPLASH_DEBUG1
|
||||
checkPoint(trace, bErase, bNormal);
|
||||
#else
|
||||
@@ -398,6 +419,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
case Vars::Aimbot::Projectile::RocketSplashModeEnum::Regular:
|
||||
{
|
||||
SDK::Trace(vPoint, vTargetEye, MASK_SHOT, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash grate check"]++;
|
||||
#endif
|
||||
bNormal = trace.DidHit();
|
||||
#ifdef SPLASH_DEBUG2
|
||||
G::LineStorage.push_back({ { vPoint, trace.endpos }, I::GlobalVars->curtime + 60.f, bNormal ? Vars::Colors::IndicatorGood.Value : Vars::Colors::IndicatorBad.Value });
|
||||
@@ -405,6 +429,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
if (!bNormal)
|
||||
{
|
||||
SDK::TraceHull(vPoint, vTargetEye, tInfo.m_vHull * -1, tInfo.m_vHull, MASK_SOLID, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash grate"]++;
|
||||
#endif
|
||||
#ifndef SPLASH_DEBUG2
|
||||
checkPoint(trace, bErase, bNormal);
|
||||
#else
|
||||
@@ -417,6 +444,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
case Vars::Aimbot::Projectile::RocketSplashModeEnum::SpecialLight:
|
||||
{
|
||||
SDK::Trace(vPoint, vTargetEye, MASK_SOLID, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash rocket"]++;
|
||||
#endif
|
||||
bNormal = trace.fraction == 1.f /*|| trace.startsolid*/;
|
||||
if (!bNormal)
|
||||
{
|
||||
@@ -428,6 +458,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
#endif
|
||||
{
|
||||
SDK::Trace(trace.endpos + trace.plane.normal, vTargetEye, MASK_SHOT, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash rocket check"]++;
|
||||
#endif
|
||||
if (trace.fraction < 1.f)
|
||||
vPointDistances.pop_back();
|
||||
}
|
||||
@@ -437,6 +470,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
case Vars::Aimbot::Projectile::RocketSplashModeEnum::SpecialHeavy:
|
||||
{
|
||||
SDK::Trace(vTargetEye, vPoint, MASK_SOLID, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash rocket"]++;
|
||||
#endif
|
||||
bErase = trace.fraction == 1.f /*|| trace.startsolid*/;
|
||||
if (!bNormal)
|
||||
{
|
||||
@@ -446,6 +482,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
bool bAdded = false;
|
||||
|
||||
SDK::Trace(vFrom, vTo, MASK_SOLID, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash rocket (2)"]++;
|
||||
#endif
|
||||
if (trace.fraction < 1.f)
|
||||
{
|
||||
#ifndef SPLASH_DEBUG2
|
||||
@@ -456,6 +495,9 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Target_t& target, std::v
|
||||
#endif
|
||||
{
|
||||
SDK::Trace(trace.endpos + trace.plane.normal, vTargetEye, MASK_SHOT, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash rocket check"]++;
|
||||
#endif
|
||||
bAdded = trace.fraction == 1.f;
|
||||
if (!bAdded)
|
||||
vPointDistances.pop_back();
|
||||
@@ -571,7 +613,7 @@ static inline Vec3 PullPoint(Vec3 vPoint, Vec3 vLocalPos, Info_t& tInfo, Vec3 vM
|
||||
|
||||
static inline void SolveProjectileSpeed(CTFWeaponBase* pWeapon, const Vec3& vLocalPos, const Vec3& vTargetPos, float& flVelocity, float& flDragTime, const float flGravity)
|
||||
{
|
||||
if (F::ProjSim.obj->m_dragBasis.IsZero())
|
||||
if (!F::ProjSim.obj->IsDragEnabled() || F::ProjSim.obj->m_dragBasis.IsZero())
|
||||
return;
|
||||
|
||||
const float flGrav = flGravity * 800.0f;
|
||||
@@ -630,6 +672,14 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
|
||||
float flPitch, flYaw;
|
||||
{ // basic trajectory pass
|
||||
float flVelocity = tInfo.m_flVelocity, flDragTime = 0.f;
|
||||
if (F::ProjSim.obj->IsDragEnabled() && !F::ProjSim.obj->m_dragBasis.IsZero())
|
||||
{
|
||||
Vec3 vForward, vRight, vUp; Math::AngleVectors(Math::CalcAngle(vLocalPos, vTargetPos), &vForward, &vRight, &vUp);
|
||||
Vec3 vShootPos = vLocalPos + (vForward * tInfo.m_vOffset.x) + (vRight * tInfo.m_vOffset.y) + (vUp * tInfo.m_vOffset.z);
|
||||
SolveProjectileSpeed(tInfo.m_pWeapon, vShootPos, vTargetPos, flVelocity, flDragTime, tInfo.m_flGravity);
|
||||
}
|
||||
|
||||
Vec3 vDelta = vTargetPos - vLocalPos;
|
||||
float flDist = vDelta.Length2D();
|
||||
|
||||
@@ -638,14 +688,14 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
flPitch = -DEG2RAD(vAngleTo.x);
|
||||
else
|
||||
{ // arch
|
||||
float flRoot = pow(tInfo.m_flVelocity, 4) - flGrav * (flGrav * pow(flDist, 2) + 2.f * vDelta.z * pow(tInfo.m_flVelocity, 2));
|
||||
float flRoot = pow(flVelocity, 4) - flGrav * (flGrav * pow(flDist, 2) + 2.f * vDelta.z * pow(flVelocity, 2));
|
||||
if (flRoot < 0.f)
|
||||
{
|
||||
out.m_iCalculated = 3; return;
|
||||
}
|
||||
flPitch = atan((pow(tInfo.m_flVelocity, 2) - sqrt(flRoot)) / (flGrav * flDist));
|
||||
flPitch = atan((pow(flVelocity, 2) - sqrt(flRoot)) / (flGrav * flDist));
|
||||
}
|
||||
out.m_flTime = flDist / (cos(flPitch) * tInfo.m_flVelocity) - tInfo.m_flOffsetTime;
|
||||
out.m_flTime = flDist / (cos(flPitch) * flVelocity) - tInfo.m_flOffsetTime + flDragTime;
|
||||
out.m_flPitch = flPitch = -RAD2DEG(flPitch) - tInfo.m_vAngFix.x;
|
||||
out.m_flYaw = flYaw = vAngleTo.y - tInfo.m_vAngFix.y;
|
||||
}
|
||||
@@ -656,6 +706,38 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
out.m_iCalculated = 2; return;
|
||||
}
|
||||
|
||||
#ifdef SPLASH_DEBUG5
|
||||
int iFlags = (bAccuracy ? ProjSimEnum::Trace : ProjSimEnum::None) | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum;
|
||||
if (iFlags & ProjSimEnum::Trace)
|
||||
{
|
||||
if (Vars::Visuals::Trajectory::Overwrite.Value)
|
||||
{
|
||||
if (!Vars::Visuals::Trajectory::Pipes.Value)
|
||||
mTraceCount["Setup trace"]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (tInfo.m_pWeapon->GetWeaponID())
|
||||
{
|
||||
case TF_WEAPON_ROCKETLAUNCHER:
|
||||
case TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT:
|
||||
case TF_WEAPON_PARTICLE_CANNON:
|
||||
case TF_WEAPON_RAYGUN:
|
||||
case TF_WEAPON_DRG_POMSON:
|
||||
case TF_WEAPON_FLAREGUN:
|
||||
case TF_WEAPON_FLAREGUN_REVENGE:
|
||||
case TF_WEAPON_COMPOUND_BOW:
|
||||
case TF_WEAPON_CROSSBOW:
|
||||
case TF_WEAPON_SHOTGUN_BUILDING_RESCUE:
|
||||
case TF_WEAPON_SYRINGEGUN_MEDIC:
|
||||
case TF_WEAPON_FLAME_BALL:
|
||||
mTraceCount["Setup trace"]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (iFlags & ProjSimEnum::InitCheck)
|
||||
mTraceCount["Trace init check"]++;
|
||||
#endif
|
||||
ProjectileInfo projInfo = {};
|
||||
if (!F::ProjSim.GetInfo(tInfo.m_pLocal, tInfo.m_pWeapon, { flPitch, flYaw, 0 }, projInfo, (bAccuracy ? ProjSimEnum::Trace : ProjSimEnum::None) | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum))
|
||||
{
|
||||
@@ -663,8 +745,8 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
}
|
||||
|
||||
{ // calculate trajectory from projectile origin
|
||||
float flNewVel = tInfo.m_flVelocity, flDragTime = 0.f;
|
||||
SolveProjectileSpeed(tInfo.m_pWeapon, projInfo.m_vPos, vTargetPos, flNewVel, flDragTime, tInfo.m_flGravity);
|
||||
float flVelocity = tInfo.m_flVelocity, flDragTime = 0.f;
|
||||
SolveProjectileSpeed(tInfo.m_pWeapon, projInfo.m_vPos, vTargetPos, flVelocity, flDragTime, tInfo.m_flGravity);
|
||||
|
||||
Vec3 vDelta = vTargetPos - projInfo.m_vPos;
|
||||
float flDist = vDelta.Length2D();
|
||||
@@ -674,23 +756,18 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
out.m_flPitch = -DEG2RAD(vNewAngleTo.x);
|
||||
else
|
||||
{ // arch
|
||||
float flRoot = pow(flNewVel, 4) - flGrav * (flGrav * pow(flDist, 2) + 2.f * vDelta.z * pow(flNewVel, 2));
|
||||
float flRoot = pow(flVelocity, 4) - flGrav * (flGrav * pow(flDist, 2) + 2.f * vDelta.z * pow(flVelocity, 2));
|
||||
if (flRoot < 0.f)
|
||||
{
|
||||
out.m_iCalculated = 3; return;
|
||||
}
|
||||
out.m_flPitch = atan((pow(flNewVel, 2) - sqrt(flRoot)) / (flGrav * flDist));
|
||||
out.m_flPitch = atan((pow(flVelocity, 2) - sqrt(flRoot)) / (flGrav * flDist));
|
||||
}
|
||||
out.m_flTime = flDist / (cos(out.m_flPitch) * flNewVel) + flDragTime;
|
||||
out.m_flTime = flDist / (cos(out.m_flPitch) * flVelocity) + flDragTime;
|
||||
}
|
||||
|
||||
{ // correct yaw
|
||||
/*
|
||||
flYaw -= projInfo.m_vAng.y;
|
||||
out.m_flYaw = vNewAngleTo.y + flYaw - tInfo.m_vAngFix.y;
|
||||
*/
|
||||
|
||||
///*
|
||||
Vec3 vShootPos = projInfo.m_vPos - vLocalPos; vShootPos.z = 0;
|
||||
Vec3 vTarget = vTargetPos - vLocalPos;
|
||||
Vec3 vForward; Math::AngleVectors(projInfo.m_vAng, &vForward); vForward.z = 0; vForward.Normalize();
|
||||
@@ -703,18 +780,14 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
out.m_flYaw = flYaw - (RAD2DEG(atan2(vShootPos.y, vShootPos.x)) - flYaw);
|
||||
flYaw = RAD2DEG(atan2(vShootPos.y, vShootPos.x));
|
||||
}
|
||||
//*/
|
||||
}
|
||||
|
||||
{ // correct pitch
|
||||
///*
|
||||
if (flGrav)
|
||||
{
|
||||
flPitch -= projInfo.m_vAng.x;
|
||||
out.m_flPitch = -RAD2DEG(out.m_flPitch) + flPitch - tInfo.m_vAngFix.x;
|
||||
}
|
||||
//*/
|
||||
///*
|
||||
else
|
||||
{
|
||||
Vec3 vShootPos = Math::RotatePoint(projInfo.m_vPos - vLocalPos, {}, { 0, -flYaw, 0 }); vShootPos.y = 0;
|
||||
@@ -729,7 +802,6 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
out.m_flPitch = flPitch - (RAD2DEG(atan2(-vShootPos.z, vShootPos.x)) - flPitch);
|
||||
}
|
||||
}
|
||||
//*/
|
||||
}
|
||||
|
||||
iTimeTo = int(out.m_flTime / TICK_INTERVAL) + 1;
|
||||
@@ -775,6 +847,38 @@ TraceType_t CTraceFilterProjectileNoPlayer::GetTraceType() const
|
||||
|
||||
bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Target_t& target, Vec3& vPoint, Vec3& vAngles, int iSimTime, bool bSplash, std::deque<Vec3>* pProjectilePath)
|
||||
{
|
||||
#ifdef SPLASH_DEBUG5
|
||||
int iFlags = ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum;
|
||||
if (iFlags & ProjSimEnum::Trace)
|
||||
{
|
||||
if (Vars::Visuals::Trajectory::Overwrite.Value)
|
||||
{
|
||||
if (!Vars::Visuals::Trajectory::Pipes.Value)
|
||||
mTraceCount["Setup trace"]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (pWeapon->GetWeaponID())
|
||||
{
|
||||
case TF_WEAPON_ROCKETLAUNCHER:
|
||||
case TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT:
|
||||
case TF_WEAPON_PARTICLE_CANNON:
|
||||
case TF_WEAPON_RAYGUN:
|
||||
case TF_WEAPON_DRG_POMSON:
|
||||
case TF_WEAPON_FLAREGUN:
|
||||
case TF_WEAPON_FLAREGUN_REVENGE:
|
||||
case TF_WEAPON_COMPOUND_BOW:
|
||||
case TF_WEAPON_CROSSBOW:
|
||||
case TF_WEAPON_SHOTGUN_BUILDING_RESCUE:
|
||||
case TF_WEAPON_SYRINGEGUN_MEDIC:
|
||||
case TF_WEAPON_FLAME_BALL:
|
||||
mTraceCount["Setup trace"]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (iFlags & ProjSimEnum::InitCheck)
|
||||
mTraceCount["Trace init check"]++;
|
||||
#endif
|
||||
ProjectileInfo projInfo = {};
|
||||
if (!F::ProjSim.GetInfo(pLocal, pWeapon, vAngles, projInfo, ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum) || !F::ProjSim.Initialize(projInfo))
|
||||
return false;
|
||||
@@ -793,6 +897,9 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar
|
||||
{
|
||||
CTraceFilterWorldAndPropsOnly filterWorld = {};
|
||||
SDK::TraceHull(projInfo.m_vPos, vPoint, projInfo.m_vHull * -1, projInfo.m_vHull, MASK_SOLID, &filterWorld, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Nograv trace"]++;
|
||||
#endif
|
||||
#ifdef SPLASH_DEBUG4
|
||||
G::LineStorage.push_back({ { projInfo.m_vPos, vPoint }, I::GlobalVars->curtime + 5.f, { 0, 0, 0, 255 } });
|
||||
#endif
|
||||
@@ -819,6 +926,9 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar
|
||||
if (!bSplash)
|
||||
{
|
||||
SDK::TraceHull(vOld, vNew, projInfo.m_vHull * -1, projInfo.m_vHull, MASK_SOLID, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Direct trace"]++;
|
||||
#endif
|
||||
|
||||
#ifdef SPLASH_DEBUG4
|
||||
G::LineStorage.push_back({ { vOld, vNew }, I::GlobalVars->curtime + 5.f, { 255, 0, 0, 255 } });
|
||||
@@ -833,6 +943,9 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar
|
||||
continue;
|
||||
|
||||
SDK::TraceHull(vStaticPos, vNew, projInfo.m_vHull * -1, projInfo.m_vHull, MASK_SOLID, &filterSplash, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Splash trace"]++;
|
||||
#endif
|
||||
#ifdef SPLASH_DEBUG4
|
||||
G::LineStorage.push_back({ { vStaticPos, vNew }, I::GlobalVars->curtime + 5.f, { 255, 0, 0, 255 } });
|
||||
#endif
|
||||
@@ -850,6 +963,10 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar
|
||||
bool bTarget = trace.m_pEnt == target.m_pEntity || bSplash;
|
||||
bool bTime = bSplash ? trace.endpos.DistTo(vPoint) < projInfo.m_flVelocity * TICK_INTERVAL + projInfo.m_vHull.z : iSimTime - n < 5;
|
||||
bool bValid = bTarget && bTime && (bSplash ? SDK::VisPosWorld(nullptr, target.m_pEntity, trace.endpos, vPoint, MASK_SOLID) : true);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
if (bTarget && bTime && bSplash)
|
||||
mTraceCount["Splash vispos"]++;
|
||||
#endif
|
||||
|
||||
#ifdef SPLASH_DEBUG4
|
||||
G::BoxStorage.pop_back();
|
||||
@@ -870,63 +987,70 @@ bool CAimbotProjectile::TestAngle(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, Tar
|
||||
|
||||
if (bValid)
|
||||
{
|
||||
if (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth)
|
||||
switch (Vars::Aimbot::General::AimType.Value)
|
||||
{
|
||||
// attempted to have a headshot check though this seems more detrimental than useful outside of smooth aimbot
|
||||
if (target.m_nAimedHitbox == HITBOX_HEAD)
|
||||
{ // i think this is accurate? nope, 220
|
||||
const Vec3 vOffset = (trace.endpos - vNew) + (vOriginal - target.m_vPos);
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
{
|
||||
// attempted to have a headshot check though this seems more detrimental than useful outside of smooth aimbot
|
||||
if (target.m_nAimedHitbox == HITBOX_HEAD)
|
||||
{ // i think this is accurate? nope, 220
|
||||
const Vec3 vOffset = (trace.endpos - vNew) + (vOriginal - target.m_vPos);
|
||||
|
||||
Vec3 vOld = F::ProjSim.GetOrigin() + vOffset;
|
||||
F::ProjSim.RunTick(projInfo);
|
||||
Vec3 vNew = F::ProjSim.GetOrigin() + vOffset;
|
||||
Vec3 vOld = F::ProjSim.GetOrigin() + vOffset;
|
||||
F::ProjSim.RunTick(projInfo);
|
||||
Vec3 vNew = F::ProjSim.GetOrigin() + vOffset;
|
||||
|
||||
CGameTrace trace = {};
|
||||
SDK::Trace(vOld, vNew, MASK_SHOT, &filter, &trace);
|
||||
trace.endpos -= vOffset;
|
||||
CGameTrace trace = {};
|
||||
SDK::Trace(vOld, vNew, MASK_SHOT, &filter, &trace);
|
||||
#ifdef SPLASH_DEBUG5
|
||||
mTraceCount["Huntsman trace"]++;
|
||||
#endif
|
||||
trace.endpos -= vOffset;
|
||||
|
||||
if (trace.DidHit() && (trace.m_pEnt != target.m_pEntity || trace.hitbox != HITBOX_HEAD))
|
||||
break;
|
||||
|
||||
if (!trace.DidHit()) // loop and see if closest hitbox is head
|
||||
{
|
||||
auto pModel = target.m_pEntity->GetModel();
|
||||
if (!pModel) break;
|
||||
auto pHDR = I::ModelInfoClient->GetStudiomodel(pModel);
|
||||
if (!pHDR) break;
|
||||
auto pSet = pHDR->pHitboxSet(target.m_pEntity->As<CTFPlayer>()->m_nHitboxSet());
|
||||
if (!pSet) break;
|
||||
|
||||
auto pBones = H::Entities.GetBones(target.m_pEntity->entindex());
|
||||
if (!pBones)
|
||||
if (trace.DidHit() && (trace.m_pEnt != target.m_pEntity || trace.hitbox != HITBOX_HEAD))
|
||||
break;
|
||||
|
||||
Vec3 vForward = vOld - vNew; vForward.Normalize();
|
||||
const Vec3 vPos = trace.endpos + vForward * 16 + vOriginal - target.m_vPos;
|
||||
|
||||
//G::LineStorage.clear();
|
||||
//G::LineStorage.push_back({ { pLocal->GetShootPos(), vPos }, I::GlobalVars->curtime + 5.f, Vars::Colors::Prediction.Value });
|
||||
|
||||
float closestDist = 0.f; int closestId = -1;
|
||||
for (int i = 0; i < pSet->numhitboxes; ++i)
|
||||
if (!trace.DidHit()) // loop and see if closest hitbox is head
|
||||
{
|
||||
auto pBox = pSet->pHitbox(i);
|
||||
if (!pBox)
|
||||
continue;
|
||||
auto pModel = target.m_pEntity->GetModel();
|
||||
if (!pModel) break;
|
||||
auto pHDR = I::ModelInfoClient->GetStudiomodel(pModel);
|
||||
if (!pHDR) break;
|
||||
auto pSet = pHDR->pHitboxSet(target.m_pEntity->As<CTFPlayer>()->m_nHitboxSet());
|
||||
if (!pSet) break;
|
||||
|
||||
Vec3 vCenter; Math::VectorTransform((pBox->bbmin + pBox->bbmax) / 2, pBones[pBox->bone], vCenter);
|
||||
auto pBones = H::Entities.GetBones(target.m_pEntity->entindex());
|
||||
if (!pBones)
|
||||
break;
|
||||
|
||||
const float flDist = vPos.DistTo(vCenter);
|
||||
if (closestId != -1 && flDist < closestDist || closestId == -1)
|
||||
Vec3 vForward = vOld - vNew; vForward.Normalize();
|
||||
const Vec3 vPos = trace.endpos + vForward * 16 + vOriginal - target.m_vPos;
|
||||
|
||||
//G::LineStorage.clear();
|
||||
//G::LineStorage.push_back({ { pLocal->GetShootPos(), vPos }, I::GlobalVars->curtime + 5.f, Vars::Colors::Prediction.Value });
|
||||
|
||||
float closestDist = 0.f; int closestId = -1;
|
||||
for (int i = 0; i < pSet->numhitboxes; ++i)
|
||||
{
|
||||
closestDist = flDist;
|
||||
closestId = i;
|
||||
}
|
||||
}
|
||||
auto pBox = pSet->pHitbox(i);
|
||||
if (!pBox)
|
||||
continue;
|
||||
|
||||
if (closestId != 0)
|
||||
break;
|
||||
bDidHit = true;
|
||||
Vec3 vCenter; Math::VectorTransform((pBox->bbmin + pBox->bbmax) / 2, pBones[pBox->bone], vCenter);
|
||||
|
||||
const float flDist = vPos.DistTo(vCenter);
|
||||
if (closestId != -1 && flDist < closestDist || closestId == -1)
|
||||
{
|
||||
closestDist = flDist;
|
||||
closestId = i;
|
||||
}
|
||||
}
|
||||
|
||||
if (closestId != 0)
|
||||
break;
|
||||
bDidHit = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -973,6 +1097,38 @@ int CAimbotProjectile::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase
|
||||
int iMaxTime, iSplash; Info_t tInfo = { pLocal, pWeapon };
|
||||
const float flSize = target.m_pEntity->m_vecMins().DistTo(target.m_pEntity->m_vecMaxs());
|
||||
{
|
||||
#ifdef SPLASH_DEBUG5
|
||||
int iFlags = ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum;
|
||||
if (iFlags & ProjSimEnum::Trace)
|
||||
{
|
||||
if (Vars::Visuals::Trajectory::Overwrite.Value)
|
||||
{
|
||||
if (!Vars::Visuals::Trajectory::Pipes.Value)
|
||||
mTraceCount["Setup trace"]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (tInfo.m_pWeapon->GetWeaponID())
|
||||
{
|
||||
case TF_WEAPON_ROCKETLAUNCHER:
|
||||
case TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT:
|
||||
case TF_WEAPON_PARTICLE_CANNON:
|
||||
case TF_WEAPON_RAYGUN:
|
||||
case TF_WEAPON_DRG_POMSON:
|
||||
case TF_WEAPON_FLAREGUN:
|
||||
case TF_WEAPON_FLAREGUN_REVENGE:
|
||||
case TF_WEAPON_COMPOUND_BOW:
|
||||
case TF_WEAPON_CROSSBOW:
|
||||
case TF_WEAPON_SHOTGUN_BUILDING_RESCUE:
|
||||
case TF_WEAPON_SYRINGEGUN_MEDIC:
|
||||
case TF_WEAPON_FLAME_BALL:
|
||||
mTraceCount["Setup trace"]++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (iFlags & ProjSimEnum::InitCheck)
|
||||
mTraceCount["Trace init check"]++;
|
||||
#endif
|
||||
if (!F::ProjSim.GetInfo(pLocal, pWeapon, {}, projInfo, ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum) || !F::ProjSim.Initialize(projInfo, false))
|
||||
return false;
|
||||
|
||||
@@ -982,7 +1138,6 @@ int CAimbotProjectile::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase
|
||||
target.m_vPos = target.m_pEntity->m_vecOrigin();
|
||||
|
||||
tInfo.m_flLatency = F::Backtrack.GetReal() + TICKS_TO_TIME(F::Backtrack.GetAnticipatedChoke());
|
||||
tInfo.m_iLatency = TIME_TO_TICKS(tInfo.m_flLatency);
|
||||
|
||||
iMaxTime = TIME_TO_TICKS(std::min(projInfo.m_flLifetime, Vars::Aimbot::Projectile::PredictionTime.Value));
|
||||
|
||||
@@ -1014,38 +1169,51 @@ int CAimbotProjectile::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase
|
||||
for (auto& [vPoint, _] : vSpherePoints)
|
||||
G::BoxStorage.push_back({ target.m_pEntity->m_vecOrigin() + tInfo.m_vTargetEye + vPoint * tInfo.m_flRadius / (tInfo.m_flRadius + flSize), { -1, -1, -1 }, { 1, 1, 1 }, {}, I::GlobalVars->curtime + 60.f, { 0, 0, 0, 0 }, Vars::Colors::Local.Value });
|
||||
#endif
|
||||
|
||||
bool bSingleSplash = Vars::Aimbot::Projectile::SplashMode.Value == Vars::Aimbot::Projectile::SplashModeEnum::Single;
|
||||
bool bDoneRunningSplash = false;
|
||||
|
||||
Vec3 vAngleTo, vPredicted, vTarget;
|
||||
int iLowestPriority = std::numeric_limits<int>::max(); float flLowestDist = std::numeric_limits<float>::max();
|
||||
int iLowestSmoothPriority = iLowestPriority; float flLowestSmoothDist = flLowestDist;
|
||||
for (int i = 1; i < iMaxTime; i++)
|
||||
for (int i = 1 - TIME_TO_TICKS(tInfo.m_flLatency); i <= iMaxTime; i++)
|
||||
{
|
||||
const int iSimTime = i - tInfo.m_iLatency;
|
||||
if (!storage.m_bFailed)
|
||||
{
|
||||
F::MoveSim.RunTick(storage);
|
||||
target.m_vPos = storage.m_vPredictedOrigin;
|
||||
}
|
||||
if (iSimTime < 0)
|
||||
if (i < 0)
|
||||
continue;
|
||||
|
||||
bool bDirectBreaks = true;
|
||||
std::vector<Point_t> vSplashPoints = {};
|
||||
if (iSplash)
|
||||
{
|
||||
Solution_t solution; CalculateAngle(tInfo.m_vLocalEye, target.m_vPos, tInfo, iSimTime, solution, false);
|
||||
Solution_t solution; CalculateAngle(tInfo.m_vLocalEye, target.m_vPos, tInfo, i, solution, false);
|
||||
if (solution.m_iCalculated != 3)
|
||||
{
|
||||
const float flTimeTo = solution.m_flTime - TICKS_TO_TIME(iSimTime);
|
||||
if (flTimeTo < tInfo.m_flBoundingTime)
|
||||
if (!bSingleSplash)
|
||||
{
|
||||
if (vSpherePoints.empty() || flTimeTo < -tInfo.m_flBoundingTime && (tInfo.m_flPrimeTime ? iSimTime > tInfo.m_iPrimeTime : true))
|
||||
break;
|
||||
else if (tInfo.m_flPrimeTime ? iSimTime >= tInfo.m_iPrimeTime : true)
|
||||
vSplashPoints = GetSplashPoints(target, vSpherePoints, tInfo, iSimTime);
|
||||
bDirectBreaks = false;
|
||||
|
||||
const float flTimeTo = solution.m_flTime - TICKS_TO_TIME(i);
|
||||
if (flTimeTo < tInfo.m_flBoundingTime)
|
||||
{
|
||||
if (vSpherePoints.empty() || flTimeTo < -tInfo.m_flBoundingTime && (tInfo.m_flPrimeTime ? i > tInfo.m_iPrimeTime : true))
|
||||
break;
|
||||
else if (tInfo.m_flPrimeTime ? i >= tInfo.m_iPrimeTime : true)
|
||||
vSplashPoints = GetSplashPoints(target, vSpherePoints, tInfo, i);
|
||||
}
|
||||
}
|
||||
else if (TICKS_TO_TIME(i) > solution.m_flTime && !bDoneRunningSplash)
|
||||
{
|
||||
vSplashPoints = GetSplashPoints(target, vSpherePoints, tInfo, i);
|
||||
bDoneRunningSplash = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (mDirectPoints.empty())
|
||||
if (bDirectBreaks && mDirectPoints.empty())
|
||||
break;
|
||||
|
||||
std::vector<std::tuple<Point_t, int, int>> vPoints = {};
|
||||
@@ -1059,37 +1227,35 @@ int CAimbotProjectile::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase
|
||||
const bool bSplash = iIndex == -1;
|
||||
Vec3 vOriginalPoint = vPoint.m_vPoint;
|
||||
|
||||
/*
|
||||
if (target.m_nAimedHitbox == HITBOX_HEAD)
|
||||
vPoint.m_vPoint = PullPoint(vPoint.m_vPoint, tInfo.m_vLocalEye, tInfo, target.m_pEntity->m_vecMins(), target.m_pEntity->m_vecMaxs(), target.m_vPos);
|
||||
*/
|
||||
if (Vars::Aimbot::Projectile::HuntsmanPullPoint.Value && target.m_nAimedHitbox == HITBOX_HEAD)
|
||||
vPoint.m_vPoint = PullPoint(vPoint.m_vPoint, tInfo.m_vLocalEye, tInfo, target.m_pEntity->m_vecMins() + projInfo.m_vHull, target.m_pEntity->m_vecMaxs() - projInfo.m_vHull, target.m_vPos);
|
||||
//vPoint.m_vPoint = PullPoint(vPoint.m_vPoint, tInfo.m_vLocalEye, tInfo, target.m_pEntity->m_vecMins(), target.m_pEntity->m_vecMaxs(), target.m_vPos);
|
||||
|
||||
float flDist = bSplash ? target.m_vPos.DistTo(vPoint.m_vPoint) : flLowestDist;
|
||||
bool bPriority = bSplash ? iPriority <= iLowestPriority : iPriority < iLowestPriority;
|
||||
bool bTime = bSplash || tInfo.m_iPrimeTime < iSimTime || storage.m_MoveData.m_vecVelocity.IsZero();
|
||||
bool bTime = bSplash || tInfo.m_iPrimeTime < i || storage.m_MoveData.m_vecVelocity.IsZero();
|
||||
bool bDist = !bSplash || flDist < flLowestDist;
|
||||
if (!bSplash && !bPriority)
|
||||
mDirectPoints.erase(iIndex);
|
||||
if (!bPriority || !bTime || !bDist)
|
||||
continue;
|
||||
|
||||
CalculateAngle(tInfo.m_vLocalEye, vPoint.m_vPoint, tInfo, iSimTime, vPoint.m_Solution);
|
||||
/*
|
||||
if (target.m_nAimedHitbox == HITBOX_HEAD)
|
||||
{
|
||||
Solution_t tSolution;
|
||||
CalculateAngle(tInfo.m_vLocalEye, vOriginalPoint, tInfo, std::numeric_limits<int>::max(), tSolution);
|
||||
vPoint.m_Solution.m_flPitch = tSolution.m_flPitch, vPoint.m_Solution.m_flYaw = tSolution.m_flYaw;
|
||||
}
|
||||
*/
|
||||
CalculateAngle(tInfo.m_vLocalEye, vPoint.m_vPoint, tInfo, i, vPoint.m_Solution);
|
||||
if (!bSplash && (vPoint.m_Solution.m_iCalculated == 1 || vPoint.m_Solution.m_iCalculated == 3))
|
||||
mDirectPoints.erase(iIndex);
|
||||
if (vPoint.m_Solution.m_iCalculated != 1)
|
||||
continue;
|
||||
|
||||
if (Vars::Aimbot::Projectile::HuntsmanPullPoint.Value && target.m_nAimedHitbox == HITBOX_HEAD)
|
||||
{
|
||||
Solution_t tSolution;
|
||||
CalculateAngle(tInfo.m_vLocalEye, vOriginalPoint, tInfo, std::numeric_limits<int>::max(), tSolution);
|
||||
vPoint.m_Solution.m_flPitch = tSolution.m_flPitch, vPoint.m_Solution.m_flYaw = tSolution.m_flYaw;
|
||||
}
|
||||
|
||||
Vec3 vAngles = Aim(G::CurrentUserCmd->viewangles, { vPoint.m_Solution.m_flPitch, vPoint.m_Solution.m_flYaw, 0.f });
|
||||
std::deque<Vec3> vProjLines;
|
||||
if (TestAngle(pLocal, pWeapon, target, vPoint.m_vPoint, vAngles, iSimTime, bSplash, &vProjLines))
|
||||
if (TestAngle(pLocal, pWeapon, target, vPoint.m_vPoint, vAngles, i, bSplash, &vProjLines))
|
||||
{
|
||||
iLowestPriority = iPriority; flLowestDist = flDist;
|
||||
vAngleTo = vAngles, vPredicted = target.m_vPos, vTarget = vOriginalPoint;
|
||||
@@ -1099,21 +1265,27 @@ int CAimbotProjectile::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase
|
||||
pPlayerPath->push_back(storage.m_MoveData.m_vecAbsOrigin);
|
||||
*pProjectilePath = vProjLines;
|
||||
}
|
||||
else if (Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth
|
||||
&& Vars::Aimbot::General::Smoothing.Value != 0.f
|
||||
&& Vars::Aimbot::General::Smoothing.Value != 100.f)
|
||||
else
|
||||
{
|
||||
bPriority = bSplash ? iPriority <= iLowestSmoothPriority : iPriority < flLowestSmoothDist;
|
||||
bDist = !bSplash || flDist < flLowestDist;
|
||||
if (!bPriority || !bDist)
|
||||
continue;
|
||||
|
||||
Vec3 vPlainAngles = Aim({}, { vPoint.m_Solution.m_flPitch, vPoint.m_Solution.m_flYaw, 0.f }, Vars::Aimbot::General::AimTypeEnum::Plain);
|
||||
if (TestAngle(pLocal, pWeapon, target, vPoint.m_vPoint, vPlainAngles, iSimTime, bSplash))
|
||||
switch (Vars::Aimbot::General::AimType.Value)
|
||||
{
|
||||
iLowestSmoothPriority = iPriority; flLowestSmoothDist = flDist;
|
||||
target.m_vAngleTo = vAngles;
|
||||
iReturn = 2;
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
if (Vars::Aimbot::General::AssistStrength.Value != 0.f && Vars::Aimbot::General::AssistStrength.Value != 100.f)
|
||||
{
|
||||
bPriority = bSplash ? iPriority <= iLowestSmoothPriority : iPriority < flLowestSmoothDist;
|
||||
bDist = !bSplash || flDist < flLowestDist;
|
||||
if (!bPriority || !bDist)
|
||||
continue;
|
||||
|
||||
Vec3 vPlainAngles = Aim({}, { vPoint.m_Solution.m_flPitch, vPoint.m_Solution.m_flYaw, 0.f }, Vars::Aimbot::General::AimTypeEnum::Plain);
|
||||
if (TestAngle(pLocal, pWeapon, target, vPoint.m_vPoint, vPlainAngles, i, bSplash))
|
||||
{
|
||||
iLowestSmoothPriority = iPriority; flLowestSmoothDist = flDist;
|
||||
target.m_vAngleTo = vAngles;
|
||||
iReturn = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1169,7 +1341,7 @@ int CAimbotProjectile::CanHit(Target_t& target, CTFPlayer* pLocal, CTFWeaponBase
|
||||
pBoxes->push_back(bBox);
|
||||
}
|
||||
}
|
||||
if (Vars::Debug::Info.Value && target.m_nAimedHitbox == HITBOX_HEAD) // huntsman head, broken; removeme once 236 is fixed
|
||||
if (Vars::Debug::Info.Value && target.m_nAimedHitbox == HITBOX_HEAD) // huntsman head, broken; removeme once 254 is fixed
|
||||
{
|
||||
const Vec3 vOriginOffset = target.m_pEntity->m_vecOrigin() - vPredicted;
|
||||
|
||||
@@ -1210,17 +1382,15 @@ Vec3 CAimbotProjectile::Aim(Vec3 vCurAngle, Vec3 vToAngle, int iMethod)
|
||||
vReturn = vToAngle;
|
||||
break;
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
{
|
||||
auto shortDist = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
const float flDelta = fmodf((flAngleA - flAngleB), 360.f);
|
||||
return fmodf(2 * flDelta, 360.f) - flDelta;
|
||||
};
|
||||
const float t = 1.f - Vars::Aimbot::General::Smoothing.Value / 100.f;
|
||||
vReturn.x = vCurAngle.x - shortDist(vCurAngle.x, vToAngle.x) * t;
|
||||
vReturn.y = vCurAngle.y - shortDist(vCurAngle.y, vToAngle.y) * t;
|
||||
vReturn = vCurAngle.LerpAngle(vToAngle, Vars::Aimbot::General::AssistStrength.Value / 100.f);
|
||||
break;
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
Vec3 vMouseDelta = G::CurrentUserCmd->viewangles.DeltaAngle(G::LastUserCmd->viewangles);
|
||||
Vec3 vTargetDelta = vToAngle.DeltaAngle(G::LastUserCmd->viewangles);
|
||||
float flMouseDelta = vMouseDelta.Length2D(), flTargetDelta = vTargetDelta.Length2D();
|
||||
vTargetDelta = vTargetDelta.Normalized() * std::min(flMouseDelta, flTargetDelta);
|
||||
vReturn = vCurAngle - vMouseDelta + vMouseDelta.LerpAngle(vTargetDelta, Vars::Aimbot::General::AssistStrength.Value / 100.f);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return vReturn;
|
||||
@@ -1233,6 +1403,7 @@ void CAimbotProjectile::Aim(CUserCmd* pCmd, Vec3& vAngle)
|
||||
{
|
||||
case Vars::Aimbot::General::AimTypeEnum::Plain:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Smooth:
|
||||
case Vars::Aimbot::General::AimTypeEnum::Assistive:
|
||||
//pCmd->viewangles = vAngle; // retarded, overshooting with this uncommented
|
||||
I::EngineClient->SetViewAngles(vAngle);
|
||||
break;
|
||||
@@ -1412,8 +1583,17 @@ bool CAimbotProjectile::RunMain(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUser
|
||||
void CAimbotProjectile::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd)
|
||||
{
|
||||
const bool bSuccess = RunMain(pLocal, pWeapon, pCmd);
|
||||
#if defined(SPLASH_DEBUG1) || defined(SPLASH_DEBUG2) || defined(SPLASH_DEBUG4)
|
||||
SDK::Output("Traces", std::format("{}", G::LineStorage.size()).c_str());
|
||||
#if defined(SPLASH_DEBUG5)
|
||||
if (Vars::Aimbot::General::AimType.Value && !mTraceCount.empty())
|
||||
{
|
||||
int iTraceCount = 0;
|
||||
for (auto& [_, iTraces] : mTraceCount)
|
||||
iTraceCount += iTraces;
|
||||
SDK::Output("Traces", std::format("{}", iTraceCount).c_str());
|
||||
for (auto& [sType, iTraces] : mTraceCount)
|
||||
SDK::Output("Traces", std::format("{}: {}", sType, iTraces).c_str());
|
||||
}
|
||||
mTraceCount.clear();
|
||||
#endif
|
||||
|
||||
float flAmount = 0.f;
|
||||
|
||||
@@ -26,7 +26,6 @@ struct Info_t
|
||||
Vec3 m_vTargetEye = {};
|
||||
|
||||
float m_flLatency = 0.f;
|
||||
int m_iLatency = 0;
|
||||
|
||||
Vec3 m_vHull = {};
|
||||
Vec3 m_vOffset = {};
|
||||
|
||||
@@ -96,35 +96,28 @@ static inline bool CheckEntities(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUse
|
||||
if (vOrigin.DistTo(vPos) > flRadius)
|
||||
continue;
|
||||
|
||||
bool isPlayer = Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Players
|
||||
&& pEntity->IsPlayer() && !F::AimbotGlobal.ShouldIgnore(pEntity->As<CTFPlayer>(), pLocal, pWeapon);
|
||||
bool isSentry = Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Sentry
|
||||
&& pEntity->IsSentrygun();
|
||||
bool isDispenser = Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Dispenser
|
||||
&& pEntity->IsDispenser();
|
||||
bool isTeleporter = Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Teleporter
|
||||
&& pEntity->IsTeleporter();
|
||||
bool isSticky = Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Stickies
|
||||
&& pEntity->GetClassID() == ETFClassID::CTFGrenadePipebombProjectile && pEntity->As<CTFGrenadePipebombProjectile>()->HasStickyEffects() && (pWeapon->m_iItemDefinitionIndex() == Demoman_s_TheQuickiebombLauncher || pWeapon->m_iItemDefinitionIndex() == Demoman_s_TheScottishResistance);
|
||||
bool isNPC = Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::NPCs
|
||||
&& pEntity->IsNPC();
|
||||
bool isBomb = Vars::Aimbot::General::Target.Value & Vars::Aimbot::General::TargetEnum::Bombs
|
||||
&& pEntity->IsBomb();
|
||||
if (isPlayer || isSentry || isDispenser || isTeleporter || isNPC || isBomb || isSticky)
|
||||
if (F::AimbotGlobal.ShouldIgnore(pEntity, pLocal, pWeapon))
|
||||
continue;
|
||||
|
||||
if (Vars::Aimbot::Projectile::AutoDetonate.Value & Vars::Aimbot::Projectile::AutoDetonateEnum::IgnoreCloak && pEntity->IsPlayer())
|
||||
{
|
||||
if (!SDK::VisPosProjectile(pProjectile, pEntity, vOrigin, isPlayer ? pEntity->GetAbsOrigin() + pEntity->As<CTFPlayer>()->GetViewOffset() : pEntity->GetCenter(), MASK_SHOT))
|
||||
auto pPlayer = pEntity->As<CTFPlayer>();
|
||||
if (pPlayer->IsInvisible() && pPlayer->GetInvisPercentage() >= Vars::Aimbot::General::IgnoreCloakPercentage.Value)
|
||||
continue;
|
||||
|
||||
if (pCmd && pWeapon && pWeapon->m_iItemDefinitionIndex() == Demoman_s_TheScottishResistance)
|
||||
{
|
||||
Vec3 vAngleTo = Math::CalcAngle(pLocal->GetShootPos(), vOrigin);
|
||||
SDK::FixMovement(pCmd, vAngleTo);
|
||||
pCmd->viewangles = vAngleTo;
|
||||
G::PSilentAngles = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!SDK::VisPosProjectile(pProjectile, pEntity, vOrigin, pEntity->IsPlayer() ? pEntity->GetAbsOrigin() + pEntity->As<CTFPlayer>()->GetViewOffset() : pEntity->GetCenter(), MASK_SHOT))
|
||||
continue;
|
||||
|
||||
if (pCmd && pWeapon && pWeapon->m_iItemDefinitionIndex() == Demoman_s_TheScottishResistance)
|
||||
{
|
||||
Vec3 vAngleTo = Math::CalcAngle(pLocal->GetShootPos(), vOrigin);
|
||||
SDK::FixMovement(pCmd, vAngleTo);
|
||||
pCmd->viewangles = vAngleTo;
|
||||
G::PSilentAngles = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -167,7 +160,7 @@ static inline bool CheckLocal(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CBaseEn
|
||||
if (vOrigin.DistTo(vPos) > flRadius)
|
||||
return false;
|
||||
|
||||
if (!SDK::VisPosProjectile(pProjectile, pLocal, vOrigin, pLocal->GetAbsOrigin() + pLocal->m_vecViewOffset(), MASK_SHOT))
|
||||
if (!SDK::VisPosWorld(pProjectile, pLocal, vOrigin, pLocal->GetAbsOrigin() + pLocal->m_vecViewOffset(), MASK_SHOT))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
@@ -184,10 +184,9 @@ void CAutoRocketJump::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* p
|
||||
if (Vars::Debug::Info.Value)
|
||||
{
|
||||
//G::LineStorage.clear(); G::BoxStorage.clear();
|
||||
//G::LineStorage.push_back({ { vOriginal, trace.endpos }, I::GlobalVars->curtime + 5.f, {}, true });
|
||||
G::LineStorage.push_back({ { pLocal->GetShootPos(), trace.endpos}, I::GlobalVars->curtime + 5.f, {}, true });
|
||||
Vec3 angles; Math::VectorAngles(trace.plane.normal, angles);
|
||||
G::BoxStorage.push_back({ trace.endpos, { -1.f, -1.f, -1.f }, { 1.f, 1.f, 1.f }, angles, I::GlobalVars->curtime + 5.f, {}, { 0, 0, 0, 0 }, true });
|
||||
G::BoxStorage.push_back({ trace.endpos + trace.plane.normal, { -1.f, -1.f, -1.f }, { 1.f, 1.f, 1.f }, angles, I::GlobalVars->curtime + 5.f, {}, { 0, 0, 0, 0 }, true });
|
||||
G::LineStorage.push_back({ { localStorage.m_MoveData.m_vecAbsOrigin + pLocal->m_vecViewOffset(), trace.endpos + trace.plane.normal }, I::GlobalVars->curtime + 5.f, {}, true });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ float CBacktrack::GetReal(int iFlow, bool bNoFake)
|
||||
if (!pNetChan)
|
||||
return 0.f;
|
||||
|
||||
if (iFlow != -1)
|
||||
if (iFlow != MAX_FLOWS)
|
||||
return pNetChan->GetLatency(iFlow) - (bNoFake && iFlow == FLOW_INCOMING ? m_flFakeLatency : 0.f);
|
||||
return pNetChan->GetLatency(FLOW_INCOMING) + pNetChan->GetLatency(FLOW_OUTGOING) - (bNoFake ? m_flFakeLatency : 0.f);
|
||||
}
|
||||
@@ -121,8 +121,8 @@ std::deque<TickRecord> CBacktrack::GetValidRecords(std::deque<TickRecord>* pReco
|
||||
if (!pNetChan)
|
||||
return vRecords;
|
||||
|
||||
float flCorrect = std::clamp(pNetChan->GetLatency(FLOW_OUTGOING) + pNetChan->GetLatency(FLOW_INCOMING) + ROUND_TO_TICKS(m_flFakeInterp), 0.f, m_flMaxUnlag);
|
||||
int iServerTick = m_iTickCount + GetAnticipatedChoke() + Vars::Backtrack::Offset.Value + TIME_TO_TICKS(pNetChan->GetLatency(FLOW_OUTGOING));
|
||||
float flCorrect = std::clamp(F::Backtrack.GetReal(MAX_FLOWS, false) + ROUND_TO_TICKS(m_flFakeInterp), 0.f, m_flMaxUnlag);
|
||||
int iServerTick = m_iTickCount + GetAnticipatedChoke() + Vars::Backtrack::Offset.Value + TIME_TO_TICKS(F::Backtrack.GetReal(FLOW_OUTGOING));
|
||||
|
||||
for (auto& tRecord : *pRecords)
|
||||
{
|
||||
@@ -278,10 +278,12 @@ void CBacktrack::Run(CUserCmd* pCmd)
|
||||
|
||||
void CBacktrack::ResolverUpdate(CBaseEntity* pEntity)
|
||||
{
|
||||
/*
|
||||
if (!pEntity)
|
||||
return;
|
||||
|
||||
m_mRecords[pEntity].clear();
|
||||
*/
|
||||
}
|
||||
|
||||
void CBacktrack::ReportShot(int iIndex)
|
||||
|
||||
@@ -54,7 +54,7 @@ class CBacktrack
|
||||
public:
|
||||
float GetLerp();
|
||||
float GetFake();
|
||||
float GetReal(int iFlow = -1, bool bNoFake = true);
|
||||
float GetReal(int iFlow = MAX_FLOWS, bool bNoFake = true);
|
||||
int GetAnticipatedChoke(int iMethod = Vars::Aimbot::General::AimType.Value);
|
||||
|
||||
std::deque<TickRecord>* GetRecords(CBaseEntity* pEntity);
|
||||
|
||||
@@ -17,6 +17,24 @@ void CBinds::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon)
|
||||
if (G::Unload || !F::Configs.m_bConfigLoaded)
|
||||
return;
|
||||
|
||||
for (int iKey = 0; iKey < 256; iKey++)
|
||||
{
|
||||
// don't delay inputs for binds
|
||||
auto& tKey = m_mKeyStorage[iKey];
|
||||
|
||||
bool bOldIsDown = tKey.m_bIsDown;
|
||||
bool bOldIsPressed = tKey.m_bIsPressed;
|
||||
bool bOldIsDouble = tKey.m_bIsDouble;
|
||||
bool bOldIsReleased = tKey.m_bIsReleased;
|
||||
|
||||
U::KeyHandler.StoreKey(iKey, &tKey);
|
||||
|
||||
tKey.m_bIsDown = tKey.m_bIsDown || bOldIsDown;
|
||||
tKey.m_bIsPressed = tKey.m_bIsPressed || bOldIsPressed;
|
||||
tKey.m_bIsDouble = tKey.m_bIsDouble || bOldIsDouble;
|
||||
tKey.m_bIsReleased = tKey.m_bIsReleased || bOldIsReleased;
|
||||
}
|
||||
|
||||
auto setVars = [](int iBind)
|
||||
{
|
||||
const bool bDefault = iBind == DEFAULT_BIND;
|
||||
@@ -123,6 +141,7 @@ void CBinds::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon)
|
||||
};
|
||||
getBinds(DEFAULT_BIND);
|
||||
|
||||
// clear inputs for binds
|
||||
for (int iKey = 0; iKey < 256; iKey++)
|
||||
U::KeyHandler.StoreKey(iKey, &m_mKeyStorage[iKey]);
|
||||
}
|
||||
|
||||
@@ -190,7 +190,9 @@ void CConfigs::LoadJson(boost::property_tree::ptree& mapTree, std::string sName,
|
||||
// remove invalid materials
|
||||
for (auto it = val.begin(); it != val.end();)
|
||||
{
|
||||
if (FNV1A::Hash32(it->first.c_str()) == FNV1A::Hash32Const("None") || FNV1A::Hash32(it->first.c_str()) != FNV1A::Hash32Const("Original") && !F::Materials.m_mMaterials.contains(FNV1A::Hash32(it->first.c_str())))
|
||||
auto uHash = FNV1A::Hash32(it->first.c_str());
|
||||
if (uHash == FNV1A::Hash32Const("None")
|
||||
|| uHash != FNV1A::Hash32Const("Original") && !F::Materials.m_mMaterials.contains(uHash))
|
||||
it = val.erase(it);
|
||||
else
|
||||
++it;
|
||||
|
||||
@@ -96,6 +96,8 @@ void CCritHack::GetTotalCrits(CTFPlayer* pLocal, CTFWeaponBase* pWeapon)
|
||||
return;
|
||||
|
||||
auto& tStorage = m_mStorage[iSlot];
|
||||
if (!tStorage.m_bActive)
|
||||
return;
|
||||
|
||||
static float flOldBucket = 0.f; static int iOldID = 0, iOldCritChecks = 0, iOldCritSeedRequests = 0;
|
||||
const float flBucket = pWeapon->m_flCritTokenBucket(); const int iID = pWeapon->GetWeaponID(), iCritChecks = pWeapon->m_nCritChecks(), iCritSeedRequests = pWeapon->m_nCritSeedRequests();
|
||||
@@ -319,6 +321,8 @@ void CCritHack::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd)
|
||||
return;
|
||||
|
||||
auto& tStorage = m_mStorage[iSlot];
|
||||
if (!tStorage.m_bActive)
|
||||
return;
|
||||
|
||||
if (pWeapon->GetWeaponID() == TF_WEAPON_MINIGUN && pCmd->buttons & IN_ATTACK)
|
||||
pCmd->buttons &= ~IN_ATTACK2;
|
||||
@@ -339,14 +343,8 @@ void CCritHack::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd)
|
||||
int closestCrit = !tStorage.m_vCritCommands.empty() ? tStorage.m_vCritCommands.front() : 0;
|
||||
int closestSkip = !tStorage.m_vSkipCommands.empty() ? tStorage.m_vSkipCommands.front() : 0;
|
||||
|
||||
//static bool bFirstTimePredicted = true;
|
||||
//if (!I::ClientState->chokedcommands)
|
||||
// bFirstTimePredicted = true;
|
||||
//if (bAttacking && bFirstTimePredicted)
|
||||
if (bAttacking)
|
||||
{
|
||||
// bFirstTimePredicted = false;
|
||||
|
||||
const bool bCanCrit = tStorage.m_iAvailableCrits > 0 && (!m_bCritBanned || pWeapon->GetSlot() == SLOT_MELEE) && !bStreamWait;
|
||||
const bool bPressed = Vars::CritHack::ForceCrits.Value || pWeapon->GetSlot() == SLOT_MELEE && Vars::CritHack::AlwaysMeleeCrit.Value && (Vars::Aimbot::General::AutoShoot.Value ? pCmd->buttons & IN_ATTACK && !(G::Buttons & IN_ATTACK) : Vars::Aimbot::General::AimType.Value);
|
||||
if (bCanCrit && bPressed && closestCrit)
|
||||
@@ -354,8 +352,6 @@ void CCritHack::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd)
|
||||
else if (Vars::CritHack::AvoidRandom.Value && closestSkip)
|
||||
pCmd->command_number = closestSkip;
|
||||
}
|
||||
//else if (Vars::CritHack::AvoidRandom.Value && closestSkip)
|
||||
// pCmd->command_number = closestSkip;
|
||||
|
||||
//if (pCmd->command_number == closestCrit || pCmd->command_number == closestSkip)
|
||||
m_iWishRandomSeed = MD5_PseudoRandom(pCmd->command_number) & std::numeric_limits<int>::max();
|
||||
@@ -397,15 +393,6 @@ bool CCritHack::CalcIsAttackCriticalHandler(CTFPlayer* pLocal, CTFWeaponBase* pW
|
||||
if (!I::Prediction->m_bFirstTimePredicted || !pLocal || !pWeapon)
|
||||
return false;
|
||||
|
||||
if (pWeapon->GetWeaponID() == TF_WEAPON_MINIGUN || pWeapon->GetWeaponID() == TF_WEAPON_FLAMETHROWER)
|
||||
{
|
||||
static int iStaticAmmo = pLocal->GetAmmoCount(pWeapon->m_iPrimaryAmmoType());
|
||||
int iOldAmmo = iStaticAmmo;
|
||||
int iNewAmmo = iStaticAmmo = pLocal->GetAmmoCount(pWeapon->m_iPrimaryAmmoType());
|
||||
if (iOldAmmo == iNewAmmo)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_iWishRandomSeed)
|
||||
{
|
||||
*G::RandomSeed() = m_iWishRandomSeed;
|
||||
@@ -506,6 +493,9 @@ void CCritHack::Draw(CTFPlayer* pLocal)
|
||||
else
|
||||
{
|
||||
auto& tStorage = m_mStorage[iSlot];
|
||||
if (!tStorage.m_bActive)
|
||||
return;
|
||||
|
||||
auto bRapidFire = pWeapon->IsRapidFire();
|
||||
float flTickBase = TICKS_TO_TIME(pLocal->m_nTickBase());
|
||||
|
||||
|
||||
@@ -1812,8 +1812,6 @@ namespace ImGui
|
||||
}
|
||||
|
||||
// convar wrappers
|
||||
bool OldDisabled, OldTransparent;
|
||||
|
||||
template <class T>
|
||||
inline int GetBind(ConfigVar<T>& var, bool bForce = false)
|
||||
{
|
||||
@@ -1846,14 +1844,16 @@ namespace ImGui
|
||||
return var.Map[iParent];
|
||||
}
|
||||
|
||||
bool bPushedDisabled = false, bPushedTransparent = false;
|
||||
|
||||
template <class T>
|
||||
inline T FGet(ConfigVar<T>& var, bool bDisable = false)
|
||||
{
|
||||
OldDisabled = Disabled, OldTransparent = Transparent;
|
||||
|
||||
int iBind = GetBind(var);
|
||||
if (bDisable)
|
||||
{
|
||||
bPushedDisabled = false, bPushedTransparent = false;
|
||||
|
||||
if (CurrentBind == DEFAULT_BIND)
|
||||
{
|
||||
if (Vars::Menu::MenuShowsBinds.Value && var.Map[DEFAULT_BIND] != var.Value)
|
||||
@@ -1865,14 +1865,18 @@ namespace ImGui
|
||||
|
||||
if (tVal == var.Value)
|
||||
{
|
||||
Disabled = true;
|
||||
PushDisabled(true);
|
||||
bPushedDisabled = true;
|
||||
return tVal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
Transparent = CurrentBind != iBind && !(var.m_iFlags & (NOSAVE | NOBIND));
|
||||
{
|
||||
PushTransparent(CurrentBind != iBind && !(var.m_iFlags & (NOSAVE | NOBIND)));
|
||||
bPushedTransparent = true;
|
||||
}
|
||||
}
|
||||
return var.Map[iBind];
|
||||
}
|
||||
@@ -1899,7 +1903,10 @@ namespace ImGui
|
||||
}
|
||||
}
|
||||
|
||||
Disabled = OldDisabled, Transparent = OldTransparent;
|
||||
if (bPushedDisabled)
|
||||
PopDisabled();
|
||||
if (bPushedTransparent)
|
||||
PopTransparent();
|
||||
}
|
||||
|
||||
template <class T>
|
||||
|
||||
@@ -132,13 +132,13 @@ void CMenu::MenuAimbot()
|
||||
TableNextColumn();
|
||||
if (Section("General"))
|
||||
{
|
||||
FDropdown("Aim type", Vars::Aimbot::General::AimType, { "Off", "Plain", "Smooth", "Silent", "Locking" }, {}, FDropdown_Left);
|
||||
FDropdown("Aim type", Vars::Aimbot::General::AimType, { "Off", "Plain", "Smooth", "Silent", "Locking", "Assistive" }, {}, FDropdown_Left);
|
||||
FDropdown("Target selection", Vars::Aimbot::General::TargetSelection, { "FOV", "Distance" }, {}, FDropdown_Right);
|
||||
FDropdown("Target", Vars::Aimbot::General::Target, { "Players", "Sentries", "Dispensers", "Teleporters", "Stickies", "NPCs", "Bombs" }, {}, FDropdown_Multi | FDropdown_Left);
|
||||
FDropdown("Ignore", Vars::Aimbot::General::Ignore, { "Friends", "Party", "Invulnerable", "Cloaked", "Unsimulated players", "Dead Ringer", "Vaccinator", "Disguised", "Taunting" }, {}, FDropdown_Multi | FDropdown_Right);
|
||||
FSlider("Aim FOV", Vars::Aimbot::General::AimFOV, 0.f, 180.f, 1.f, "%g", FSlider_Clamp | FSlider_Precision);
|
||||
PushTransparent(FGet(Vars::Aimbot::General::AimType) != Vars::Aimbot::General::AimTypeEnum::Smooth);
|
||||
FSlider("Smoothing## Hitscan", Vars::Aimbot::General::Smoothing, 0.f, 100.f, 1.f, "%g%%", FSlider_Clamp | FSlider_Precision);
|
||||
PushTransparent(FGet(Vars::Aimbot::General::AimType) != Vars::Aimbot::General::AimTypeEnum::Smooth && FGet(Vars::Aimbot::General::AimType) != Vars::Aimbot::General::AimTypeEnum::Assistive);
|
||||
FSlider("Assist strength", Vars::Aimbot::General::AssistStrength, 0.f, 100.f, 1.f, "%g%%", FSlider_Clamp | FSlider_Precision);
|
||||
PopTransparent();
|
||||
FSlider("Max targets", Vars::Aimbot::General::MaxTargets, 1, 6, 1, "%i", FSlider_Min);
|
||||
PushTransparent(!(FGet(Vars::Aimbot::General::Ignore) & Vars::Aimbot::General::IgnoreEnum::Cloaked));
|
||||
@@ -195,20 +195,29 @@ void CMenu::MenuAimbot()
|
||||
TableNextColumn();
|
||||
if (Section("Hitscan"))
|
||||
{
|
||||
FDropdown("Hitboxes", Vars::Aimbot::Hitscan::Hitboxes, { "Head", "Body", "Pelvis", "Arms", "Legs" }, { 1 << 0, 1 << 2, 1 << 1, 1 << 3, 1 << 4 }, FDropdown_Multi, 0, nullptr, "Hitscan hitboxes");
|
||||
FDropdown("Modifiers## Hitscan", Vars::Aimbot::Hitscan::Modifiers, { "Tapfire", "Wait for headshot", "Wait for charge", "Scoped only", "Auto scope", "Bodyaim if lethal", "Auto rev minigun", "Extinguish team" }, {}, FDropdown_Multi, 0, nullptr, "Hitscan modifiers");
|
||||
FDropdown("Hitboxes## Hitscan", Vars::Aimbot::Hitscan::Hitboxes, { "Head", "Body", "Pelvis", "Arms", "Legs", "##Divider", "Bodyaim if lethal" }, {}, FDropdown_Multi | FDropdown_Left, 0, nullptr, "Hitscan hitboxes");
|
||||
FDropdown("Modifiers## Hitscan", Vars::Aimbot::Hitscan::Modifiers, { "Tapfire", "Wait for headshot", "Wait for charge", "Scoped only", "Auto scope", "Auto rev minigun", "Extinguish team" }, {}, FDropdown_Multi | FDropdown_Right, 0, nullptr, "Hitscan modifiers");
|
||||
FSlider("Point scale", Vars::Aimbot::Hitscan::PointScale, 0.f, 100.f, 5.f, "%g%%", FSlider_Clamp | FSlider_Precision);
|
||||
PushTransparent(!(FGet(Vars::Aimbot::Hitscan::Modifiers) & Vars::Aimbot::Hitscan::ModifiersEnum::Tapfire));
|
||||
FSlider("Tapfire distance", Vars::Aimbot::Hitscan::TapFireDist, 250.f, 1000.f, 50.f, "%g", FSlider_Min | FSlider_Precision);
|
||||
PopTransparent();
|
||||
} EndSection();
|
||||
if (Vars::Debug::Info.Value)
|
||||
{
|
||||
if (Section("debug## hitscan"))
|
||||
{
|
||||
FSlider("bone size subtract", Vars::Aimbot::Hitscan::BoneSizeSubtract, 0.f, 4.f, 0.25f, "%g", FSlider_Min);
|
||||
FSlider("bone size minimum scale", Vars::Aimbot::Hitscan::BoneSizeMinimumScale, 0.f, 1.f, 0.1f, "%g", FSlider_Clamp);
|
||||
} EndSection();
|
||||
}
|
||||
if (Section("Projectile"))
|
||||
{
|
||||
FDropdown("Predict", Vars::Aimbot::Projectile::StrafePrediction, { "Air strafing", "Ground strafing" }, {}, FDropdown_Multi | FDropdown_Left);
|
||||
FDropdown("Splash", Vars::Aimbot::Projectile::SplashPrediction, { "Off", "Include", "Prefer", "Only" }, {}, FDropdown_Right);
|
||||
FDropdown("Auto detonate", Vars::Aimbot::Projectile::AutoDetonate, { "Stickies", "Flares", "##Divider", "Ignore self damage" }, {}, FDropdown_Multi | FDropdown_Left);
|
||||
FDropdown("Auto detonate", Vars::Aimbot::Projectile::AutoDetonate, { "Stickies", "Flares", "##Divider", "Prevent self damage", "Ignore cloak" }, {}, FDropdown_Multi | FDropdown_Left);
|
||||
FDropdown("Auto airblast", Vars::Aimbot::Projectile::AutoAirblast, { "Enabled", "##Divider", "Redirect simple", "Redirect advanced", "##Divider", "Respect FOV"}, {}, FDropdown_Multi | FDropdown_Right); // todo: finish redirect advanced!!
|
||||
FDropdown("Modifiers## Projectile", Vars::Aimbot::Projectile::Modifiers, { "Charge shot", "Cancel charge", "Bodyaim if lethal", "Use prime time", "Aim blast at feet" }, {}, FDropdown_Multi, 0, nullptr, "Projectile modifiers");
|
||||
FDropdown("Hitboxes## Projectile", Vars::Aimbot::Projectile::Hitboxes, { "Auto", "##Divider", "Head", "Body", "Feet", "##Divider", "Bodyaim if lethal", "Aim blast at feet" }, {}, FDropdown_Multi | FDropdown_Left, 0, nullptr, "Projectile hitboxes");
|
||||
FDropdown("Modifiers## Projectile", Vars::Aimbot::Projectile::Modifiers, { "Charge shot", "Cancel charge", "Use prime time" }, {}, FDropdown_Multi | FDropdown_Right, 0, nullptr, "Projectile modifiers");
|
||||
FSlider("Max simulation time", Vars::Aimbot::Projectile::PredictionTime, 0.1f, 10.f, 0.25f, "%gs", FSlider_Min | FSlider_Precision);
|
||||
PushTransparent(!FGet(Vars::Aimbot::Projectile::StrafePrediction));
|
||||
FSlider("Hit chance", Vars::Aimbot::Projectile::Hitchance, 0.f, 100.f, 5.f, "%g%%", FSlider_Clamp | FSlider_Precision);
|
||||
@@ -254,15 +263,20 @@ void CMenu::MenuAimbot()
|
||||
FSlider("huntsman add", Vars::Aimbot::Projectile::HuntsmanAdd, 0.f, 20.f, 1.f, "%g", FSlider_Left | FSlider_Clamp | FSlider_Precision);
|
||||
FSlider("huntsman add low", Vars::Aimbot::Projectile::HuntsmanAddLow, 0.f, 20.f, 1.f, "%g", FSlider_Right | FSlider_Clamp | FSlider_Precision);
|
||||
FSlider("huntsman clamp", Vars::Aimbot::Projectile::HuntsmanClamp, 0.f, 10.f, 0.5f, "%g", FSlider_Left | FSlider_Clamp | FSlider_Precision);
|
||||
FToggle("huntsman pull point", Vars::Aimbot::Projectile::HuntsmanPullPoint, FToggle_Right);
|
||||
SetCursorPosY(GetCursorPosY() + 8);
|
||||
|
||||
FToggle("splash grates", Vars::Aimbot::Projectile::SplashGrates, FToggle_Left);
|
||||
bool bHovered; FDropdown("rocket splash mode", Vars::Aimbot::Projectile::RocketSplashMode, { "regular", "special light", "special heavy" }, {}, FDropdown_Right, 0, &bHovered);
|
||||
FTooltip("special splash type for rockets, more expensive", bHovered);
|
||||
SetCursorPosY(GetCursorPosY() - 24);
|
||||
FSlider("splash points", Vars::Aimbot::Projectile::SplashPoints, 1, 400, 5, "%i", FSlider_Left | FSlider_Min);
|
||||
FToggle("splash grates", Vars::Aimbot::Projectile::SplashGrates, FToggle_Right);
|
||||
SetCursorPosY(GetCursorPosY() + 8);
|
||||
FSlider("direct splash count", Vars::Aimbot::Projectile::SplashCountDirect, 1, 100, 1, "%i", FSlider_Left | FSlider_Min);
|
||||
FSlider("arc splash count", Vars::Aimbot::Projectile::SplashCountArc, 1, 100, 1, "%i", FSlider_Right | FSlider_Min);
|
||||
FSlider("splash trace interval", Vars::Aimbot::Projectile::SplashTraceInterval, 1, 10, 1, "%i", FSlider_Left);
|
||||
bool bHovered;
|
||||
FDropdown("splash mode", Vars::Aimbot::Projectile::SplashMode, { "multi", "single" }, {}, FDropdown_Left, 0, & bHovered);
|
||||
FTooltip("debug option to test performance,\nleave on multi if you want splash to work properly", bHovered);
|
||||
FDropdown("rocket splash mode", Vars::Aimbot::Projectile::RocketSplashMode, { "regular", "special light", "special heavy" }, {}, FDropdown_Right, 0, &bHovered);
|
||||
FTooltip("special splash type for rockets, more expensive", bHovered);
|
||||
FSlider("delta count", Vars::Aimbot::Projectile::DeltaCount, 1, 5, 1, "%i", FSlider_Left);
|
||||
FDropdown("delta mode", Vars::Aimbot::Projectile::DeltaMode, { "average", "max" }, {}, FDropdown_Right);
|
||||
} EndSection();
|
||||
@@ -2205,11 +2219,11 @@ void CMenu::MenuSettings()
|
||||
FColorPicker("Color", &tTag.Color, 0, FColorPicker_Dropdown);
|
||||
|
||||
PushDisabled(iID == DEFAULT_TAG || iID == IGNORED_TAG);
|
||||
int iLabel = Disabled ? 0 : tTag.Label;
|
||||
FDropdown("Type", &iLabel, { "Priority", "Label" }, {}, FDropdown_Right);
|
||||
tTag.Label = iLabel;
|
||||
if (Disabled)
|
||||
tTag.Label = false;
|
||||
int iLabel = Disabled ? 0 : tTag.Label;
|
||||
FDropdown("Type", &iLabel, { "Priority", "Label" }, {}, FDropdown_Right);
|
||||
tTag.Label = iLabel;
|
||||
if (Disabled)
|
||||
tTag.Label = false;
|
||||
PopDisabled();
|
||||
} EndChild();
|
||||
|
||||
@@ -2226,7 +2240,7 @@ void CMenu::MenuSettings()
|
||||
|
||||
SetCursorPos({ GetWindowWidth() - H::Draw.Scale(96), H::Draw.Scale(8) });
|
||||
PushDisabled(tTag.Name.empty());
|
||||
bCreate = FButton("##CreateButton", FButton_None, { 40, 40 });
|
||||
bCreate = FButton("##CreateButton", FButton_None, { 40, 40 });
|
||||
PopDisabled();
|
||||
SetCursorPos({ GetWindowWidth() - H::Draw.Scale(84), H::Draw.Scale(28) });
|
||||
PushTransparent(tTag.Name.empty());
|
||||
@@ -2561,7 +2575,7 @@ void CMenu::AddDraggable(const char* sTitle, ConfigVar<DragBox_t>& var, bool bSh
|
||||
return;
|
||||
|
||||
static std::unordered_map<const char*, std::pair<DragBox_t, float>> old = {};
|
||||
DragBox_t info = FGet(var);
|
||||
DragBox_t info = FGet(var, true);
|
||||
const float sizeX = H::Draw.Scale(100), sizeY = H::Draw.Scale(40);
|
||||
SetNextWindowSize({ sizeX, sizeY }, ImGuiCond_Always);
|
||||
if (!old.contains(sTitle) || info != old[sTitle].first || sizeX != old[sTitle].second)
|
||||
@@ -2599,7 +2613,7 @@ void CMenu::DrawBinds()
|
||||
return;
|
||||
|
||||
static DragBox_t old = { -2147483648, -2147483648 };
|
||||
DragBox_t info = m_bIsOpen ? FGet(Vars::Menu::BindsDisplay) : Vars::Menu::BindsDisplay.Value;
|
||||
DragBox_t info = m_bIsOpen ? FGet(Vars::Menu::BindsDisplay, true) : Vars::Menu::BindsDisplay.Value;
|
||||
if (info != old)
|
||||
SetNextWindowPos({ float(info.x), float(info.y) }, ImGuiCond_Always);
|
||||
|
||||
@@ -2786,7 +2800,7 @@ void CMenu::DrawCameraWindow()
|
||||
return;
|
||||
|
||||
static WindowBox_t old = { -2147483648, -2147483648 };
|
||||
WindowBox_t info = FGet(Vars::Visuals::Simulation::ProjectileWindow);
|
||||
WindowBox_t info = FGet(Vars::Visuals::Simulation::ProjectileWindow, true);
|
||||
if (info != old)
|
||||
{
|
||||
SetNextWindowPos({ float(info.x), float(info.y) }, ImGuiCond_Always);
|
||||
@@ -2827,7 +2841,7 @@ void CMenu::DrawRadar()
|
||||
return;
|
||||
|
||||
static WindowBox_t old = { -2147483648, -2147483648 };
|
||||
WindowBox_t info = FGet(Vars::Radar::Main::Window);
|
||||
WindowBox_t info = FGet(Vars::Radar::Main::Window, true);
|
||||
if (info != old)
|
||||
{
|
||||
SetNextWindowPos({ float(info.x), float(info.y) }, ImGuiCond_Always);
|
||||
@@ -2864,19 +2878,8 @@ void CMenu::Render()
|
||||
using namespace ImGui;
|
||||
|
||||
for (int iKey = 0; iKey < 256; iKey++)
|
||||
{
|
||||
U::KeyHandler.StoreKey(iKey);
|
||||
|
||||
// don't drop inputs for binds
|
||||
auto& tMainKey = U::KeyHandler.m_mKeyStorage[iKey];
|
||||
auto& tBindKey = F::Binds.m_mKeyStorage[iKey];
|
||||
tBindKey.m_bIsDown = tMainKey.m_bIsDown || tBindKey.m_bIsDown;
|
||||
tBindKey.m_bIsPressed = tMainKey.m_bIsPressed || tBindKey.m_bIsPressed;
|
||||
tBindKey.m_bIsDouble = tMainKey.m_bIsDouble || tBindKey.m_bIsDouble;
|
||||
tBindKey.m_bIsReleased = tMainKey.m_bIsReleased || tBindKey.m_bIsReleased;
|
||||
tBindKey.m_dPressTime = tMainKey.m_dPressTime;
|
||||
}
|
||||
|
||||
if (!F::Configs.m_bConfigLoaded || !(ImGui::GetIO().DisplaySize.x > 160.f && ImGui::GetIO().DisplaySize.y > 28.f))
|
||||
return;
|
||||
|
||||
@@ -2901,8 +2904,19 @@ void CMenu::Render()
|
||||
AddDraggable("Seed prediction", Vars::Menu::SeedPredictionDisplay, FGet(Vars::Menu::Indicators) & Vars::Menu::IndicatorsEnum::SeedPrediction);
|
||||
|
||||
F::Render.Cursor = GetMouseCursor();
|
||||
//vDisabled.clear();
|
||||
//vTransparent.clear();
|
||||
|
||||
if (!vDisabled.empty())
|
||||
{
|
||||
IM_ASSERT_USER_ERROR(0, "Calling PopDisabled() too little times: stack overflow.");
|
||||
Disabled = false;
|
||||
vDisabled.clear();
|
||||
}
|
||||
if (!vTransparent.empty())
|
||||
{
|
||||
IM_ASSERT_USER_ERROR(0, "Calling PopTransparent() too little times: stack overflow.");
|
||||
Transparent = false;
|
||||
vTransparent.clear();
|
||||
}
|
||||
}
|
||||
else
|
||||
mActiveMap.clear();
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include "../../EnginePrediction/EnginePrediction.h"
|
||||
#include "../../CritHack/CritHack.h"
|
||||
|
||||
bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& out, int iFlags, float flAutoCharge)
|
||||
bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& tInfo, int iFlags, float flAutoCharge)
|
||||
{
|
||||
if (!pPlayer || !pPlayer->IsAlive() || pPlayer->IsAGhost() || pPlayer->IsTaunting() || !pWeapon)
|
||||
return false;
|
||||
@@ -73,7 +73,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
if (Vars::Visuals::Trajectory::Overwrite.Value)
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { Vars::Visuals::Trajectory::OffX.Value, Vars::Visuals::Trajectory::OffY.Value, Vars::Visuals::Trajectory::OffZ.Value }, vPos, vAngle, !bTrace ? true : Vars::Visuals::Trajectory::Pipes.Value, bQuick);
|
||||
out = { TF_PROJECTILE_NONE, vPos, vAngle, { Vars::Visuals::Trajectory::Hull.Value, Vars::Visuals::Trajectory::Hull.Value, Vars::Visuals::Trajectory::Hull.Value }, Vars::Visuals::Trajectory::Speed.Value, Vars::Visuals::Trajectory::Gravity.Value, Vars::Visuals::Trajectory::NoSpin.Value, Vars::Visuals::Trajectory::LifeTime.Value };
|
||||
tInfo = { TF_PROJECTILE_NONE, vPos, vAngle, { Vars::Visuals::Trajectory::Hull.Value, Vars::Visuals::Trajectory::Hull.Value, Vars::Visuals::Trajectory::Hull.Value }, Vars::Visuals::Trajectory::Speed.Value, Vars::Visuals::Trajectory::Gravity.Value, Vars::Visuals::Trajectory::NoSpin.Value, Vars::Visuals::Trajectory::LifeTime.Value };
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, int(SDK::AttribHookValue(0, "centerfire_projectile", pWeapon)) == 1 ? 0.f : 12.f, bDucking ? 8.f : -3.f }, vPos, vAngle, !bTrace ? true : false, bQuick);
|
||||
float flSpeed = pPlayer->InCond(TF_COND_RUNE_PRECISION) ? 3000.f : SDK::AttribHookValue(1100.f, "mult_projectile_speed", pWeapon);
|
||||
out = { TF_PROJECTILE_ROCKET, vPos, vAngle, { 0.f, 0.f, 0.f }, flSpeed, 0.f, true };
|
||||
tInfo = { TF_PROJECTILE_ROCKET, vPos, vAngle, { 0.f, 0.f, 0.f }, flSpeed, 0.f, true };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_PARTICLE_CANNON:
|
||||
@@ -97,7 +97,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
if (pWeapon->GetWeaponID() == TF_WEAPON_DRG_POMSON)
|
||||
vPos.z -= 13.f;
|
||||
float flSpeed = bCowMangler ? 1100.f : 1200.f;
|
||||
out = { TF_PROJECTILE_ENERGY_RING, vPos, vAngle, bCowMangler ? Vec3() : Vec3(1.f, 1.f, 1.f), flSpeed, 0.f, true };
|
||||
tInfo = { TF_PROJECTILE_ENERGY_RING, vPos, vAngle, bCowMangler ? Vec3() : Vec3(1.f, 1.f, 1.f), flSpeed, 0.f, true };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_GRENADELAUNCHER: // vphysics projectiles affected by server start gravity
|
||||
@@ -111,7 +111,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
float flLifetime = flMortar
|
||||
? pWeapon->As<CTFGrenadeLauncher>()->m_flDetonateTime() > 0.f ? pWeapon->As<CTFGrenadeLauncher>()->m_flDetonateTime() - I::GlobalVars->curtime : flMortar
|
||||
: SDK::AttribHookValue(2.2f, "fuse_mult", pWeapon);
|
||||
out = { bCannon ? TF_PROJECTILE_CANNONBALL : TF_PROJECTILE_PIPEBOMB, vPos, vAngle, { 6.f, 6.f, 6.f }, flSpeed, 1.f, pWeapon->m_iItemDefinitionIndex() == Demoman_m_TheLochnLoad, flLifetime };
|
||||
tInfo = { bCannon ? TF_PROJECTILE_CANNONBALL : TF_PROJECTILE_PIPEBOMB, vPos, vAngle, { 6.f, 6.f, 6.f }, flSpeed, 1.f, pWeapon->m_iItemDefinitionIndex() == Demoman_m_TheLochnLoad, flLifetime };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_PIPEBOMBLAUNCHER:
|
||||
@@ -121,19 +121,19 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
? SDK::AttribHookValue(4.f, "stickybomb_charge_rate", pWeapon) * flAutoCharge
|
||||
: (pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime() > 0.f ? I::GlobalVars->curtime - pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime() : 0.f);
|
||||
float flSpeed = Math::RemapValClamped(flCharge, 0.f, SDK::AttribHookValue(4.f, "stickybomb_charge_rate", pWeapon), 900.f, 2400.f);
|
||||
out = { TF_PROJECTILE_PIPEBOMB_REMOTE, vPos, vAngle, { 6.f, 6.f, 6.f }, flSpeed, 1.f, false };
|
||||
tInfo = { TF_PROJECTILE_PIPEBOMB_REMOTE, vPos, vAngle, { 6.f, 6.f, 6.f }, flSpeed, 1.f, false };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_FLAREGUN:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 12.f, bDucking ? 8.f : -3.f }, vPos, vAngle, !bTrace ? true : false, bQuick);
|
||||
out = { TF_PROJECTILE_FLARE, vPos, vAngle, { 1.f, 1.f, 1.f }, SDK::AttribHookValue(2000.f, "mult_projectile_speed", pWeapon), 0.3f * flGravity, true};
|
||||
tInfo = { TF_PROJECTILE_FLARE, vPos, vAngle, { 1.f, 1.f, 1.f }, SDK::AttribHookValue(2000.f, "mult_projectile_speed", pWeapon), 0.3f * flGravity, true};
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_FLAREGUN_REVENGE:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 12.f, bDucking ? 8.f : -3.f }, vPos, vAngle, !bTrace ? true : false, bQuick);
|
||||
out = { TF_PROJECTILE_FLARE, vPos, vAngle, { 1.f, 1.f, 1.f }, 3000.f, 0.45f * flGravity, true };
|
||||
tInfo = { TF_PROJECTILE_FLARE, vPos, vAngle, { 1.f, 1.f, 1.f }, 3000.f, 0.45f * flGravity, true };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_COMPOUND_BOW:
|
||||
@@ -142,30 +142,30 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
float flCharge = pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime() > 0.f ? I::GlobalVars->curtime - pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime() : 0.f;
|
||||
float flSpeed = Math::RemapValClamped(flCharge, 0.f, 1.f, 1800.f, 2600.f);
|
||||
flGravity = Math::RemapValClamped(flCharge, 0.f, 1.f, 0.5f, 0.1f) * flGravity;
|
||||
out = { TF_PROJECTILE_ARROW, vPos, vAngle, { 1.f, 1.f, 1.f }, flSpeed, flGravity, true, 10.f /*arrows have some lifetime check for whatever reason*/ };
|
||||
tInfo = { TF_PROJECTILE_ARROW, vPos, vAngle, { 1.f, 1.f, 1.f }, flSpeed, flGravity, true, 10.f /*arrows have some lifetime check for whatever reason*/ };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_CROSSBOW:
|
||||
case TF_WEAPON_SHOTGUN_BUILDING_RESCUE:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, -3.f }, vPos, vAngle, !bTrace ? true : false, bQuick);
|
||||
out = { TF_PROJECTILE_ARROW, vPos, vAngle, pWeapon->GetWeaponID() == TF_WEAPON_CROSSBOW ? Vec3(3.f, 3.f, 3.f) : Vec3(1.f, 1.f, 1.f), 2400.f, 0.2f * flGravity, true, 10.f /*arrows have some lifetime check for whatever reason*/ };
|
||||
tInfo = { TF_PROJECTILE_ARROW, vPos, vAngle, pWeapon->GetWeaponID() == TF_WEAPON_CROSSBOW ? Vec3(3.f, 3.f, 3.f) : Vec3(1.f, 1.f, 1.f), 2400.f, 0.2f * flGravity, true, 10.f /*arrows have some lifetime check for whatever reason*/ };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_SYRINGEGUN_MEDIC:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 6.f, -8.f }, vPos, vAngle, !bTrace ? true : false, bQuick);
|
||||
out = { TF_PROJECTILE_SYRINGE, vPos, vAngle, { 1.f, 1.f, 1.f }, 1000.f, 0.3f * flGravity, true };
|
||||
tInfo = { TF_PROJECTILE_SYRINGE, vPos, vAngle, { 1.f, 1.f, 1.f }, 1000.f, 0.3f * flGravity, true };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_FLAMETHROWER: // this inherits player velocity, possibly account for
|
||||
case TF_WEAPON_FLAMETHROWER:
|
||||
{
|
||||
static auto tf_flamethrower_boxsize = U::ConVars.FindVar("tf_flamethrower_boxsize");
|
||||
const float flHull = tf_flamethrower_boxsize ? tf_flamethrower_boxsize->GetFloat() : 12.f;
|
||||
bool bFlipped = cl_flipviewmodels ? cl_flipviewmodels->GetBool() : false;
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 40.f, bFlipped ? -5.f : 5.f /*doesn't flip*/, 0.f}, vPos, vAngle, true, bQuick);
|
||||
out = { TF_PROJECTILE_FLAME_ROCKET, vPos, vAngle, { flHull, flHull, flHull }, 1000.f, 0.f, true, 0.33f };
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 40.f, bFlipped ? -5.f : 5.f /*doesn't flip*/, 0.f }, vPos, vAngle, true, bQuick);
|
||||
tInfo = { TF_PROJECTILE_FLAME_ROCKET, vPos, vAngle, { flHull, flHull, flHull }, 1000.f, 0.f, true, 0.285f };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_FLAME_BALL:
|
||||
@@ -173,13 +173,13 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
bool bFlipped = cl_flipviewmodels ? cl_flipviewmodels->GetBool() : false;
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 70.f, bFlipped ? -7.f : 7.f /*doesn't flip*/, -9.f}, vPos, vAngle, !bTrace ? true : false, bQuick);
|
||||
out = { TF_PROJECTILE_BALLOFFIRE, vPos, vAngle, { 1.f, 1.f, 1.f /*damaging hull much bigger, shouldn't matter here*/ }, 3000.f, 0.f, true, 0.2f };
|
||||
tInfo = { TF_PROJECTILE_BALLOFFIRE, vPos, vAngle, { 1.f, 1.f, 1.f /*damaging hull much bigger, shouldn't matter here*/ }, 3000.f, 0.f, true, 0.2f };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_CLEAVER:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bQuick);
|
||||
out = { TF_PROJECTILE_CLEAVER, vPos, vAngle, { 1.f, 1.f, 10.f /*weird, probably still inaccurate*/ }, 3000.f, 1.f, !bTrace ? true : false, 2.2f };
|
||||
tInfo = { TF_PROJECTILE_CLEAVER, vPos, vAngle, { 1.f, 1.f, 10.f /*weird, probably still inaccurate*/ }, 3000.f, 1.f, !bTrace ? true : false, 2.2f };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_BAT_WOOD:
|
||||
@@ -192,25 +192,25 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 0.f, 0.f, 0.f }, vPos, vAngle, true, bQuick);
|
||||
Vec3 vForward; Math::AngleVectors(vAngle, &vForward);
|
||||
vPos = (bQuick ? pPlayer->GetAbsOrigin() : pPlayer->m_vecOrigin()) + (Vec3(0, 0, 50) + vForward * 32.f) * pPlayer->m_flModelScale(); // why?
|
||||
out = { bWrapAssassin ? TF_PROJECTILE_FESTIVE_ARROW : TF_PROJECTILE_THROWABLE, vPos, vAngle, { 3.f, 3.f, 3.f }, tf_scout_stunball_base_speed ? tf_scout_stunball_base_speed->GetInt() : 3000.f, 1.f, false, bWrapAssassin ? 2.3f : 100.f };
|
||||
tInfo = { bWrapAssassin ? TF_PROJECTILE_FESTIVE_ARROW : TF_PROJECTILE_THROWABLE, vPos, vAngle, { 3.f, 3.f, 3.f }, tf_scout_stunball_base_speed ? tf_scout_stunball_base_speed->GetInt() : 3000.f, 1.f, false, bWrapAssassin ? 2.3f : 100.f };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_JAR:
|
||||
case TF_WEAPON_JAR_MILK:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bQuick);
|
||||
out = { TF_PROJECTILE_JAR, vPos, vAngle, { 3.f, 3.f, 3.f }, 1000.f, 1.f, false, 2.2f };
|
||||
tInfo = { TF_PROJECTILE_JAR, vPos, vAngle, { 3.f, 3.f, 3.f }, 1000.f, 1.f, false, 2.2f };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_JAR_GAS:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bQuick);
|
||||
out = { TF_PROJECTILE_JAR_GAS, vPos, vAngle, { 3.f, 3.f, 3.f }, 2000.f, 1.f, false, 2.2f };
|
||||
tInfo = { TF_PROJECTILE_JAR_GAS, vPos, vAngle, { 3.f, 3.f, 3.f }, 2000.f, 1.f, false, 2.2f };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_GRAPPLINGHOOK:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, -8.f, -3.f }, vPos, vAngle, false, bQuick);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, -8.f, -3.f }, vPos, vAngle, !bTrace ? true : false, bQuick);
|
||||
static auto tf_grapplinghook_projectile_speed = U::ConVars.FindVar("tf_grapplinghook_projectile_speed");
|
||||
static auto tf_grapplinghook_max_distance = U::ConVars.FindVar("tf_grapplinghook_max_distance");
|
||||
float flSpeed = tf_grapplinghook_projectile_speed ? tf_grapplinghook_projectile_speed->GetFloat() : 1500.f;
|
||||
@@ -224,7 +224,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
}
|
||||
}
|
||||
float flLifetime = (tf_grapplinghook_max_distance ? tf_grapplinghook_max_distance->GetFloat() : 2000.f) / flSpeed;
|
||||
out = { TF_PROJECTILE_GRAPPLINGHOOK, vPos, vAngle, { 1.2f, 1.2f, 1.2f }, flSpeed, 0.f, false, flLifetime };
|
||||
tInfo = { TF_PROJECTILE_GRAPPLINGHOOK, vPos, vAngle, { 1.2f, 1.2f, 1.2f }, flSpeed, 0.f, false, flLifetime };
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -239,37 +239,38 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
case Heavy_s_SecondBanana:
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 0.f, 0.f, -8.f }, vPos, vAngle, true, bQuick);
|
||||
vAngle -= Vec3(10, 0, 0);
|
||||
out = { TF_PROJECTILE_BREAD_MONSTER, vPos, vAngle, bQuick ? Vec3(4.f, 4.f, 4.f) : Vec3(17.f, 17.f, 17.f), 500.f, 1.f * flGravity, false };
|
||||
tInfo = { TF_PROJECTILE_BREAD_MONSTER, vPos, vAngle, bQuick ? Vec3(4.f, 4.f, 4.f) : Vec3(17.f, 17.f, 17.f), 500.f, 1.f * flGravity, false };
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CProjectileSimulation::GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& out, int iFlags, float flAutoCharge)
|
||||
bool CProjectileSimulation::GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& tInfo, int iFlags, float flAutoCharge)
|
||||
{
|
||||
bool InitCheck = iFlags & ProjSimEnum::InitCheck;
|
||||
bool bQuick = iFlags & ProjSimEnum::Quick;
|
||||
|
||||
const float flOldCurrentTime = I::GlobalVars->curtime;
|
||||
I::GlobalVars->curtime = TICKS_TO_TIME(pPlayer->m_nTickBase());
|
||||
bool bReturn = GetInfoMain(pPlayer, pWeapon, vAngles, out, iFlags, flAutoCharge);
|
||||
out.m_bQuick = bQuick;
|
||||
bool bReturn = GetInfoMain(pPlayer, pWeapon, vAngles, tInfo, iFlags, flAutoCharge);
|
||||
tInfo.m_pOwner = pPlayer;
|
||||
tInfo.m_bQuick = bQuick;
|
||||
I::GlobalVars->curtime = flOldCurrentTime;
|
||||
|
||||
if (!bReturn || !InitCheck)
|
||||
return bReturn;
|
||||
|
||||
const Vec3 vStart = bQuick ? pPlayer->GetEyePosition() : pPlayer->GetShootPos();
|
||||
const Vec3 vEnd = out.m_vPos;
|
||||
const Vec3 vEnd = tInfo.m_vPos;
|
||||
|
||||
CGameTrace trace = {};
|
||||
CTraceFilterWorldAndPropsOnly filter = {};
|
||||
SDK::TraceHull(vStart, vEnd, out.m_vHull * -1.f, out.m_vHull, MASK_SOLID, &filter, &trace);
|
||||
SDK::TraceHull(vStart, vEnd, tInfo.m_vHull * -1.f, tInfo.m_vHull, MASK_SOLID, &filter, &trace);
|
||||
return !trace.DidHit();
|
||||
}
|
||||
|
||||
bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
bool CProjectileSimulation::Initialize(ProjectileInfo& tInfo, bool bSimulate)
|
||||
{
|
||||
if (!env)
|
||||
env = I::Physics->CreateEnvironment();
|
||||
@@ -287,7 +288,7 @@ bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
params.rotInertiaLimit = 0.f;
|
||||
params.enableCollisions = false;
|
||||
|
||||
obj = env->CreatePolyObject(col, 0, info.m_vPos, info.m_vAng, ¶ms);
|
||||
obj = env->CreatePolyObject(col, 0, tInfo.m_vPos, tInfo.m_vAng, ¶ms);
|
||||
|
||||
obj->Wake();
|
||||
}
|
||||
@@ -303,7 +304,7 @@ bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
|
||||
// these values were dumped from the server by firing the projectiles with 0 0 0 angles
|
||||
// they are calculated in CPhysicsObject::RecomputeDragBases
|
||||
switch (info.m_iType)
|
||||
switch (tInfo.m_iType)
|
||||
{
|
||||
case TF_PROJECTILE_NONE:
|
||||
flDrag = Vars::Visuals::Trajectory::Drag.Value;
|
||||
@@ -360,10 +361,10 @@ bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
|
||||
//set position and velocity
|
||||
{
|
||||
Vec3 vForward, vRight, vUp; Math::AngleVectors(info.m_vAng, &vForward, &vRight, &vUp);
|
||||
Vec3 vVelocity = vForward * info.m_flVelocity, vAngularVelocity;
|
||||
Vec3 vForward, vRight, vUp; Math::AngleVectors(tInfo.m_vAng, &vForward, &vRight, &vUp);
|
||||
Vec3 vVelocity = vForward * tInfo.m_flVelocity, vAngularVelocity;
|
||||
|
||||
switch (info.m_iType)
|
||||
switch (tInfo.m_iType)
|
||||
{
|
||||
case TF_PROJECTILE_NONE:
|
||||
vVelocity += vUp * Vars::Visuals::Trajectory::UpVelocity.Value;
|
||||
@@ -373,7 +374,7 @@ bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
case TF_PROJECTILE_PIPEBOMB_REMOTE:
|
||||
case TF_PROJECTILE_PIPEBOMB_PRACTICE:
|
||||
case TF_PROJECTILE_CANNONBALL:
|
||||
if (!info.m_bQuick && G::CurrentUserCmd)
|
||||
if (!tInfo.m_bQuick && G::CurrentUserCmd)
|
||||
{
|
||||
vVelocity += vUp * 200.f + vUp * SDK::RandomFloat(-10.f, 10.f) + vRight * SDK::RandomFloat(-10.f, 10.f);
|
||||
vAngularVelocity = { 600.f, float(SDK::RandomInt(-1200, 1200)), 0.f };
|
||||
@@ -385,29 +386,42 @@ bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
case TF_PROJECTILE_CLEAVER:
|
||||
vVelocity = vForward * 10 + vUp;
|
||||
vVelocity.Normalize();
|
||||
vVelocity *= info.m_flVelocity;
|
||||
vVelocity *= tInfo.m_flVelocity;
|
||||
vAngularVelocity = { 0.f, 500.f, 0.f };
|
||||
break;
|
||||
case TF_PROJECTILE_THROWABLE:
|
||||
case TF_PROJECTILE_FESTIVE_ARROW:
|
||||
vVelocity = vForward * 10 + vUp;
|
||||
vVelocity.Normalize();
|
||||
vVelocity *= info.m_flVelocity;
|
||||
vVelocity *= tInfo.m_flVelocity;
|
||||
vAngularVelocity = { 0.f, 100.f, 0.f };
|
||||
break;
|
||||
case TF_PROJECTILE_JAR:
|
||||
case TF_PROJECTILE_JAR_GAS:
|
||||
vVelocity += vUp * 200.f;
|
||||
vAngularVelocity = { 300.f, 0.f, 0.f };
|
||||
break;
|
||||
case TF_PROJECTILE_FLAME_ROCKET:
|
||||
if (bSimulate && tInfo.m_pOwner)
|
||||
{
|
||||
Vec3 vOwnerVelocity = tInfo.m_pOwner->m_vecVelocity();
|
||||
if (!vOwnerVelocity.IsZero())
|
||||
{
|
||||
float flOwnerVelocity = vOwnerVelocity.Length();
|
||||
|
||||
float flDot = vForward.Dot(vOwnerVelocity) / flOwnerVelocity;
|
||||
vVelocity = vForward * (tInfo.m_flVelocity + flOwnerVelocity * flDot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (info.m_bNoSpin)
|
||||
if (tInfo.m_bNoSpin)
|
||||
vAngularVelocity.Zero();
|
||||
|
||||
if (bSimulate && obj->m_dragBasis.IsZero()) // don't include vphysics projectiles
|
||||
vVelocity.z += 400.f * info.m_flGravity * TICK_INTERVAL; // i don't know why this makes it more accurate but it does
|
||||
if (bSimulate && !F::ProjSim.obj->IsDragEnabled() && obj->m_dragBasis.IsZero()) // don't include vphysics projectiles
|
||||
vVelocity.z += 400.f * tInfo.m_flGravity * TICK_INTERVAL; // i don't know why this makes it more accurate but it does
|
||||
|
||||
obj->SetPosition(info.m_vPos, info.m_vAng, true);
|
||||
obj->SetPosition(tInfo.m_vPos, tInfo.m_vAng, true);
|
||||
obj->SetVelocity(&vVelocity, &vAngularVelocity);
|
||||
}
|
||||
|
||||
@@ -417,7 +431,7 @@ bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
float vMaxAngularVelocity = 1000000.f;
|
||||
|
||||
//only pipes need k_flMaxVelocity and k_flMaxAngularVelocity
|
||||
switch (info.m_iType)
|
||||
switch (tInfo.m_iType)
|
||||
{
|
||||
case TF_PROJECTILE_NONE:
|
||||
if (Vars::Visuals::Trajectory::MaxVelocity.Value)
|
||||
@@ -442,23 +456,23 @@ bool CProjectileSimulation::Initialize(ProjectileInfo& info, bool bSimulate)
|
||||
|
||||
env->SetPerformanceSettings(¶ms);
|
||||
env->SetAirDensity(2.f);
|
||||
env->SetGravity({ 0.f, 0.f, -(800.f * info.m_flGravity) });
|
||||
env->SetGravity({ 0.f, 0.f, -(800.f * tInfo.m_flGravity) });
|
||||
|
||||
env->ResetSimulationClock(); // not needed?
|
||||
env->ResetSimulationClock();
|
||||
}
|
||||
|
||||
RunTick(info, false); // simulate an initial time because dumb
|
||||
RunTick(tInfo, false); // simulate an initial time because dumb
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void CProjectileSimulation::RunTick(ProjectileInfo& info, bool bPath)
|
||||
void CProjectileSimulation::RunTick(ProjectileInfo& tInfo, bool bPath) // bug: per frame projectile trace can cause inconsistencies?
|
||||
{
|
||||
if (!env)
|
||||
return;
|
||||
|
||||
if (bPath)
|
||||
info.m_vPath.push_back(GetOrigin());
|
||||
tInfo.m_vPath.push_back(GetOrigin());
|
||||
|
||||
env->Simulate(TICK_INTERVAL);
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ struct ProjectileInfo
|
||||
bool m_bNoSpin = false;
|
||||
float m_flLifetime = 60.f;
|
||||
|
||||
CTFPlayer* m_pOwner = nullptr;
|
||||
|
||||
std::deque<Vec3> m_vPath = {};
|
||||
|
||||
bool m_bQuick = false;
|
||||
@@ -30,7 +32,7 @@ struct ProjectileInfo
|
||||
|
||||
class CProjectileSimulation
|
||||
{
|
||||
bool GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& out, int iFlags, float flAutoCharge);
|
||||
bool GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& tInfo, int iFlags, float flAutoCharge);
|
||||
|
||||
const objectparams_t g_PhysDefaultObjectParams =
|
||||
{
|
||||
@@ -48,9 +50,9 @@ class CProjectileSimulation
|
||||
};
|
||||
|
||||
public:
|
||||
bool GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& out, int iFlags = ProjSimEnum::Trace | ProjSimEnum::InitCheck, float flAutoCharge = -1.f);
|
||||
bool Initialize(ProjectileInfo& info, bool bSimulate = true);
|
||||
void RunTick(ProjectileInfo& info, bool bPath = true);
|
||||
bool GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& tInfo, int iFlags = ProjSimEnum::Trace | ProjSimEnum::InitCheck, float flAutoCharge = -1.f);
|
||||
bool Initialize(ProjectileInfo& tInfo, bool bSimulate = true);
|
||||
void RunTick(ProjectileInfo& tInfo, bool bPath = true);
|
||||
Vec3 GetOrigin();
|
||||
Vec3 GetVelocity();
|
||||
|
||||
|
||||
@@ -21,6 +21,9 @@ void CSpectate::NetUpdateEnd(CTFPlayer* pLocal)
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
m_pOriginalTarget = pLocal->m_hObserverTarget().Get();
|
||||
m_iOriginalMode = pLocal->m_iObserverMode();
|
||||
if (!pEntity)
|
||||
return;
|
||||
|
||||
@@ -36,6 +39,18 @@ void CSpectate::NetUpdateEnd(CTFPlayer* pLocal)
|
||||
pLocal->m_iObserverMode() = Vars::Visuals::ThirdPerson::Enabled.Value ? OBS_MODE_THIRDPERSON : OBS_MODE_FIRSTPERSON;
|
||||
pLocal->m_vecViewOffset() = pEntity->GetViewOffset();
|
||||
Vars::Visuals::ThirdPerson::Enabled.Value ? I::Input->CAM_ToThirdPerson() : I::Input->CAM_ToFirstPerson();
|
||||
|
||||
m_pTargetTarget = pLocal->m_hObserverTarget().Get();
|
||||
m_iTargetMode = pLocal->m_iObserverMode();
|
||||
}
|
||||
|
||||
void CSpectate::NetUpdateStart(CTFPlayer* pLocal)
|
||||
{
|
||||
if (!pLocal || m_iTarget == -1)
|
||||
return;
|
||||
|
||||
pLocal->m_hObserverTarget().Set(m_pOriginalTarget);
|
||||
pLocal->m_iObserverMode() = m_iOriginalMode;
|
||||
}
|
||||
|
||||
void CSpectate::CreateMove(CTFPlayer* pLocal, CUserCmd* pCmd)
|
||||
|
||||
@@ -5,12 +5,18 @@ class CSpectate
|
||||
{
|
||||
public:
|
||||
void NetUpdateEnd(CTFPlayer* pLocal);
|
||||
void NetUpdateStart(CTFPlayer* pLocal);
|
||||
void CreateMove(CTFPlayer* pLocal, CUserCmd* pCmd);
|
||||
void SetTarget(int iTarget);
|
||||
|
||||
int m_iTarget = -1;
|
||||
int m_iIntendedTarget = -1;
|
||||
Vec3 m_vOldView = {}; // don't let spectating change viewangles
|
||||
|
||||
CBaseEntity* m_pOriginalTarget;
|
||||
int m_iOriginalMode = OBS_MODE_NONE;
|
||||
CBaseEntity* m_pTargetTarget;
|
||||
int m_iTargetMode = OBS_MODE_NONE;
|
||||
};
|
||||
|
||||
ADD_FEATURE(CSpectate, Spectate)
|
||||
@@ -254,8 +254,8 @@ void CTickshiftHandler::CLMove(float accumulated_extra_samples, bool bFinalTick)
|
||||
|
||||
#ifndef TICKBASE_DEBUG
|
||||
while (m_iShiftedTicks > m_iShiftedGoal)
|
||||
//CLMoveFunc(accumulated_extra_samples, m_iShiftedTicks - 1 == m_iShiftedGoal);
|
||||
CLMoveFunc(accumulated_extra_samples, bFinalTick);
|
||||
CLMoveFunc(accumulated_extra_samples, m_iShiftedTicks - 1 == m_iShiftedGoal);
|
||||
//CLMoveFunc(accumulated_extra_samples, bFinalTick);
|
||||
#else
|
||||
if (Vars::Debug::Info.Value)
|
||||
SDK::Output("Pre loop", "", { 0, 255, 255, 255 });
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "ESP.h"
|
||||
|
||||
#include "../../Players/PlayerUtils.h"
|
||||
#include "../../Spectate/Spectate.h"
|
||||
#include "../../Simulation/MovementSimulation/MovementSimulation.h"
|
||||
|
||||
MAKE_SIGNATURE(CTFPlayerSharedUtils_GetEconItemViewByLoadoutSlot, "client.dll", "48 89 6C 24 ? 56 41 54 41 55 41 56 41 57 48 83 EC", 0x0);
|
||||
@@ -27,13 +28,23 @@ void CESP::StorePlayers(CTFPlayer* pLocal)
|
||||
if (!(Vars::ESP::Draw.Value & Vars::ESP::DrawEnum::Players) || !Vars::ESP::Player.Value)
|
||||
return;
|
||||
|
||||
auto pObserverTarget = pLocal->m_hObserverTarget().Get();
|
||||
int iObserverMode = pLocal->m_iObserverMode();
|
||||
if (F::Spectate.m_iTarget != -1)
|
||||
{
|
||||
pObserverTarget = F::Spectate.m_pTargetTarget;
|
||||
iObserverMode = F::Spectate.m_iTargetMode;
|
||||
}
|
||||
|
||||
auto pResource = H::Entities.GetPR();
|
||||
for (auto pEntity : H::Entities.GetGroup(EGroupType::PLAYERS_ALL))
|
||||
{
|
||||
auto pPlayer = pEntity->As<CTFPlayer>();
|
||||
int iIndex = pPlayer->entindex();
|
||||
|
||||
if (pLocal->m_iObserverMode() == OBS_MODE_FIRSTPERSON ? pLocal->m_hObserverTarget().Get() == pPlayer : iIndex == I::EngineClient->GetLocalPlayer())
|
||||
if ((iObserverMode == OBS_MODE_FIRSTPERSON || iObserverMode == OBS_MODE_THIRDPERSON)
|
||||
? pObserverTarget == pPlayer
|
||||
: iIndex == I::EngineClient->GetLocalPlayer())
|
||||
{
|
||||
if (!(Vars::ESP::Player.Value & Vars::ESP::PlayerEnum::Local) || !I::Input->CAM_IsThirdPerson())
|
||||
continue;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "SpectatorList.h"
|
||||
|
||||
#include "../../Players/PlayerUtils.h"
|
||||
#include "../../Spectate/Spectate.h"
|
||||
|
||||
bool CSpectatorList::GetSpectators(CTFPlayer* pTarget)
|
||||
{
|
||||
@@ -9,8 +10,19 @@ bool CSpectatorList::GetSpectators(CTFPlayer* pTarget)
|
||||
for (auto pEntity : H::Entities.GetGroup(EGroupType::PLAYERS_ALL))
|
||||
{
|
||||
auto pPlayer = pEntity->As<CTFPlayer>();
|
||||
int iIndex = pPlayer->entindex();
|
||||
bool bLocal = pEntity->entindex() == I::EngineClient->GetLocalPlayer();
|
||||
|
||||
if (pPlayer->IsAlive() || pPlayer->m_hObserverTarget().Get() != pTarget || pEntity->entindex() == I::EngineClient->GetLocalPlayer() && !I::EngineClient->IsPlayingDemo())
|
||||
auto pObserverTarget = pPlayer->m_hObserverTarget().Get();
|
||||
int iObserverMode = pPlayer->m_iObserverMode();
|
||||
if (bLocal && F::Spectate.m_iTarget != -1)
|
||||
{
|
||||
pObserverTarget = F::Spectate.m_pOriginalTarget;
|
||||
iObserverMode = F::Spectate.m_iOriginalMode;
|
||||
}
|
||||
|
||||
if (pPlayer->IsAlive() || pObserverTarget != pTarget
|
||||
|| bLocal && !I::EngineClient->IsPlayingDemo() && F::Spectate.m_iTarget == -1)
|
||||
{
|
||||
auto it = m_mRespawnCache.find(pPlayer->entindex());
|
||||
if (it != m_mRespawnCache.end())
|
||||
@@ -18,10 +30,8 @@ bool CSpectatorList::GetSpectators(CTFPlayer* pTarget)
|
||||
continue;
|
||||
}
|
||||
|
||||
int iIndex = pPlayer->entindex();
|
||||
|
||||
std::string sMode;
|
||||
switch (pPlayer->m_iObserverMode())
|
||||
switch (iObserverMode)
|
||||
{
|
||||
case OBS_MODE_FIRSTPERSON: sMode = "1st"; break;
|
||||
case OBS_MODE_THIRDPERSON: sMode = "3rd"; break;
|
||||
|
||||
@@ -118,7 +118,7 @@ void CVisuals::DrawPing(CTFPlayer* pLocal)
|
||||
H::Draw.StringOutlined(fFont, x, y += nTall, Vars::Menu::Theme::Active.Value, Vars::Menu::Theme::Background.Value, align, "Scoreboard %d ms", iLatencyScoreboard);
|
||||
}
|
||||
|
||||
static std::deque<Vec3> SplashTrace(Vec3 vOrigin, float flRadius, Vec3 vNormal = { 0, 0, 1 }, bool bTrace = true, int iSegments = 32)
|
||||
static std::deque<Vec3> SplashTrace(Vec3 vOrigin, float flRadius, Vec3 vNormal = { 0, 0, 1 }, bool bTrace = true, int iSegments = 100)
|
||||
{
|
||||
if (!flRadius)
|
||||
return {};
|
||||
@@ -134,7 +134,7 @@ static std::deque<Vec3> SplashTrace(Vec3 vOrigin, float flRadius, Vec3 vNormal =
|
||||
{
|
||||
CGameTrace trace = {};
|
||||
CTraceFilterWorldAndPropsOnly filter = {};
|
||||
SDK::Trace(vOrigin, vPoint, MASK_SOLID, &filter, &trace);
|
||||
SDK::Trace(vOrigin, vPoint, MASK_SHOT, &filter, &trace);
|
||||
vPoint = trace.endpos;
|
||||
}
|
||||
vPoints.push_back(vPoint);
|
||||
@@ -160,15 +160,12 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const
|
||||
return;
|
||||
|
||||
pWeapon = pPlayer->m_hActiveWeapon().Get()->As<CTFWeaponBase>();
|
||||
if (!pWeapon || pWeapon->GetWeaponID() == TF_WEAPON_FLAMETHROWER)
|
||||
return;
|
||||
|
||||
if (I::Input->CAM_IsThirdPerson())
|
||||
vAngles = pPlayer->GetEyeAngles();
|
||||
|
||||
pPlayer->m_vecViewOffset() = pPlayer->GetViewOffset();
|
||||
}
|
||||
else if (!pPlayer || !pWeapon || pWeapon->GetWeaponID() == TF_WEAPON_FLAMETHROWER)
|
||||
if (!pPlayer || !pWeapon || pWeapon->GetWeaponID() == TF_WEAPON_FLAMETHROWER)
|
||||
return;
|
||||
|
||||
ProjectileInfo projInfo = {};
|
||||
@@ -193,7 +190,7 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (projInfo.m_vPath.empty())
|
||||
return;
|
||||
|
||||
@@ -584,6 +581,25 @@ std::vector<DrawBox> CVisuals::GetHitboxes(matrix3x4 aBones[MAXSTUDIOBONES], CBa
|
||||
tFace = bTargeted ? Vars::Colors::TargetHitboxFaceClipped.Value : Vars::Colors::BoneHitboxFaceClipped.Value;
|
||||
if (tEdge.a || tFace.a)
|
||||
vBoxes.push_back({ vOrigin, vMins, vMaxs, vAngle, I::GlobalVars->curtime + Vars::Visuals::Hitbox::DrawDuration.Value, tEdge, tFace, true });
|
||||
|
||||
if (Vars::Debug::Info.Value)
|
||||
{
|
||||
float flBoneScale = std::max(Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value, Vars::Aimbot::Hitscan::PointScale.Value / 100.f);
|
||||
float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value;
|
||||
|
||||
Vec3 vCheckMins = (pBox->bbmin + flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale();
|
||||
Vec3 vCheckMaxs = (pBox->bbmax - flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale();
|
||||
|
||||
Color_t tEdge = bTargeted ? Vars::Colors::TargetHitboxEdge.Value : Vars::Colors::BoneHitboxEdge.Value;
|
||||
Color_t tFace = bTargeted ? Vars::Colors::TargetHitboxFace.Value : Vars::Colors::BoneHitboxFace.Value;
|
||||
if (tEdge.a || tFace.a)
|
||||
vBoxes.push_back({ vOrigin, vCheckMins, vCheckMaxs, vAngle, I::GlobalVars->curtime + Vars::Visuals::Hitbox::DrawDuration.Value, tEdge, tFace });
|
||||
|
||||
tEdge = bTargeted ? Vars::Colors::TargetHitboxEdgeClipped.Value : Vars::Colors::BoneHitboxEdgeClipped.Value;
|
||||
tFace = bTargeted ? Vars::Colors::TargetHitboxFaceClipped.Value : Vars::Colors::BoneHitboxFaceClipped.Value;
|
||||
if (tEdge.a || tFace.a)
|
||||
vBoxes.push_back({ vOrigin, vCheckMins, vCheckMaxs, vAngle, I::GlobalVars->curtime + Vars::Visuals::Hitbox::DrawDuration.Value, tEdge, tFace, true });
|
||||
}
|
||||
}
|
||||
|
||||
return vBoxes;
|
||||
@@ -917,7 +933,7 @@ void CVisuals::Event(IGameEvent* pEvent, uint32_t uHash)
|
||||
if (!pBones)
|
||||
return;
|
||||
|
||||
auto vBoxes = F::Visuals.GetHitboxes(pBones, pEntity);
|
||||
auto vBoxes = GetHitboxes(pBones, pEntity);
|
||||
G::BoxStorage.insert(G::BoxStorage.end(), vBoxes.begin(), vBoxes.end());
|
||||
|
||||
return;
|
||||
|
||||
@@ -52,7 +52,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
MAKE_SIGNATURE(CBasePlayer_PostDataUpdate_SetAbsVelocity_Call, "client.dll", "E8 ? ? ? ? 0F 28 74 24 ? 8B D6", 0x5);
|
||||
MAKE_SIGNATURE(CBasePlayer_PostDataUpdate_SetAbsVelocity_Call, "client.dll", "0F 28 74 24 ? 8B D6", 0x0);
|
||||
|
||||
MAKE_HOOK(CBaseEntity_SetAbsVelocity, S::CBaseEntity_SetAbsVelocity(), void,
|
||||
void* rcx, const Vec3& vecAbsVelocity)
|
||||
@@ -65,7 +65,7 @@ MAKE_HOOK(CBaseEntity_SetAbsVelocity, S::CBaseEntity_SetAbsVelocity(), void,
|
||||
const auto pPlayer = reinterpret_cast<CTFPlayer*>(rcx);
|
||||
if (pPlayer->IsDormant() || !G::VelocityMap.contains(pPlayer->entindex()) || G::VelocityMap[pPlayer->entindex()].empty())
|
||||
return CALL_ORIGINAL(rcx, vecAbsVelocity);
|
||||
|
||||
|
||||
auto& vRecords = G::VelocityMap[pPlayer->entindex()];
|
||||
bool bGrounded = pPlayer->IsOnGround();
|
||||
|
||||
|
||||
@@ -73,15 +73,17 @@ MAKE_HOOK(CBaseHudChatLine_InsertAndColorizeText, S::CBaseHudChatLine_InsertAndC
|
||||
continue;
|
||||
}
|
||||
|
||||
size_t iPos = 0;
|
||||
while (true)
|
||||
{
|
||||
std::string sMessage2 = sMessage;
|
||||
std::transform(sMessage2.begin(), sMessage2.end(), sMessage2.begin(), ::tolower);
|
||||
|
||||
auto iFind = sMessage2.find(sFind);
|
||||
auto iFind = sMessage2.find(sFind, iPos);
|
||||
if (iFind == std::string::npos)
|
||||
break;
|
||||
|
||||
iPos = iFind + sReplace.length();
|
||||
sMessage = sMessage.replace(iFind, sFind.length(), sReplace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,12 @@ MAKE_HOOK(CL_Move, S::CL_Move(), void,
|
||||
return CALL_ORIGINAL(accumulated_extra_samples, bFinalTick);
|
||||
|
||||
F::Backtrack.m_iTickCount = I::GlobalVars->tickcount + 1;
|
||||
if (!Vars::Misc::Game::NetworkFix.Value)
|
||||
{
|
||||
auto pNetChan = I::EngineClient->GetNetChannelInfo();
|
||||
if (pNetChan && !pNetChan->IsLoopback())
|
||||
F::Backtrack.m_iTickCount++;
|
||||
}
|
||||
|
||||
auto pLocal = H::Entities.GetLocal();
|
||||
auto pWeapon = H::Entities.GetWeapon();
|
||||
|
||||
@@ -50,7 +50,8 @@ MAKE_HOOK(CTFPlayerShared_InCond, S::CTFPlayerShared_InCond(), bool,
|
||||
return false;
|
||||
break;
|
||||
case TF_COND_FREEZE_INPUT:
|
||||
return false;
|
||||
if (CALL_ORIGINAL(rcx, TF_COND_HALLOWEEN_KART) ? Vars::Misc::Automation::KartControl.Value : true)
|
||||
return false;
|
||||
}
|
||||
|
||||
return CALL_ORIGINAL(rcx, nCond);
|
||||
|
||||
@@ -11,16 +11,45 @@
|
||||
#include "../Features/Visuals/Chams/Chams.h"
|
||||
#include "../Features/Visuals/Glow/Glow.h"
|
||||
#include "../Features/Spectate/Spectate.h"
|
||||
#include "../Features/Binds/Binds.h"
|
||||
|
||||
MAKE_HOOK(IBaseClientDLL_FrameStageNotify, U::Memory.GetVFunc(I::BaseClientDLL, 35), void,
|
||||
void* rcx, ClientFrameStage_t curStage)
|
||||
{
|
||||
if (G::Unload)
|
||||
return CALL_ORIGINAL(rcx, curStage);
|
||||
|
||||
switch (curStage)
|
||||
{
|
||||
case FRAME_RENDER_START:
|
||||
for (int iKey = 0; iKey < 256; iKey++)
|
||||
{
|
||||
// don't drop inputs for binds
|
||||
auto& tKey = F::Binds.m_mKeyStorage[iKey];
|
||||
|
||||
bool bOldIsDown = tKey.m_bIsDown;
|
||||
bool bOldIsPressed = tKey.m_bIsPressed;
|
||||
bool bOldIsDouble = tKey.m_bIsDouble;
|
||||
bool bOldIsReleased = tKey.m_bIsReleased;
|
||||
|
||||
U::KeyHandler.StoreKey(iKey, &tKey);
|
||||
|
||||
tKey.m_bIsDown = tKey.m_bIsDown || bOldIsDown;
|
||||
tKey.m_bIsPressed = tKey.m_bIsPressed || bOldIsPressed;
|
||||
tKey.m_bIsDouble = tKey.m_bIsDouble || bOldIsDouble;
|
||||
tKey.m_bIsReleased = tKey.m_bIsReleased || bOldIsReleased;
|
||||
}
|
||||
}
|
||||
|
||||
CALL_ORIGINAL(rcx, curStage);
|
||||
|
||||
switch (curStage)
|
||||
{
|
||||
case FRAME_NET_UPDATE_START:
|
||||
{
|
||||
auto pLocal = H::Entities.GetLocal();
|
||||
F::Spectate.NetUpdateStart(pLocal);
|
||||
|
||||
H::Entities.Clear();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -167,6 +167,58 @@ public:
|
||||
return Max(v1).Min(v2);
|
||||
}
|
||||
|
||||
Vec2 Lerp(const Vec2& v, float t) const
|
||||
{
|
||||
return { x + (v.x - x) * t, y + (v.y - y) * t };
|
||||
}
|
||||
|
||||
Vec2 Lerp(float v, float t) const
|
||||
{
|
||||
return { x + (v - x) * t, y + (v - y) * t };
|
||||
}
|
||||
|
||||
Vec2 DeltaAngle(const Vec2& v) const
|
||||
{
|
||||
auto deltaAngle = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
float flOut = fmodf((flAngleA - flAngleB) + 180.f, 360.f);
|
||||
return flOut += flOut < 0 ? 180.f : -180.f;
|
||||
};
|
||||
|
||||
return { deltaAngle(x, v.x), deltaAngle(y, v.y) };
|
||||
}
|
||||
|
||||
Vec2 DeltaAngle(float v) const
|
||||
{
|
||||
auto deltaAngle = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
float flOut = fmodf((flAngleA - flAngleB) + 180.f, 360.f);
|
||||
return flOut += flOut < 0 ? 180.f : -180.f;
|
||||
};
|
||||
|
||||
return { deltaAngle(x, v), deltaAngle(y, v) };
|
||||
}
|
||||
|
||||
Vec2 LerpAngle(const Vec2& v, float t) const
|
||||
{
|
||||
auto shortDist = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
const float flDelta = fmodf((flAngleA - flAngleB), 360.f);
|
||||
return fmodf(2 * flDelta, 360.f) - flDelta;
|
||||
};
|
||||
return { x - shortDist(x, v.x) * t, y - shortDist(y, v.y) * t };
|
||||
}
|
||||
|
||||
Vec2 LerpAngle(float v, float t) const
|
||||
{
|
||||
auto shortDist = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
const float flDelta = fmodf((flAngleA - flAngleB), 360.f);
|
||||
return fmodf(2 * flDelta, 360.f) - flDelta;
|
||||
};
|
||||
return { x - shortDist(x, v) * t, y - shortDist(y, v) * t };
|
||||
}
|
||||
|
||||
float Length(void) const
|
||||
{
|
||||
return sqrtf(x * x + y * y);
|
||||
@@ -376,6 +428,58 @@ public:
|
||||
return Max(v1).Min(v2);
|
||||
}
|
||||
|
||||
Vec3 Lerp(const Vec3& v, float t) const
|
||||
{
|
||||
return { x + (v.x - x) * t, y + (v.y - y) * t, z + (v.z - z) * t };
|
||||
}
|
||||
|
||||
Vec3 Lerp(float v, float t) const
|
||||
{
|
||||
return { x + (v - x) * t, y + (v - y) * t, z + (v - z) * t };
|
||||
}
|
||||
|
||||
Vec3 DeltaAngle(const Vec3& v) const
|
||||
{
|
||||
auto deltaAngle = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
float flOut = fmodf((flAngleA - flAngleB) + 180.f, 360.f);
|
||||
return flOut += flOut < 0 ? 180.f : -180.f;
|
||||
};
|
||||
|
||||
return { deltaAngle(x, v.x), deltaAngle(y, v.y), deltaAngle(z, v.z) };
|
||||
}
|
||||
|
||||
Vec3 DeltaAngle(float v) const
|
||||
{
|
||||
auto deltaAngle = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
float flOut = fmodf((flAngleA - flAngleB) + 180.f, 360.f);
|
||||
return flOut += flOut < 0 ? 180.f : -180.f;
|
||||
};
|
||||
|
||||
return { deltaAngle(x, v), deltaAngle(y, v), deltaAngle(z, v) };
|
||||
}
|
||||
|
||||
Vec3 LerpAngle(const Vec3& v, float t) const
|
||||
{
|
||||
auto shortDist = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
const float flDelta = fmodf((flAngleA - flAngleB), 360.f);
|
||||
return fmodf(2 * flDelta, 360.f) - flDelta;
|
||||
};
|
||||
return { x - shortDist(x, v.x) * t, y - shortDist(y, v.y) * t, z - shortDist(z, v.z) * t };
|
||||
}
|
||||
|
||||
Vec3 LerpAngle(float v, float t) const
|
||||
{
|
||||
auto shortDist = [](const float flAngleA, const float flAngleB)
|
||||
{
|
||||
const float flDelta = fmodf((flAngleA - flAngleB), 360.f);
|
||||
return fmodf(2 * flDelta, 360.f) - flDelta;
|
||||
};
|
||||
return { x - shortDist(x, v) * t, y - shortDist(y, v) * t, z - shortDist(z, v) * t };
|
||||
}
|
||||
|
||||
float Length(void) const
|
||||
{
|
||||
return sqrtf(x * x + y * y + z * z);
|
||||
|
||||
@@ -77,6 +77,14 @@ bool CTraceFilterProjectile::ShouldHitEntity(IHandleEntity* pServerEntity, int n
|
||||
case ETFClassID::CObjectSentrygun:
|
||||
case ETFClassID::CObjectDispenser:
|
||||
case ETFClassID::CObjectTeleporter: return true;
|
||||
case ETFClassID::CTFMedigunShield:
|
||||
{
|
||||
auto pLocal = H::Entities.GetLocal();
|
||||
auto pWeapon = H::Entities.GetWeapon();
|
||||
|
||||
const int iTargetTeam = pEntity->m_iTeamNum(), iLocalTeam = pLocal ? pLocal->m_iTeamNum() : iTargetTeam;
|
||||
return iTargetTeam != iLocalTeam;
|
||||
}
|
||||
case ETFClassID::CTFPlayer:
|
||||
{
|
||||
auto pLocal = H::Entities.GetLocal();
|
||||
|
||||
+14
-8
@@ -117,12 +117,12 @@ namespace Vars
|
||||
|
||||
NAMESPACE_BEGIN(Aimbot)
|
||||
SUBNAMESPACE_BEGIN(General)
|
||||
CVarEnum(AimType, 0, NONE, Off, Plain, Smooth, Silent, Locking)
|
||||
CVarEnum(AimType, 0, NONE, Off, Plain, Smooth, Silent, Locking, Assistive)
|
||||
CVarEnum(TargetSelection, 0, NONE, FOV, Distance)
|
||||
CVarEnum(Target, 0b0000001, NONE, Players = 1 << 0, Sentry = 1 << 1, Dispenser = 1 << 2, Teleporter = 1 << 3, Stickies = 1 << 4, NPCs = 1 << 5, Bombs = 1 << 6)
|
||||
CVarEnum(Ignore, 0b000000000, NONE, Friends = 1 << 0, Party = 1 << 1, Invulnerable = 1 << 2, Cloaked = 1 << 3, Unsimulated = 1 << 4, DeadRinger = 1 << 5, Vaccinator = 1 << 6, Disguised = 1 << 7, Taunting = 1 << 8)
|
||||
CVar(AimFOV, 30.f)
|
||||
CVar(Smoothing, 25.f)
|
||||
CVar(AssistStrength, 25.f)
|
||||
CVar(MaxTargets, 2)
|
||||
CVar(IgnoreCloakPercentage, 100)
|
||||
CVar(TickTolerance, 7)
|
||||
@@ -140,18 +140,22 @@ namespace Vars
|
||||
SUBNAMESPACE_END(Global)
|
||||
|
||||
SUBNAMESPACE_BEGIN(Hitscan)
|
||||
CVarEnum(Hitboxes, 0b00111, NONE, Head = 1 << 0, Pelvis = 1 << 1, Body = 1 << 2, Arms = 1 << 3, Legs = 1 << 4)
|
||||
CVarEnum(Modifiers, 0b01000000, NONE, Tapfire = 1 << 0, WaitForHeadshot = 1 << 1, WaitForCharge = 1 << 2, ScopedOnly = 1 << 3, AutoScope = 1 << 4, BodyaimIfLethal = 1 << 5, AutoRev = 1 << 6, ExtinguishTeam = 1 << 7)
|
||||
CVarEnum(Hitboxes, 0b000111, NONE, Head = 1 << 0, Body = 1 << 1, Pelvis = 1 << 2, Arms = 1 << 3, Legs = 1 << 4, BodyaimIfLethal = 1 << 5)
|
||||
CVarEnum(Modifiers, 0b01000000, NONE, Tapfire = 1 << 0, WaitForHeadshot = 1 << 1, WaitForCharge = 1 << 2, ScopedOnly = 1 << 3, AutoScope = 1 << 4, AutoRev = 1 << 5, ExtinguishTeam = 1 << 6)
|
||||
CVar(PointScale, 0.f)
|
||||
CVar(TapFireDist, 1000.f)
|
||||
|
||||
CVar(BoneSizeSubtract, 1.f, DEBUGVAR)
|
||||
CVar(BoneSizeMinimumScale, 1.f, DEBUGVAR)
|
||||
SUBNAMESPACE_END(HITSCAN)
|
||||
|
||||
SUBNAMESPACE_BEGIN(Projectile)
|
||||
CVarEnum(StrafePrediction, 0b11, NONE, Air = 1 << 0, Ground = 1 << 1)
|
||||
CVarEnum(SplashPrediction, 0, NONE, Off, Include, Prefer, Only)
|
||||
CVarEnum(AutoDetonate, 0b00, NONE, Stickies = 1 << 0, Flares = 1 << 1, PreventSelfDamage = 1 << 2)
|
||||
CVarEnum(AutoDetonate, 0b00, NONE, Stickies = 1 << 0, Flares = 1 << 1, PreventSelfDamage = 1 << 2, IgnoreCloak = 1 << 3)
|
||||
CVarEnum(AutoAirblast, 0b1000, NONE, Enabled = 1 << 0, RedirectSimple = 1 << 1, RedirectAdvanced = 1 << 2, RespectFOV = 1 << 3)
|
||||
CVarEnum(Modifiers, 0b1010, NONE, ChargeWeapon = 1 << 0, CancelCharge = 1 << 1, BodyaimIfLethal = 1 << 2, UsePrimeTime = 1 << 3, AimBlastAtFeet = 1 << 4)
|
||||
CVarEnum(Hitboxes, 0b001111, NONE, Auto = 1 << 0, Head = 1 << 1, Body = 1 << 2, Feet = 1 << 3, BodyaimIfLethal = 1 << 4, AimBlastAtFeet = 1 << 5)
|
||||
CVarEnum(Modifiers, 0b1010, NONE, ChargeWeapon = 1 << 0, CancelCharge = 1 << 1, UsePrimeTime = 1 << 2)
|
||||
CVar(PredictionTime, 2.f)
|
||||
CVar(Hitchance, 0.f)
|
||||
CVar(AutodetRadius, 90.f)
|
||||
@@ -185,12 +189,14 @@ namespace Vars
|
||||
CVar(HuntsmanAdd, 0.f, DEBUGVAR)
|
||||
CVar(HuntsmanAddLow, 0.f, DEBUGVAR)
|
||||
CVar(HuntsmanClamp, 5.f, DEBUGVAR)
|
||||
CVar(SplashGrates, true, DEBUGVAR)
|
||||
CVarEnum(RocketSplashMode, 0, DEBUGVAR, Regular, SpecialLight, SpecialHeavy)
|
||||
CVar(HuntsmanPullPoint, false, DEBUGVAR)
|
||||
CVar(SplashPoints, 100, DEBUGVAR)
|
||||
CVar(SplashGrates, true, DEBUGVAR)
|
||||
CVar(SplashCountDirect, 100, DEBUGVAR)
|
||||
CVar(SplashCountArc, 5, DEBUGVAR)
|
||||
CVar(SplashTraceInterval, 10, DEBUGVAR)
|
||||
CVarEnum(SplashMode, 0, DEBUGVAR, Multi, Single)
|
||||
CVarEnum(RocketSplashMode, 0, DEBUGVAR, Regular, SpecialLight, SpecialHeavy)
|
||||
CVar(DeltaCount, 5, DEBUGVAR)
|
||||
CVarEnum(DeltaMode, 0, DEBUGVAR, Average, Max)
|
||||
SUBNAMESPACE_END(Projectile)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
#pragma warning (disable: 4172)
|
||||
|
||||
const char* SearchForDLL(const char* pszDLLSearch)
|
||||
static const char* SearchForDLL(const char* pszDLLSearch)
|
||||
{
|
||||
HANDLE hProcessSnap = INVALID_HANDLE_VALUE;
|
||||
PROCESSENTRY32 pe32;
|
||||
|
||||
@@ -302,16 +302,21 @@ namespace Math
|
||||
}
|
||||
}
|
||||
|
||||
inline bool RayToOBB(const Vec3& vOrigin, const Vec3& vDirection, const Vec3& vMins, const Vec3& vMaxs, const matrix3x4& mMatrix)
|
||||
inline bool RayToOBB(const Vec3& vOrigin, const Vec3& vDirection, const Vec3& vMins, const Vec3& vMaxs, const matrix3x4& mMatrix, float flScale = 1.f)
|
||||
{
|
||||
if (!flScale)
|
||||
return false;
|
||||
|
||||
Vec3 vDelta = Vec3(mMatrix[0][3], mMatrix[1][3], mMatrix[2][3]) - vOrigin;
|
||||
|
||||
Vec3 X = { mMatrix[0][0], mMatrix[1][0], mMatrix[2][0] };
|
||||
Vec3 Y = { mMatrix[0][1], mMatrix[1][1], mMatrix[2][1] };
|
||||
Vec3 Z = { mMatrix[0][2], mMatrix[1][2], mMatrix[2][2] };
|
||||
Vec3 X = Vec3(mMatrix[0][0], mMatrix[1][0], mMatrix[2][0]) / flScale;
|
||||
Vec3 Y = Vec3(mMatrix[0][1], mMatrix[1][1], mMatrix[2][1]) / flScale;
|
||||
Vec3 Z = Vec3(mMatrix[0][2], mMatrix[1][2], mMatrix[2][2]) / flScale;
|
||||
if (flScale != 1.f)
|
||||
X /= flScale, Y /= flScale, Z /= flScale;
|
||||
|
||||
Vec3 f = { X.Dot(vDirection), Y.Dot(vDirection), Z.Dot(vDirection) };
|
||||
Vec3 e = { X.Dot(vDelta), Y.Dot(vDelta), Z.Dot(vDelta) };
|
||||
Vec3 f = Vec3(X.Dot(vDirection), Y.Dot(vDirection), Z.Dot(vDirection));
|
||||
Vec3 e = Vec3(X.Dot(vDelta), Y.Dot(vDelta), Z.Dot(vDelta));
|
||||
|
||||
float t[6] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
|
||||
|
||||
@@ -319,7 +324,7 @@ namespace Math
|
||||
{
|
||||
if (floatCompare(f[i], 0.f))
|
||||
{
|
||||
if (-e[i] + vMins[i] > 0.f || -e[i] + vMaxs[i] < 0.f)
|
||||
if (-e[i] + vMins[i] * flScale > 0.f || -e[i] + vMaxs[i] * flScale < 0.f)
|
||||
return false;
|
||||
|
||||
f[i] = 0.00001f;
|
||||
|
||||
@@ -8,7 +8,7 @@ int CNetVars::GetOffset(RecvTable* pTable, const char* szNetVar)
|
||||
auto uHash = FNV1A::Hash32(szNetVar);
|
||||
for (int i = 0; i < pTable->m_nProps; i++)
|
||||
{
|
||||
RecvProp Prop = pTable->m_pProps[i];
|
||||
RecvProp& Prop = pTable->m_pProps[i];
|
||||
|
||||
if (uHash == FNV1A::Hash32(Prop.m_pVarName))
|
||||
return Prop.GetOffset();
|
||||
|
||||
Reference in New Issue
Block a user