mirror of
https://github.com/rei-2/Amalgam
synced 2026-10-10 04:43:09 +08:00
fix for latest game update
This commit is contained in:
@@ -524,7 +524,7 @@ static inline void TracePoint(Vec3& vPoint, int& iType, Vec3& vTargetEye, Info_t
|
||||
}
|
||||
}
|
||||
|
||||
breakOutExtra:
|
||||
breakOutExtra:
|
||||
if (vPoints.size() != iOriginalSize)
|
||||
iType = 0;
|
||||
else if (bErase || bNormal)
|
||||
@@ -605,7 +605,7 @@ static inline void TracePoint(Vec3& vPoint, int& iType, Vec3& vTargetEye, Info_t
|
||||
}
|
||||
}
|
||||
|
||||
breakOut:
|
||||
breakOut:
|
||||
if (vPoints.size() != iOriginalSize)
|
||||
iType = 0;
|
||||
else if (bErase || bNormal)
|
||||
@@ -623,7 +623,7 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Vec3 vOrigin, std::vecto
|
||||
Vec3 vTargetEye = vOrigin + m_tInfo.m_vTargetEye;
|
||||
|
||||
auto checkPoint = [&](CGameTrace& trace, bool& bErase, bool& bNormal)
|
||||
{
|
||||
{
|
||||
bErase = !trace.m_pEnt || trace.fraction == 1.f || trace.surface.flags & SURF_SKY || !trace.m_pEnt->GetAbsVelocity().IsZero();
|
||||
if (bErase)
|
||||
return false;
|
||||
@@ -662,7 +662,7 @@ std::vector<Point_t> CAimbotProjectile::GetSplashPoints(Vec3 vOrigin, std::vecto
|
||||
int& iType = it->second;
|
||||
|
||||
Solution_t tSolution; CalculateAngle(m_tInfo.m_vLocalEye, vPoint, iSimTime, tSolution, false);
|
||||
|
||||
|
||||
if (tSolution.m_iCalculated == CalculatedEnum::Bad)
|
||||
iType = 0;
|
||||
else if (abs(tSolution.m_flTime - TICKS_TO_TIME(iSimTime)) < m_tInfo.m_flRadiusTime || m_tInfo.m_iArmTime && iSimTime == m_tInfo.m_iArmTime)
|
||||
@@ -978,9 +978,9 @@ void CAimbotProjectile::CalculateAngle(const Vec3& vLocalPos, const Vec3& vTarge
|
||||
return;
|
||||
}
|
||||
|
||||
int iFlags = (bAccuracy ? ProjSimEnum::Trace : ProjSimEnum::None) | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum;
|
||||
int iFlags = (bAccuracy ? ProjSimEnum::Redirect : ProjSimEnum::None) | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum;
|
||||
#ifdef SPLASH_DEBUG5
|
||||
if (iFlags & ProjSimEnum::Trace)
|
||||
if (iFlags & ProjSimEnum::Redirect)
|
||||
{
|
||||
if (Vars::Visuals::Trajectory::Override.Value)
|
||||
{
|
||||
@@ -1082,7 +1082,7 @@ bool CAimbotProjectile::TestAngle(const Vec3& vPoint, const Vec3& vAngles, int i
|
||||
auto pWeapon = m_tInfo.m_pWeapon;
|
||||
auto& tTarget = *m_tInfo.m_pTarget;
|
||||
|
||||
int iFlags = ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum;
|
||||
int iFlags = ProjSimEnum::Redirect | ProjSimEnum::InitCheck | ProjSimEnum::NoRandomAngles | ProjSimEnum::PredictCmdNum;
|
||||
#ifdef SPLASH_DEBUG5
|
||||
if (Vars::Visuals::Trajectory::Override.Value)
|
||||
{
|
||||
@@ -1266,7 +1266,7 @@ bool CAimbotProjectile::TestAngle(const Vec3& vPoint, const Vec3& vAngles, int i
|
||||
// attempted to have a headshot check though this seems more detrimental than useful outside of smooth aimbot
|
||||
if (tTarget.m_nAimedHitbox == HITBOX_HEAD && !bSecondTest &&
|
||||
(Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Smooth
|
||||
|| Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive))
|
||||
|| Vars::Aimbot::General::AimType.Value == Vars::Aimbot::General::AimTypeEnum::Assistive))
|
||||
{ // loop and see if closest hitbox is head
|
||||
auto pModel = tTarget.m_pEntity->GetModel();
|
||||
if (!pModel) break;
|
||||
@@ -1494,7 +1494,7 @@ int CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBas
|
||||
|
||||
std::vector<Direct_t> vDirectHistory = {};
|
||||
std::vector<Splash_t> vSplashHistory = {};
|
||||
|
||||
|
||||
for (int i = 1 - TIME_TO_TICKS(m_tInfo.m_flLatency); i <= iMaxTime; i++)
|
||||
{
|
||||
if (!m_tMoveStorage.m_bFailed)
|
||||
@@ -2137,9 +2137,9 @@ bool CAimbotProjectile::CanHit(Target_t& tTarget, CTFPlayer* pLocal, CTFWeaponBa
|
||||
|
||||
int iMaxTime = TIME_TO_TICKS(Vars::Aimbot::Projectile::MaxSimulationTime.Value);
|
||||
int iSplash = Vars::Aimbot::Projectile::SplashPrediction.Value && m_tInfo.m_flRadius ? Vars::Aimbot::Projectile::SplashPrediction.Value : Vars::Aimbot::Projectile::SplashPredictionEnum::Off;
|
||||
|
||||
|
||||
auto mDirectPoints = iSplash == Vars::Aimbot::Projectile::SplashPredictionEnum::Only ? std::unordered_map<int, Vec3>() : GetDirectPoints();
|
||||
|
||||
|
||||
std::vector<Direct_t> vDirectHistory = {};
|
||||
std::vector<Splash_t> vSplashHistory = {};
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ bool CAutoRocketJump::SetAngles(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUser
|
||||
m_vAngles.x = flPitch = vAngleTo.x, m_vAngles.y = flYaw = vAngleTo.y;
|
||||
}
|
||||
|
||||
if (!F::ProjSim.GetInfo(pLocal, pWeapon, { flPitch, flYaw, 0 }, tProjInfo, ProjSimEnum::Trace | ProjSimEnum::NoRandomAngles))
|
||||
if (!F::ProjSim.GetInfo(pLocal, pWeapon, { flPitch, flYaw, 0 }, tProjInfo, ProjSimEnum::Redirect | ProjSimEnum::NoRandomAngles))
|
||||
return false;
|
||||
|
||||
{ // correct yaw
|
||||
@@ -142,7 +142,7 @@ void CAutoRocketJump::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* p
|
||||
MoveStorage tMoveStorage;
|
||||
ProjectileInfo tProjInfo = {};
|
||||
|
||||
bool bProjSimSetup = F::ProjSim.GetInfo(pLocal, pWeapon, m_vAngles, tProjInfo, ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::NoRandomAngles) && F::ProjSim.Initialize(tProjInfo);
|
||||
bool bProjSimSetup = F::ProjSim.GetInfo(pLocal, pWeapon, m_vAngles, tProjInfo, ProjSimEnum::Redirect | ProjSimEnum::InitCheck | ProjSimEnum::NoRandomAngles) && F::ProjSim.Initialize(tProjInfo);
|
||||
bool bMoveSimSetup = F::MoveSim.Initialize(pLocal, tMoveStorage, false); // do move sim after to not mess with proj sim
|
||||
if (bMoveSimSetup && bProjSimSetup)
|
||||
{
|
||||
|
||||
@@ -431,7 +431,8 @@ void CMenu::MenuAimbot(int iTab)
|
||||
FSlider(Vars::Visuals::Trajectory::OffsetX);
|
||||
FSlider(Vars::Visuals::Trajectory::OffsetY);
|
||||
FSlider(Vars::Visuals::Trajectory::OffsetZ);
|
||||
FToggle(Vars::Visuals::Trajectory::Pipes);
|
||||
FSlider(Vars::Visuals::Trajectory::ForwardRedirect);
|
||||
FSlider(Vars::Visuals::Trajectory::ForwardCutoff);
|
||||
FSlider(Vars::Visuals::Trajectory::Hull);
|
||||
FSlider(Vars::Visuals::Trajectory::Speed);
|
||||
FSlider(Vars::Visuals::Trajectory::Gravity);
|
||||
|
||||
@@ -13,7 +13,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
float flGravity = sv_gravity->GetFloat() / 800.f;
|
||||
bool bDucking = pPlayer->m_fFlags() & FL_DUCKING;
|
||||
|
||||
bool bTrace = iFlags & ProjSimEnum::Trace;
|
||||
bool bRedirect = iFlags & ProjSimEnum::Redirect;
|
||||
bool bInterp = iFlags & ProjSimEnum::Interp;
|
||||
bool bMaxSpeed = iFlags & ProjSimEnum::MaxSpeed;
|
||||
bool bPredictCmdNum = iFlags & ProjSimEnum::PredictCmdNum;
|
||||
@@ -23,7 +23,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
|
||||
if (Vars::Visuals::Trajectory::Override.Value)
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { Vars::Visuals::Trajectory::OffsetX.Value, Vars::Visuals::Trajectory::OffsetY.Value, Vars::Visuals::Trajectory::OffsetZ.Value }, vPos, vAngle, !bTrace ? true : Vars::Visuals::Trajectory::Pipes.Value, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { Vars::Visuals::Trajectory::OffsetX.Value, Vars::Visuals::Trajectory::OffsetY.Value, Vars::Visuals::Trajectory::OffsetZ.Value }, vPos, vAngle, Vars::Visuals::Trajectory::ForwardRedirect.Value, !bRedirect ? 1.f : Vars::Visuals::Trajectory::ForwardCutoff.Value, bInterp);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("custom"), 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::LifeTime.Value };
|
||||
return true;
|
||||
@@ -77,7 +77,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
case TF_WEAPON_ROCKETLAUNCHER:
|
||||
case TF_WEAPON_ROCKETLAUNCHER_DIRECTHIT:
|
||||
{
|
||||
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, bInterp);
|
||||
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, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
|
||||
float flSpeed = pPlayer->InCond(TF_COND_RUNE_PRECISION) ? 3000.f : SDK::AttribHookValue(1100.f, "mult_projectile_speed", pWeapon);
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/w_models/w_rocket.mdl"), vPos, vAngle, { 0.f, 0.f, 0.f }, flSpeed, 0.f };
|
||||
@@ -89,7 +89,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
{
|
||||
bool bCowMangler = pWeapon->GetWeaponID() == TF_WEAPON_PARTICLE_CANNON;
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, bDucking ? 8.f : -3.f }, vPos, vAngle, !bTrace ? true : false, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, bDucking ? 8.f : -3.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
if (pWeapon->GetWeaponID() == TF_WEAPON_DRG_POMSON)
|
||||
vPos.z -= 13.f;
|
||||
|
||||
@@ -103,7 +103,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
bool bCannon = pWeapon->GetWeaponID() == TF_WEAPON_CANNON;
|
||||
float flMortar = bCannon ? SDK::AttribHookValue(0.f, "grenade_launcher_mortar_mode", pWeapon) : 0.f;
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, 0.f, 0.f, bInterp);
|
||||
|
||||
float flSpeed = SDK::AttribHookValue(pPlayer->InCond(TF_COND_RUNE_PRECISION) ? 3000.f : SDK::AttribHookValue(1200.f, "mult_projectile_speed", pWeapon), "mult_projectile_range", pWeapon);
|
||||
float flLifetime = flMortar
|
||||
@@ -115,7 +115,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
}
|
||||
case TF_WEAPON_PIPEBOMBLAUNCHER:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, 0.f, 0.f, bInterp);
|
||||
|
||||
float flCharge = flAutoCharge > 0.f && SDK::AttribHookValue(1, "mult_dmg", pWeapon)
|
||||
? SDK::AttribHookValue(4.f, "stickybomb_charge_rate", pWeapon) * flAutoCharge
|
||||
@@ -126,14 +126,14 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
}
|
||||
case TF_WEAPON_FLAREGUN:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 12.f, bDucking ? 8.f : -3.f }, vPos, vAngle, !bTrace ? true : false, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 12.f, bDucking ? 8.f : -3.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/w_models/w_flaregun_shell.mdl"), vPos, vAngle, { 0.f, 0.f, 0.f }, SDK::AttribHookValue(2000.f, "mult_projectile_speed", pWeapon), 0.3f * flGravity };
|
||||
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, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 12.f, bDucking ? 8.f : -3.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/w_models/w_flaregun_shell.mdl"), vPos, vAngle, { 0.f, 0.f, 0.f }, 3000.f, 0.45f * flGravity };
|
||||
return true;
|
||||
@@ -148,11 +148,11 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
|
||||
if (bNoRandomAngles)
|
||||
vAngles -= { flAddX, flAddY };
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, -3.f }, vPos, vAngle, !bTrace ? true : false, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, -3.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
vAngle += { flAddX, flAddY };
|
||||
}
|
||||
else
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, -3.f }, vPos, vAngle, !bTrace ? true : false, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, -3.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
|
||||
float flCharge = pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime() > 0.f ? I::GlobalVars->curtime - pWeapon->As<CTFPipebombLauncher>()->m_flChargeBeginTime() : 0.f;
|
||||
float flSpeed = bMaxSpeed ? 2600.f : Math::RemapVal(flCharge, 0.f, 1.f, 1800.f, 2600.f);
|
||||
@@ -165,7 +165,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
{
|
||||
bool bCrossbow = pWeapon->GetWeaponID() == TF_WEAPON_CROSSBOW;
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, -3.f }, vPos, vAngle, !bTrace ? true : false, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, 8.f, -3.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
|
||||
auto uType = bCrossbow ? FNV1A::Hash32Const("models/weapons/w_models/w_syringe_proj.mdl") : FNV1A::Hash32Const("models/weapons/w_models/w_repair_claw.mdl");
|
||||
tProjInfo = { pPlayer, pWeapon, uType, 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, 10.f /*arrows have some lifetime check for whatever reason*/ };
|
||||
@@ -173,7 +173,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
}
|
||||
case TF_WEAPON_SYRINGEGUN_MEDIC:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 6.f, -8.f }, vPos, vAngle, !bTrace ? true : false, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 6.f, -8.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/w_models/w_syringe_proj.mdl"), vPos, vAngle, { 1.f, 1.f, 1.f }, 1000.f, 0.3f * flGravity };
|
||||
return true;
|
||||
@@ -183,21 +183,27 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
static auto tf_flamethrower_boxsize = H::ConVars.FindVar("tf_flamethrower_boxsize");
|
||||
const float flHull = tf_flamethrower_boxsize->GetFloat();
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 40.f, 5.f, 0.f }, vPos, vAngle, true, bInterp, false);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 40.f, 5.f, 0.f }, vPos, vAngle, 0.f, 0.f, bInterp, false);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("particles/flamethrower.pcf"), vPos, vAngle, { flHull, flHull, flHull }, 1000.f, 0.f, 0.285f };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_FLAME_BALL:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 3.f, 7.f, -9.f }, vPos, vAngle, true, bInterp, false);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/c_models/c_flameball/c_flameball.mdl"), vPos, vAngle, { 1.f, 1.f, 1.f /*damaging hull much bigger, shouldn't matter here*/ }, 3000.f, 0.f, 0.18f };
|
||||
static auto tf_fireball_speed = H::ConVars.FindVar("tf_fireball_speed");
|
||||
static auto tf_fireball_distance = H::ConVars.FindVar("tf_fireball_distance");
|
||||
static auto tf_fireball_max_lifetime = H::ConVars.FindVar("tf_fireball_max_lifetime");
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 3.f, 7.f, -9.f }, vPos, vAngle, bRedirect ? tf_fireball_distance->GetFloat() : 0.f, 1.f, bInterp);
|
||||
|
||||
float flSpeed = tf_fireball_speed->GetFloat();
|
||||
float flLifeTime = std::min(tf_fireball_distance->GetFloat() / flSpeed, tf_fireball_max_lifetime->GetFloat());
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/c_models/c_flameball/c_flameball.mdl"), vPos, vAngle, { 1.f, 1.f, 1.f /*damaging hull much bigger, shouldn't matter here*/ }, flSpeed, 0.f, flLifeTime };
|
||||
return true;
|
||||
}
|
||||
case TF_WEAPON_CLEAVER:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, 0.f, 0.f, bInterp);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/workshop_partner/weapons/c_models/c_sd_cleaver/c_sd_cleaver.mdl"), vPos, vAngle, { 1.f, 1.f, 10.f /*weird, probably still inaccurate*/ }, 3000.f, 1.f, 2.2f };
|
||||
return true;
|
||||
@@ -208,7 +214,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
static auto tf_scout_stunball_base_speed = H::ConVars.FindVar("tf_scout_stunball_base_speed");
|
||||
const bool bWrapAssassin = pWeapon->GetWeaponID() == TF_WEAPON_BAT_GIFTWRAP;
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 0.f, 0.f, 0.f }, vPos, vAngle, true, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 0.f, 0.f, 0.f }, vPos, vAngle, 0.f, 0.f, bInterp);
|
||||
|
||||
Vec3 vForward; Math::AngleVectors(vAngle, &vForward);
|
||||
vPos = (bInterp ? pPlayer->GetAbsOrigin() : pPlayer->m_vecOrigin()) + (Vec3(0, 0, 50) + vForward * 32.f) * pPlayer->m_flModelScale(); // why?
|
||||
@@ -219,7 +225,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
case TF_WEAPON_JAR:
|
||||
case TF_WEAPON_JAR_MILK:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, 0.f, 0.f, bInterp);
|
||||
|
||||
uint32_t uType = uType = FNV1A::Hash32Const("models/weapons/c_models/urinejar.mdl");
|
||||
switch (pWeapon->m_iItemDefinitionIndex())
|
||||
@@ -233,7 +239,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
}
|
||||
case TF_WEAPON_JAR_GAS:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, true, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 16.f, 8.f, -6.f }, vPos, vAngle, 0.f, 0.f, bInterp);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/c_models/c_gascan/c_gascan.mdl"), vPos, vAngle, { 3.f, 3.f, 3.f }, 2000.f, 1.f, 2.2f };
|
||||
return true;
|
||||
@@ -243,7 +249,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
static auto tf_grapplinghook_projectile_speed = H::ConVars.FindVar("tf_grapplinghook_projectile_speed");
|
||||
static auto tf_grapplinghook_max_distance = H::ConVars.FindVar("tf_grapplinghook_max_distance");
|
||||
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, -8.f, -3.f }, vPos, vAngle, !bTrace ? true : false, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 23.5f, -8.f, -3.f }, vPos, vAngle, bRedirect ? 2000.f : 0.f, 0.1f, bInterp);
|
||||
|
||||
float flSpeed = tf_grapplinghook_projectile_speed->GetFloat();
|
||||
if (pPlayer->InCond(TF_COND_RUNE_AGILITY))
|
||||
@@ -270,7 +276,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeap
|
||||
case Heavy_s_TheDalokohsBar:
|
||||
case Heavy_s_SecondBanana:
|
||||
{
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 0.f, 0.f, -8.f }, vPos, vAngle, true, bInterp);
|
||||
SDK::GetProjectileFireSetup(pPlayer, vAngles, { 0.f, 0.f, -8.f }, vPos, vAngle, 0.f, 0.f, bInterp);
|
||||
|
||||
tProjInfo = { pPlayer, pWeapon, FNV1A::Hash32Const("models/weapons/c_models/c_sandwich/c_sandwich.mdl"), vPos, vAngle, { 17.f, 17.f, 7.f }, 500.f, 1.f * flGravity };
|
||||
return true;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
Enum(ProjSim,
|
||||
None = 0,
|
||||
Trace = 1 << 0, // trace when doing GetProjectileFireSetup
|
||||
Redirect = 1 << 0, // redirect and possibly trace when doing GetProjectileFireSetup
|
||||
InitCheck = 1 << 1, // validate starting position
|
||||
Interp = 1 << 2, // use interpolation
|
||||
NoRandomAngles = 1 << 3, // don't do angle stuff for aimbot, nospread will pick that up
|
||||
@@ -52,7 +52,7 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
bool GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& tProjInfo, int iFlags = ProjSimEnum::Trace | ProjSimEnum::InitCheck, float flAutoCharge = -1.f);
|
||||
bool GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& tProjInfo, int iFlags = ProjSimEnum::Redirect | ProjSimEnum::InitCheck, float flAutoCharge = -1.f);
|
||||
void SetupTrace(CTraceFilterCollideable& filter, int& nMask, CTFWeaponBase* pWeapon, int nTick = 0, bool bInterp = false);
|
||||
|
||||
void GetInfo(CBaseEntity* pProjectile, ProjectileInfo& tProjInfo);
|
||||
|
||||
@@ -50,7 +50,7 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const
|
||||
return;
|
||||
|
||||
Vec3 vAngles = bInterp ? I::EngineClient->GetViewAngles() : G::CurrentUserCmd->viewangles;
|
||||
int iFlags = bInterp ? ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::Interp : ProjSimEnum::Trace | ProjSimEnum::InitCheck;
|
||||
int iFlags = bInterp ? ProjSimEnum::Redirect | ProjSimEnum::InitCheck | ProjSimEnum::Interp : ProjSimEnum::Redirect | ProjSimEnum::InitCheck;
|
||||
if (F::Spectate.HasTarget() && bInterp && pPlayer && pPlayer->m_hObserverTarget())
|
||||
{
|
||||
bool bThirdperson = pPlayer->m_iObserverMode() != OBS_MODE_FIRSTPERSON;
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
#include "../SDK/SDK.h"
|
||||
|
||||
#include "../Features/Commands/Commands.h"
|
||||
#include <functional>
|
||||
#include <regex>
|
||||
#include <sstream>
|
||||
|
||||
MAKE_SIGNATURE(Cbuf_ExecuteCommand, "engine.dll", "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 48 83 EC ? 48 8B 05 ? ? ? ? 48 8D 3D", 0x0);
|
||||
|
||||
@@ -13,204 +10,6 @@ enum cmd_source_t
|
||||
src_command
|
||||
};
|
||||
|
||||
static std::string s_sCmdString;
|
||||
|
||||
#define PRE_STR "\x7\x7\x7\x7\x7\x7\x7"
|
||||
static std::vector<std::pair<std::string, std::string>> s_vStatic = {
|
||||
{ "\\x1", "\x1" },
|
||||
{ "\\x01", "\x1" },
|
||||
{ "\\x2", PRE_STR"\x2" },
|
||||
{ "\\x02", PRE_STR"\x2" },
|
||||
{ "\\x3", PRE_STR"\x3" },
|
||||
{ "\\x03", PRE_STR"\x3" },
|
||||
{ "\\x4", PRE_STR"\x4" },
|
||||
{ "\\x04", PRE_STR"\x4" },
|
||||
{ "\\x5", PRE_STR"\x5" },
|
||||
{ "\\x05", PRE_STR"\x5" },
|
||||
{ "\\x6", PRE_STR"\x6" },
|
||||
{ "\\x06", PRE_STR"\x6" },
|
||||
{ "\\x7", PRE_STR"\x7" },
|
||||
{ "\\x07", PRE_STR"\x7" },
|
||||
{ "\\x8", PRE_STR"\x8" },
|
||||
{ "\\x08", PRE_STR"\x8" },
|
||||
|
||||
{ "\\{default}", "\x1" },
|
||||
{ "\\{clear}", PRE_STR"\x8""00000000" },
|
||||
{ "\\{red}", PRE_STR"\x7""ff0000" },
|
||||
{ "\\{green}", PRE_STR"\x7""00ff00" },
|
||||
{ "\\{blue}", PRE_STR"\x7""0000ff" },
|
||||
{ "\\{yellow}", PRE_STR"\x7""ffff00" },
|
||||
{ "\\{pink}", PRE_STR"\x7""ff00ff" },
|
||||
{ "\\{cyan}", PRE_STR"\x7""00ffff" },
|
||||
{ "\\{orange}", PRE_STR"\x7""ff7000" },
|
||||
{ "\\{purple}", PRE_STR"\x7""7f00ff" },
|
||||
{ "\\{brown}", PRE_STR"\x7""583927" },
|
||||
{ "\\{gold}", PRE_STR"\x7""c8a900" },
|
||||
{ "\\{gray}", PRE_STR"\x7""cccccc" },
|
||||
{ "\\{black}", PRE_STR"\x7""000000" },
|
||||
{ "\\{bluteam}", PRE_STR"\x7""99ccff" },
|
||||
{ "\\{blueteam}", PRE_STR"\x7""99ccff" },
|
||||
{ "\\{redteam}", PRE_STR"\x7""ff4040" },
|
||||
{ "\\{normal}", PRE_STR"\x7""b2b2b2" },
|
||||
{ "\\{unique}", PRE_STR"\x7""ffd700" },
|
||||
{ "\\{strange}", PRE_STR"\x7""cf6a32" },
|
||||
{ "\\{vintage}", PRE_STR"\x7""476291" },
|
||||
{ "\\{haunted}", PRE_STR"\x7""38f3ab" },
|
||||
{ "\\{genuine}", PRE_STR"\x7""4d7455" },
|
||||
{ "\\{unusual}", PRE_STR"\x7""8650ac" },
|
||||
{ "\\{collectors}", PRE_STR"\x7""aa0000" },
|
||||
{ "\\{community}", PRE_STR"\x7""70b04a" },
|
||||
{ "\\{selfmade}", PRE_STR"\x7""70b04a" },
|
||||
{ "\\{valve}", PRE_STR"\x7""a50f79" },
|
||||
{ "\\{elite}", PRE_STR"\x7""eb4b4b" },
|
||||
{ "\\{assassin}", PRE_STR"\x7""d32ce6" },
|
||||
{ "\\{commando}", PRE_STR"\x7""8847ff" },
|
||||
{ "\\{mercenary}", PRE_STR"\x7""4b69ff" },
|
||||
|
||||
{ "\\t", "\t" },
|
||||
};
|
||||
static std::vector<std::function<void()>> s_vDynamic = {
|
||||
[&]()
|
||||
{
|
||||
auto pResource = H::Entities.GetResource();
|
||||
if (!pResource)
|
||||
return;
|
||||
|
||||
std::string sFind = "\\{self}";
|
||||
std::string sReplace = pResource->GetName(I::EngineClient->GetLocalPlayer());
|
||||
|
||||
size_t iPos = 0;
|
||||
while (true)
|
||||
{
|
||||
auto iFind = s_sCmdString.find(sFind, iPos);
|
||||
if (iFind == std::string::npos)
|
||||
break;
|
||||
|
||||
iPos = iFind + sReplace.length();
|
||||
s_sCmdString = s_sCmdString.replace(iFind, sFind.length(), sReplace);
|
||||
}
|
||||
},
|
||||
[&]()
|
||||
{
|
||||
auto pResource = H::Entities.GetResource();
|
||||
if (!pResource)
|
||||
return;
|
||||
|
||||
std::string sFind = "\\{team}";
|
||||
std::string sReplace = PRE_STR"\x7""cccccc";
|
||||
switch (pResource->m_iTeam(I::EngineClient->GetLocalPlayer()))
|
||||
{
|
||||
case TF_TEAM_BLUE: sReplace = PRE_STR"\x7""99ccff"; break;
|
||||
case TF_TEAM_RED: sReplace = PRE_STR"\x7""ff4040"; break;
|
||||
}
|
||||
|
||||
size_t iPos = 0;
|
||||
while (true)
|
||||
{
|
||||
auto iFind = s_sCmdString.find(sFind, iPos);
|
||||
if (iFind == std::string::npos)
|
||||
break;
|
||||
|
||||
iPos = iFind + sReplace.length();
|
||||
s_sCmdString = s_sCmdString.replace(iFind, sFind.length(), sReplace);
|
||||
}
|
||||
},
|
||||
[&]()
|
||||
{
|
||||
auto sRegex = R"(\\\{rgb:(\d+)?(?:,(\d+))?(?:,(\d+))?\})";
|
||||
|
||||
while (true)
|
||||
{
|
||||
std::smatch tMatch; std::regex_search(s_sCmdString, tMatch, std::regex(sRegex));
|
||||
if (tMatch.size() != 4)
|
||||
break;
|
||||
|
||||
int r = !tMatch[1].str().empty() ? std::stoi(tMatch[1]) : 255;
|
||||
int g = !tMatch[2].str().empty() ? std::stoi(tMatch[2]) : 255;
|
||||
int b = !tMatch[3].str().empty() ? std::stoi(tMatch[3]) : 255;
|
||||
|
||||
Color_t tColor; tColor.SetRGB(r, g, b);
|
||||
s_sCmdString = s_sCmdString.replace(tMatch.position(), tMatch.length(), std::format(PRE_STR"{}", tColor.ToHex()));
|
||||
}
|
||||
},
|
||||
[&]()
|
||||
{
|
||||
auto sRegex = R"(\\\{rgba:(\d+)?(?:,(\d+))?(?:,(\d+))?(?:,(\d+))?\})";
|
||||
|
||||
while (true)
|
||||
{
|
||||
std::smatch tMatch; std::regex_search(s_sCmdString, tMatch, std::regex(sRegex));
|
||||
if (tMatch.size() != 5)
|
||||
break;
|
||||
|
||||
int r = !tMatch[1].str().empty() ? std::stoi(tMatch[1]) : 255;
|
||||
int g = !tMatch[2].str().empty() ? std::stoi(tMatch[2]) : 255;
|
||||
int b = !tMatch[3].str().empty() ? std::stoi(tMatch[3]) : 255;
|
||||
int a = !tMatch[4].str().empty() ? std::stoi(tMatch[4]) : 255;
|
||||
|
||||
Color_t tColor; tColor.SetRGB(r, g, b, a);
|
||||
s_sCmdString = s_sCmdString.replace(tMatch.position(), tMatch.length(), std::format(PRE_STR"{}", tColor.ToHexA()));
|
||||
}
|
||||
},
|
||||
[&]()
|
||||
{
|
||||
auto sRegex = R"(\\\{hsv:(\d+)?(?:,(\d+))?(?:,(\d+))?\})";
|
||||
|
||||
while (true)
|
||||
{
|
||||
std::smatch tMatch; std::regex_search(s_sCmdString, tMatch, std::regex(sRegex));
|
||||
if (tMatch.size() != 4)
|
||||
break;
|
||||
|
||||
int h = !tMatch[1].str().empty() ? std::stoi(tMatch[1]) : 0;
|
||||
int s = !tMatch[2].str().empty() ? std::stoi(tMatch[2]) : 100;
|
||||
int v = !tMatch[3].str().empty() ? std::stoi(tMatch[3]) : 100;
|
||||
|
||||
Color_t tColor; tColor.SetHSV(h, s, v);
|
||||
s_sCmdString = s_sCmdString.replace(tMatch.position(), tMatch.length(), std::format(PRE_STR"{}", tColor.ToHex()));
|
||||
}
|
||||
},
|
||||
[&]()
|
||||
{
|
||||
auto sRegex = R"(\\\{hsva:(\d+)?(?:,(\d+))?(?:,(\d+))?(?:,(\d+))?\})";
|
||||
|
||||
while (true)
|
||||
{
|
||||
std::smatch tMatch; std::regex_search(s_sCmdString, tMatch, std::regex(sRegex));
|
||||
if (tMatch.size() != 5)
|
||||
break;
|
||||
|
||||
int h = !tMatch[1].str().empty() ? std::stoi(tMatch[1]) : 0;
|
||||
int s = !tMatch[2].str().empty() ? std::stoi(tMatch[2]) : 100;
|
||||
int v = !tMatch[3].str().empty() ? std::stoi(tMatch[3]) : 100;
|
||||
int a = !tMatch[4].str().empty() ? std::stoi(tMatch[4]) : 255;
|
||||
|
||||
Color_t tColor; tColor.SetHSV(h, s, v, a);
|
||||
s_sCmdString = s_sCmdString.replace(tMatch.position(), tMatch.length(), std::format(PRE_STR"{}", tColor.ToHexA()));
|
||||
}
|
||||
},
|
||||
[&]()
|
||||
{
|
||||
auto sRegex = R"(\\\{(\d+):(.+)\})";
|
||||
|
||||
while (true)
|
||||
{
|
||||
std::smatch tMatch; std::regex_search(s_sCmdString, tMatch, std::regex(sRegex));
|
||||
if (tMatch.size() != 3)
|
||||
break;
|
||||
|
||||
int n = std::stoi(tMatch[1]);
|
||||
auto str = tMatch[2].str();
|
||||
|
||||
std::stringstream ssStream;
|
||||
for (int i = 0; i < n; i++)
|
||||
ssStream << str;
|
||||
|
||||
s_sCmdString = s_sCmdString.replace(tMatch.position(), tMatch.length(), ssStream.str());
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
MAKE_HOOK(Cbuf_ExecuteCommand, S::Cbuf_ExecuteCommand(), void,
|
||||
CCommand& args, cmd_source_t source)
|
||||
{
|
||||
@@ -225,61 +24,6 @@ MAKE_HOOK(Cbuf_ExecuteCommand, S::Cbuf_ExecuteCommand(), void,
|
||||
|
||||
if (F::Commands.Run(sCommand, vArgs))
|
||||
return;
|
||||
|
||||
switch (FNV1A::Hash32(sCommand))
|
||||
{
|
||||
case FNV1A::Hash32Const("say"):
|
||||
case FNV1A::Hash32Const("say_team"):
|
||||
{
|
||||
s_sCmdString = args.m_pArgSBuffer;
|
||||
s_sCmdString = s_sCmdString.replace(0, args.m_nArgv0Size, "");
|
||||
|
||||
for (auto& [sFind, sReplace] : s_vStatic)
|
||||
{
|
||||
size_t iPos = 0;
|
||||
while (true)
|
||||
{
|
||||
auto iFind = s_sCmdString.find(sFind, iPos);
|
||||
if (iFind == std::string::npos)
|
||||
break;
|
||||
|
||||
iPos = iFind + sReplace.length();
|
||||
s_sCmdString = s_sCmdString.replace(iFind, sFind.length(), sReplace);
|
||||
}
|
||||
}
|
||||
for (auto& fFunction : s_vDynamic)
|
||||
fFunction();
|
||||
|
||||
s_sCmdString = std::format("{} {}", sCommand, s_sCmdString).substr(0, COMMAND_MAX_LENGTH - 1);
|
||||
strncpy_s(args.m_pArgSBuffer, s_sCmdString.c_str(), COMMAND_MAX_LENGTH);
|
||||
args.m_nArgv0Size = int(strlen(sCommand)) + 1;
|
||||
|
||||
break;
|
||||
}
|
||||
case FNV1A::Hash32Const("cl_flipviewmodels"):
|
||||
{ // server does string comparison to "1"
|
||||
auto pCVar = I::CVar->FindVar(sCommand);
|
||||
if (!pCVar)
|
||||
break;
|
||||
|
||||
CALL_ORIGINAL(args, source);
|
||||
|
||||
try
|
||||
{
|
||||
if (pCVar->GetFloat() != float(std::stoi(pCVar->GetString())))
|
||||
break;
|
||||
|
||||
auto sValue = std::format("{}", pCVar->GetInt());
|
||||
if (FNV1A::Hash32(sValue.c_str()) == FNV1A::Hash32(pCVar->GetString()))
|
||||
break;
|
||||
|
||||
pCVar->SetValue(sValue.c_str());
|
||||
}
|
||||
catch (...) {}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CALL_ORIGINAL(args, source);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#define PLAYER_ORIGIN_COMPRESSION 0.125f
|
||||
|
||||
MAKE_SIGNATURE(CTFPlayer_IsPlayerOnSteamFriendsList, "client.dll", "40 57 48 81 EC ? ? ? ? 48 8B FA E8", 0x0);
|
||||
MAKE_SIGNATURE(TeamFortress_CalculateMaxSpeed, "client.dll", "88 54 24 ? 53 55", 0x0);
|
||||
MAKE_SIGNATURE(TeamFortress_CalculateMaxSpeed, "client.dll", "40 53 41 56 41 57 48 81 EC ? ? ? ? 48 83 3D", 0x0);
|
||||
MAKE_SIGNATURE(CTFPlayer_GetMaxAmmo, "client.dll", "48 89 5C 24 ? 48 89 74 24 ? 57 48 83 EC ? 48 63 FA 48 8B F1", 0x0);
|
||||
MAKE_SIGNATURE(CTFPlayer_UpdateClientSideAnimation, "client.dll", "48 89 5C 24 ? 57 48 83 EC ? 48 8B D9 E8 ? ? ? ? 48 8B F8 48 85 C0 74 ? 48 8B 00 48 8B CF FF 90 ? ? ? ? 84 C0 75 ? 33 FF 48 3B DF", 0x0);
|
||||
MAKE_SIGNATURE(CTFPlayer_GetEffectiveInvisibilityLevel, "client.dll", "40 57 48 83 EC ? 0F 29 7C 24", 0x0);
|
||||
@@ -184,6 +184,8 @@ public:
|
||||
NETVAR(m_iCampaignMedals, int, "CTFPlayer", "m_iCampaignMedals");
|
||||
NETVAR(m_iPlayerSkinOverride, int, "CTFPlayer", "m_iPlayerSkinOverride");
|
||||
NETVAR(m_bViewingCYOAPDA, bool, "CTFPlayer", "m_bViewingCYOAPDA");
|
||||
NETVAR(m_bRegenerating, bool, "CTFPlayer", "m_bRegenerating");
|
||||
NETVAR(m_hOffHandWeapon, EHANDLE, "CTFPlayer", "m_hOffHandWeapon");
|
||||
|
||||
NETVAR_OFF(m_flInvisibility, float, "CTFPlayer", "m_flInvisChangeCompleteTime", -8);
|
||||
NETVAR_OFF(m_flPrevInvisibility, float, "CTFPlayer", "m_flInvisChangeCompleteTime", -4);
|
||||
|
||||
+17
-14
@@ -720,7 +720,7 @@ void SDK::FixMovement(CUserCmd* pCmd, const Vec3& vCurAngle, const Vec3& vTarget
|
||||
bool bCurOOB = fabsf(Math::NormalizeAngle(vCurAngle.x)) > 90.f;
|
||||
bool bTargetOOB = fabsf(Math::NormalizeAngle(vTargetAngle.x)) > 90.f;
|
||||
|
||||
Vec3 vMove = { pCmd->forwardmove, pCmd->sidemove * (bCurOOB ? -1 : 1), pCmd->upmove};
|
||||
Vec3 vMove = { pCmd->forwardmove, pCmd->sidemove * (bCurOOB ? -1 : 1), pCmd->upmove };
|
||||
float flSpeed = vMove.Length2D();
|
||||
Vec3 vMoveAng = Math::VectorAngles(vMove);
|
||||
|
||||
@@ -799,10 +799,10 @@ void SDK::WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, const Vec3& vTo, float flSca
|
||||
|
||||
|
||||
|
||||
void SDK::GetProjectileFireSetup(CTFPlayer* pPlayer, const Vec3& vAngIn, Vec3 vOffset, Vec3& vPosOut, Vec3& vAngOut, bool bPipes, bool bInterp, bool bAllowFlip)
|
||||
void SDK::GetProjectileFireSetup(CTFPlayer* pPlayer, const Vec3& vAngIn, Vec3 vOffset, Vec3& vPosOut, Vec3& vAngOut, float flForward, float flCutoff, bool bInterp, bool bAllowFlip)
|
||||
{
|
||||
static auto cl_flipviewmodels = H::ConVars.FindVar("cl_flipviewmodels");
|
||||
if (bAllowFlip && FNV1A::Hash32(cl_flipviewmodels->GetString()) == FNV1A::Hash32Const("1"))
|
||||
if (bAllowFlip && cl_flipviewmodels->GetBool())
|
||||
vOffset.y *= -1.f;
|
||||
|
||||
const Vec3 vShootPos = bInterp ? pPlayer->GetEyePosition() : pPlayer->GetShootPos();
|
||||
@@ -810,22 +810,25 @@ void SDK::GetProjectileFireSetup(CTFPlayer* pPlayer, const Vec3& vAngIn, Vec3 vO
|
||||
Vec3 vForward, vRight, vUp; Math::AngleVectors(vAngIn, &vForward, &vRight, &vUp);
|
||||
vPosOut = vShootPos + (vForward * vOffset.x) + (vRight * vOffset.y) + (vUp * vOffset.z);
|
||||
|
||||
if (bPipes)
|
||||
vAngOut = vAngIn;
|
||||
else
|
||||
if (flForward)
|
||||
{
|
||||
Vec3 vEndPos = vShootPos + vForward * 2000.f;
|
||||
Vec3 vEndPos = vShootPos + vForward * flForward;
|
||||
|
||||
CGameTrace trace = {};
|
||||
CTraceFilterCollideable filter = {};
|
||||
filter.pSkip = pPlayer;
|
||||
filter.iType = SKIP_CHECK;
|
||||
Trace(vShootPos, vEndPos, MASK_SOLID, &filter, &trace);
|
||||
if (trace.DidHit() && trace.fraction > 0.1f)
|
||||
vEndPos = trace.endpos;
|
||||
if (flCutoff < 1.f)
|
||||
{
|
||||
CGameTrace trace = {};
|
||||
CTraceFilterCollideable filter = {};
|
||||
filter.pSkip = pPlayer;
|
||||
filter.iType = SKIP_CHECK;
|
||||
Trace(vShootPos, vEndPos, MASK_SOLID, &filter, &trace);
|
||||
if (trace.DidHit() && trace.fraction > flCutoff)
|
||||
vEndPos = trace.endpos;
|
||||
}
|
||||
|
||||
vAngOut = Math::VectorAngles(vEndPos - vPosOut);
|
||||
}
|
||||
else
|
||||
vAngOut = vAngIn;
|
||||
}
|
||||
|
||||
bool SDK::CleanScreenshot()
|
||||
|
||||
@@ -139,7 +139,7 @@ namespace SDK
|
||||
void WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, const Vec3& vFrom, const Vec3& vTo, float flScale = 1.f);
|
||||
void WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, const Vec3& vTo, float flScale = 1.f);
|
||||
|
||||
void GetProjectileFireSetup(CTFPlayer* pPlayer, const Vec3& vAngIn, Vec3 vOffset, Vec3& vPosOut, Vec3& vAngOut, bool bPipes = false, bool bInterp = false, bool bAllowFlip = true);
|
||||
void GetProjectileFireSetup(CTFPlayer* pPlayer, const Vec3& vAngIn, Vec3 vOffset, Vec3& vPosOut, Vec3& vAngOut, float flForward = 0.f, float flCutoff = 0.1f, bool bInterp = false, bool bAllowFlip = true);
|
||||
|
||||
bool CleanScreenshot();
|
||||
}
|
||||
@@ -675,7 +675,8 @@ NAMESPACE_BEGIN(Vars)
|
||||
CVar(OffsetX, "Offset X", 16.f, NOSAVE | DEBUGVAR | SLIDER_PRECISION, -25.f, 25.f, 0.5f);
|
||||
CVar(OffsetY, "Offset Y", 8.f, NOSAVE | DEBUGVAR | SLIDER_PRECISION, -25.f, 25.f, 0.5f);
|
||||
CVar(OffsetZ, "Offset Z", -6.f, NOSAVE | DEBUGVAR | SLIDER_PRECISION, -25.f, 25.f, 0.5f);
|
||||
CVar(Pipes, "Pipes", true, NOSAVE | DEBUGVAR);
|
||||
CVar(ForwardRedirect, "Forward redirect", 2000.f, NOSAVE | DEBUGVAR | SLIDER_PRECISION, 0.f, 2000.f, 100.f);
|
||||
CVar(ForwardCutoff, "Forward cutoff", 0.1f, NOSAVE | DEBUGVAR | SLIDER_PRECISION, 0.f, 1.f, 0.1f);
|
||||
CVar(Hull, "Hull", 5.f, NOSAVE | DEBUGVAR | SLIDER_MIN | SLIDER_PRECISION, 0.f, 10.f, 0.5f);
|
||||
CVar(Speed, "Speed", 1200.f, NOSAVE | DEBUGVAR | SLIDER_MIN | SLIDER_PRECISION, 0.f, 5000.f, 50.f);
|
||||
CVar(Gravity, "Gravity", 1.f, NOSAVE | DEBUGVAR | SLIDER_PRECISION, 0.f, 1.f, 0.1f);
|
||||
|
||||
Reference in New Issue
Block a user