From 07c7ab23f85d26517588f3aa69068fb03e95715a Mon Sep 17 00:00:00 2001 From: rei-2 <174158077+rei-2@users.noreply.github.com> Date: Fri, 6 Mar 2026 18:39:31 -0500 Subject: [PATCH] fix for latest game update --- .../AimbotProjectile/AimbotProjectile.cpp | 22 +- .../Aimbot/AutoRocketJump/AutoRocketJump.cpp | 4 +- Amalgam/src/Features/ImGui/Menu/Menu.cpp | 3 +- .../ProjectileSimulation.cpp | 50 ++-- .../ProjectileSimulation.h | 4 +- Amalgam/src/Features/Visuals/Visuals.cpp | 2 +- Amalgam/src/Hooks/Cbuf_ExecuteCommand.cpp | 256 ------------------ Amalgam/src/SDK/Definitions/Main/CTFPlayer.h | 4 +- Amalgam/src/SDK/SDK.cpp | 31 ++- Amalgam/src/SDK/SDK.h | 2 +- Amalgam/src/SDK/Vars.h | 3 +- 11 files changed, 69 insertions(+), 312 deletions(-) diff --git a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp index e66ba4a1..4fc069c3 100644 --- a/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotProjectile/AimbotProjectile.cpp @@ -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 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 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 vDirectHistory = {}; std::vector 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() : GetDirectPoints(); - + std::vector vDirectHistory = {}; std::vector vSplashHistory = {}; diff --git a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp index 3c18d733..dedfca0d 100644 --- a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp +++ b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp @@ -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) { diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp index e3c056b6..cd9e374a 100644 --- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp +++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp @@ -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); diff --git a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp index 8156ff31..bf958bdd 100644 --- a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp +++ b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp @@ -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()->m_flChargeBeginTime() > 0.f ? I::GlobalVars->curtime - pWeapon->As()->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; diff --git a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.h b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.h index 75f556aa..2020e6cb 100644 --- a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.h +++ b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.h @@ -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); diff --git a/Amalgam/src/Features/Visuals/Visuals.cpp b/Amalgam/src/Features/Visuals/Visuals.cpp index 58172dc2..24f96501 100644 --- a/Amalgam/src/Features/Visuals/Visuals.cpp +++ b/Amalgam/src/Features/Visuals/Visuals.cpp @@ -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; diff --git a/Amalgam/src/Hooks/Cbuf_ExecuteCommand.cpp b/Amalgam/src/Hooks/Cbuf_ExecuteCommand.cpp index 6f7989fa..58e0ed91 100644 --- a/Amalgam/src/Hooks/Cbuf_ExecuteCommand.cpp +++ b/Amalgam/src/Hooks/Cbuf_ExecuteCommand.cpp @@ -1,9 +1,6 @@ #include "../SDK/SDK.h" #include "../Features/Commands/Commands.h" -#include -#include -#include 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> 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> 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); diff --git a/Amalgam/src/SDK/Definitions/Main/CTFPlayer.h b/Amalgam/src/SDK/Definitions/Main/CTFPlayer.h index aae81aa6..84dddeef 100644 --- a/Amalgam/src/SDK/Definitions/Main/CTFPlayer.h +++ b/Amalgam/src/SDK/Definitions/Main/CTFPlayer.h @@ -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); diff --git a/Amalgam/src/SDK/SDK.cpp b/Amalgam/src/SDK/SDK.cpp index b5a46ddc..9de2b3f6 100644 --- a/Amalgam/src/SDK/SDK.cpp +++ b/Amalgam/src/SDK/SDK.cpp @@ -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() diff --git a/Amalgam/src/SDK/SDK.h b/Amalgam/src/SDK/SDK.h index d3883752..cbcca0a6 100644 --- a/Amalgam/src/SDK/SDK.h +++ b/Amalgam/src/SDK/SDK.h @@ -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(); } \ No newline at end of file diff --git a/Amalgam/src/SDK/Vars.h b/Amalgam/src/SDK/Vars.h index 20d7587c..5f9a0a44 100644 --- a/Amalgam/src/SDK/Vars.h +++ b/Amalgam/src/SDK/Vars.h @@ -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);