diff --git a/Amalgam/Amalgam.vcxproj b/Amalgam/Amalgam.vcxproj
index 9370a237..bc57ca7b 100644
--- a/Amalgam/Amalgam.vcxproj
+++ b/Amalgam/Amalgam.vcxproj
@@ -918,7 +918,7 @@
-
+
@@ -1228,7 +1228,7 @@
-
+
diff --git a/Amalgam/Amalgam.vcxproj.filters b/Amalgam/Amalgam.vcxproj.filters
index 5a53a07b..fb612f99 100644
--- a/Amalgam/Amalgam.vcxproj.filters
+++ b/Amalgam/Amalgam.vcxproj.filters
@@ -45,7 +45,7 @@
-
+
@@ -393,7 +393,7 @@
-
+
diff --git a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp
index 31835089..185465be 100644
--- a/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp
+++ b/Amalgam/src/Features/Aimbot/AutoRocketJump/AutoRocketJump.cpp
@@ -197,10 +197,13 @@ void CAutoRocketJump::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* p
SDK::Output("Auto jump", std::format("Ticks to hit: {} ({})", m_iDelay, n).c_str(), { 255, 0, 0 }, Vars::Debug::Logging.Value);
if (Vars::Debug::Info.Value)
{
- Vec3 vAngles = Math::VectorAngles(trace.plane.normal);
- G::LineStorage.clear(); G::BoxStorage.clear();
- G::BoxStorage.emplace_back(trace.endpos + trace.plane.normal, Vec3::Get(-1), Vec3::Get(1), vAngles, I::GlobalVars->curtime + 5.f, Color_t(), Color_t(0, 0, 0, 0), true);
- G::LineStorage.emplace_back(std::pair(tMoveStorage.m_MoveData.m_vecAbsOrigin + pLocal->m_vecViewOffset(), trace.endpos + trace.plane.normal), I::GlobalVars->curtime + 5.f, Color_t(), true);
+ G::PathStorage.clear(); G::BoxStorage.clear(); G::LineStorage.clear();
+ tProjInfo.m_vPath.push_back(trace.endpos + trace.plane.normal);
+
+ G::PathStorage.emplace_back(tMoveStorage.m_vPath, I::GlobalVars->curtime + 5.f, Color_t(255, 255, 255), Vars::Visuals::Path::StyleEnum::Line);
+ G::BoxStorage.emplace_back(tMoveStorage.m_MoveData.m_vecAbsOrigin, pLocal->m_vecMins(), pLocal->m_vecMaxs(), Vec3(), I::GlobalVars->curtime + 5.f, Color_t(255, 255, 255), Color_t(0, 0, 0, 0), true);
+ G::PathStorage.emplace_back(tProjInfo.m_vPath, I::GlobalVars->curtime + 5.f, Color_t(255, 150, 150), Vars::Visuals::Path::StyleEnum::Line);
+ G::BoxStorage.emplace_back(tProjInfo.m_vPath.back(), Vec3::Get(-1), Vec3::Get(1), Vec3() /*Math::VectorAngles(trace.plane.normal)*/, I::GlobalVars->curtime + 5.f, Color_t(255, 150, 150), Color_t(0, 0, 0, 0), true);
}
}
}
@@ -260,19 +263,22 @@ void CAutoRocketJump::Run(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* p
if (m_iFrame <= m_iChoke)
G::PSilentAngles = true, G::SilentAngles = false; // only con to this is that you may not be able to choke depending on the ticks charged
- if (m_iDelay > 1)
+ if (bCurrGrounded)
{
- switch (m_iFrame - m_iDelay + 1)
+ if (m_iDelay > 1)
{
- case 0:
- pCmd->buttons |= IN_DUCK;
- break;
- case 1:
- pCmd->buttons |= IN_JUMP;
+ switch (m_iFrame - m_iDelay + 1)
+ {
+ case 0:
+ pCmd->buttons |= IN_DUCK;
+ break;
+ case 1:
+ pCmd->buttons |= IN_JUMP;
+ }
}
+ else // won't ctap in time
+ pCmd->buttons |= IN_DUCK | IN_JUMP;
}
- else // won't ctap in time
- pCmd->buttons |= IN_DUCK | IN_JUMP;
if (m_iFrame == m_iDelay + 3)
m_iFrame = -1;
diff --git a/Amalgam/src/Features/CheaterDetection/CheaterDetection.cpp b/Amalgam/src/Features/CheatDetection/CheatDetection.cpp
similarity index 72%
rename from Amalgam/src/Features/CheaterDetection/CheaterDetection.cpp
rename to Amalgam/src/Features/CheatDetection/CheatDetection.cpp
index 8e26e918..051b0848 100644
--- a/Amalgam/src/Features/CheaterDetection/CheaterDetection.cpp
+++ b/Amalgam/src/Features/CheatDetection/CheatDetection.cpp
@@ -1,11 +1,11 @@
-#include "CheaterDetection.h"
+#include "CheatDetection.h"
#include "../Players/PlayerUtils.h"
#include "../Output/Output.h"
-bool CCheaterDetection::ShouldScan()
+bool CCheatDetection::ShouldScan()
{
- if (!Vars::CheaterDetection::Methods.Value /*|| I::EngineClient->IsPlayingDemo()*/)
+ if (!Vars::CheatDetection::Methods.Value /*|| I::EngineClient->IsPlayingDemo()*/)
return false;
static int iStaticTickcount = I::GlobalVars->tickcount;
@@ -21,23 +21,23 @@ bool CCheaterDetection::ShouldScan()
return true;
}
-bool CCheaterDetection::InvalidPitch(CTFPlayer* pEntity)
+bool CCheatDetection::InvalidPitch(CTFPlayer* pEntity)
{
- return Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::InvalidPitch && fabsf(pEntity->m_angEyeAnglesX()) == 90.f;
+ return Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::InvalidPitch && fabsf(pEntity->m_angEyeAnglesX()) == 90.f;
}
-bool CCheaterDetection::IsChoking(CTFPlayer* pEntity)
+bool CCheatDetection::IsChoking(CTFPlayer* pEntity)
{
bool bReturn = mData[pEntity].m_PacketChoking.m_bInfract;
mData[pEntity].m_PacketChoking.m_bInfract = false;
- return Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::PacketChoking && bReturn;
+ return Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::PacketChoking && bReturn;
}
-bool CCheaterDetection::IsFlicking(CTFPlayer* pEntity) // awful
+bool CCheatDetection::IsFlicking(CTFPlayer* pEntity) // awful
{
auto& vAngles = mData[pEntity].m_AimFlicking.m_vAngles;
- if (!(Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::AimFlicking))
+ if (!(Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::AimFlicking))
{
vAngles.clear();
return false;
@@ -48,17 +48,17 @@ bool CCheaterDetection::IsFlicking(CTFPlayer* pEntity) // awful
vAngles.pop_back();
if (vAngles.size() != 3 || !vAngles[0].m_bAttacking && !vAngles[1].m_bAttacking && !vAngles[2].m_bAttacking
- || Math::CalcFov(vAngles[0].m_vAngle, vAngles[1].m_vAngle) < Vars::CheaterDetection::MinimumFlick.Value
- || Math::CalcFov(vAngles[0].m_vAngle, vAngles[2].m_vAngle) > Vars::CheaterDetection::MaximumNoise.Value * (TICK_INTERVAL / 0.015f))
+ || Math::CalcFov(vAngles[0].m_vAngle, vAngles[1].m_vAngle) < Vars::CheatDetection::MinFlick.Value
+ || Math::CalcFov(vAngles[0].m_vAngle, vAngles[2].m_vAngle) > Vars::CheatDetection::MaxNoise.Value * (TICK_INTERVAL / 0.015f))
return false;
vAngles.clear();
return true;
}
-bool CCheaterDetection::IsDuckSpeed(CTFPlayer* pEntity)
+bool CCheatDetection::IsDuckSpeed(CTFPlayer* pEntity)
{
- if (!(Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::DuckSpeed)
+ if (!(Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::DuckSpeed)
|| !pEntity->IsDucking() || !pEntity->IsOnGround()
|| pEntity->m_vecVelocity().Length2D() < pEntity->m_flMaxspeed() * 0.5f)
{
@@ -78,13 +78,13 @@ bool CCheaterDetection::IsDuckSpeed(CTFPlayer* pEntity)
return false;
}
-void CCheaterDetection::Infract(CTFPlayer* pEntity, const char* sReason)
+void CCheatDetection::Infract(CTFPlayer* pEntity, const char* sReason)
{
bool bMark = false;
- if (Vars::CheaterDetection::DetectionsRequired.Value)
+ if (Vars::CheatDetection::DetectionsRequired.Value)
{
mData[pEntity].m_iDetections++;
- bMark = mData[pEntity].m_iDetections >= Vars::CheaterDetection::DetectionsRequired.Value;
+ bMark = mData[pEntity].m_iDetections >= Vars::CheatDetection::DetectionsRequired.Value;
}
F::Output.CheatDetection(mData[pEntity].m_sName, bMark ? "marked" : "infracted", sReason);
@@ -95,7 +95,7 @@ void CCheaterDetection::Infract(CTFPlayer* pEntity, const char* sReason)
}
}
-void CCheaterDetection::Run()
+void CCheatDetection::Run()
{
if (!ShouldScan() || !I::EngineClient->IsConnected() || I::EngineClient->IsPlayingDemo())
return;
@@ -134,14 +134,14 @@ void CCheaterDetection::Run()
}
}
-void CCheaterDetection::Reset()
+void CCheatDetection::Reset()
{
mData.clear();
}
-void CCheaterDetection::ReportChoke(CTFPlayer* pEntity, int iChoke)
+void CCheatDetection::ReportChoke(CTFPlayer* pEntity, int iChoke)
{
- if (Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::PacketChoking)
+ if (Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::PacketChoking)
{
mData[pEntity].m_PacketChoking.m_vChokes.push_back(iChoke);
if (mData[pEntity].m_PacketChoking.m_vChokes.size() == 3)
@@ -149,7 +149,7 @@ void CCheaterDetection::ReportChoke(CTFPlayer* pEntity, int iChoke)
mData[pEntity].m_PacketChoking.m_bInfract = true; // check for last 3 choke amounts
for (auto& iChoke : mData[pEntity].m_PacketChoking.m_vChokes)
{
- if (iChoke < Vars::CheaterDetection::MinimumChoking.Value)
+ if (iChoke < Vars::CheatDetection::MinChoking.Value)
mData[pEntity].m_PacketChoking.m_bInfract = false;
}
mData[pEntity].m_PacketChoking.m_vChokes.clear();
@@ -159,9 +159,9 @@ void CCheaterDetection::ReportChoke(CTFPlayer* pEntity, int iChoke)
mData[pEntity].m_PacketChoking.m_vChokes.clear();
}
-void CCheaterDetection::ReportDamage(IGameEvent* pEvent)
+void CCheatDetection::ReportDamage(IGameEvent* pEvent)
{
- if (!(Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::AimFlicking))
+ if (!(Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::AimFlicking))
return;
int iIndex = I::EngineClient->GetPlayerForUserID(pEvent->GetInt("attacker"));
diff --git a/Amalgam/src/Features/CheaterDetection/CheaterDetection.h b/Amalgam/src/Features/CheatDetection/CheatDetection.h
similarity index 93%
rename from Amalgam/src/Features/CheaterDetection/CheaterDetection.h
rename to Amalgam/src/Features/CheatDetection/CheatDetection.h
index d9151c66..7c848838 100644
--- a/Amalgam/src/Features/CheaterDetection/CheaterDetection.h
+++ b/Amalgam/src/Features/CheatDetection/CheatDetection.h
@@ -31,7 +31,7 @@ struct PlayerInfo
} m_DuckSpeed;
};
-class CCheaterDetection
+class CCheatDetection
{
private:
bool ShouldScan();
@@ -53,4 +53,4 @@ public:
void Reset();
};
-ADD_FEATURE(CCheaterDetection, CheaterDetection);
\ No newline at end of file
+ADD_FEATURE(CCheatDetection, CheatDetection);
\ No newline at end of file
diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp
index f5293371..286faced 100644
--- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp
+++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp
@@ -629,6 +629,82 @@ void CMenu::MenuHVH(int iTab)
{
/* Column 1 */
TableNextColumn();
+ {
+ if (Section("Antiaim", 8))
+ {
+ FToggle(Vars::AntiAim::Enabled, FToggleEnum::Left);
+ FToggle(Vars::AntiAim::HidePitchOnShot, FToggleEnum::Right);
+ FDropdown(Vars::AntiAim::PitchReal, FDropdownEnum::Left);
+ FDropdown(Vars::AntiAim::PitchFake, FDropdownEnum::Right);
+ FDropdown(Vars::AntiAim::YawReal, FDropdownEnum::Left);
+ FDropdown(Vars::AntiAim::YawFake, FDropdownEnum::Right);
+ FDropdown(Vars::AntiAim::RealYawBase, FDropdownEnum::Left);
+ FDropdown(Vars::AntiAim::FakeYawBase, FDropdownEnum::Right);
+ FSlider(Vars::AntiAim::RealYawOffset, FSliderEnum::Left);
+ FSlider(Vars::AntiAim::FakeYawOffset, FSliderEnum::Right);
+ PushTransparent(Vars::AntiAim::YawReal.Value != Vars::AntiAim::YawEnum::Edge && Vars::AntiAim::YawReal.Value != Vars::AntiAim::YawEnum::Jitter);
+ {
+ FSlider(Vars::AntiAim::RealYawValue, FSliderEnum::Left);
+ }
+ PopTransparent();
+ PushTransparent(Vars::AntiAim::YawFake.Value != Vars::AntiAim::YawEnum::Edge && Vars::AntiAim::YawFake.Value != Vars::AntiAim::YawEnum::Jitter);
+ {
+ FSlider(Vars::AntiAim::FakeYawValue, FSliderEnum::Right);
+ }
+ PopTransparent();
+ PushTransparent(Vars::AntiAim::YawFake.Value != Vars::AntiAim::YawEnum::Spin && Vars::AntiAim::YawReal.Value != Vars::AntiAim::YawEnum::Spin);
+ {
+ FSlider(Vars::AntiAim::SpinSpeed, FSliderEnum::Left);
+ }
+ PopTransparent();
+ SetCursorPos({ GetWindowWidth() / 2 + GetStyle().WindowPadding.x / 2, GetRowPos() + H::Draw.Scale(8) });
+ FToggle(Vars::AntiAim::MinWalk, FToggleEnum::Left);
+ } EndSection();
+ if (Vars::Debug::Options.Value)
+ {
+ if (Section("##Debug Antiaim"))
+ {
+ FText("Debug", { 5, 5 });
+ if (FPopupButton("Debug", { 0, -5 }))
+ {
+ FToggle(Vars::AntiAim::AntiAimLines);
+
+ EndPopup();
+ }
+ } EndSection();
+ }
+ if (Section("Resolver", 8))
+ {
+ FToggle(Vars::Resolver::Enabled, FToggleEnum::Left);
+ PushTransparent(!Vars::Resolver::Enabled.Value);
+ {
+ FToggle(Vars::Resolver::AutoResolve, FToggleEnum::Right);
+ PushTransparent(Transparent || !Vars::Resolver::AutoResolve.Value);
+ {
+ FToggle(Vars::Resolver::AutoResolveCheatersOnly, FToggleEnum::Left);
+ FToggle(Vars::Resolver::AutoResolveHeadshotOnly, FToggleEnum::Right);
+ PushTransparent(Transparent || !Vars::Resolver::AutoResolveYawAmount.Value);
+ {
+ FSlider(Vars::Resolver::AutoResolveYawAmount, FSliderEnum::Left);
+ }
+ PopTransparent();
+ PushTransparent(Transparent || !Vars::Resolver::AutoResolvePitchAmount.Value);
+ {
+ FSlider(Vars::Resolver::AutoResolvePitchAmount, FSliderEnum::Right);
+ }
+ PopTransparent();
+ }
+ PopTransparent();
+ FSlider(Vars::Resolver::CycleYaw, FSliderEnum::Left);
+ FSlider(Vars::Resolver::CyclePitch, FSliderEnum::Right);
+ FToggle(Vars::Resolver::CycleView, FToggleEnum::Left);
+ FToggle(Vars::Resolver::CycleMinwalk, FToggleEnum::Right);
+ }
+ PopTransparent();
+ } EndSection();
+ }
+ /* Column 2 */
+ TableNextColumn();
{
if (Section("Doubletap", 8))
{
@@ -671,113 +747,15 @@ void CMenu::MenuHVH(int iTab)
}
} EndSection();
}
- if (Section("Antiaim", 8))
- {
- FToggle(Vars::AntiAim::Enabled);
- FDropdown(Vars::AntiAim::PitchReal, FDropdownEnum::Left);
- FDropdown(Vars::AntiAim::PitchFake, FDropdownEnum::Right);
- FDropdown(Vars::AntiAim::YawReal, FDropdownEnum::Left);
- FDropdown(Vars::AntiAim::YawFake, FDropdownEnum::Right);
- FDropdown(Vars::AntiAim::RealYawBase, FDropdownEnum::Left);
- FDropdown(Vars::AntiAim::FakeYawBase, FDropdownEnum::Right);
- FSlider(Vars::AntiAim::RealYawOffset, FSliderEnum::Left);
- FSlider(Vars::AntiAim::FakeYawOffset, FSliderEnum::Right);
- PushTransparent(Vars::AntiAim::YawReal.Value != Vars::AntiAim::YawEnum::Edge && Vars::AntiAim::YawReal.Value != Vars::AntiAim::YawEnum::Jitter);
- {
- FSlider(Vars::AntiAim::RealYawValue, FSliderEnum::Left);
- }
- PopTransparent();
- PushTransparent(Vars::AntiAim::YawFake.Value != Vars::AntiAim::YawEnum::Edge && Vars::AntiAim::YawFake.Value != Vars::AntiAim::YawEnum::Jitter);
- {
- FSlider(Vars::AntiAim::FakeYawValue, FSliderEnum::Right);
- }
- PopTransparent();
- PushTransparent(Vars::AntiAim::YawFake.Value != Vars::AntiAim::YawEnum::Spin && Vars::AntiAim::YawReal.Value != Vars::AntiAim::YawEnum::Spin);
- {
- FSlider(Vars::AntiAim::SpinSpeed, FSliderEnum::Left);
- }
- PopTransparent();
- SetCursorPos({ GetWindowWidth() / 2 + GetStyle().WindowPadding.x / 2, GetRowPos() + H::Draw.Scale(8) });
- FToggle(Vars::AntiAim::MinWalk, FToggleEnum::Left);
- FToggle(Vars::AntiAim::AntiOverlap, FToggleEnum::Left);
- FToggle(Vars::AntiAim::InvalidShootPitch, FToggleEnum::Right);
- } EndSection();
- if (Vars::Debug::Options.Value)
- {
- if (Section("##Debug Antiaim"))
- {
- FText("Debug", { 5, 5 });
- if (FPopupButton("Debug", { 0, -5 }))
- {
- FToggle(Vars::AntiAim::AntiAimLines, FToggleEnum::Left);
-
- EndPopup();
- }
- } EndSection();
- }
- }
- /* Column 2 */
- TableNextColumn();
- {
- if (Section("Resolver", 8))
- {
- FToggle(Vars::Resolver::Enabled, FToggleEnum::Left);
- PushTransparent(!Vars::Resolver::Enabled.Value);
- {
- FToggle(Vars::Resolver::AutoResolve, FToggleEnum::Right);
- PushTransparent(Transparent || !Vars::Resolver::AutoResolve.Value);
- {
- FToggle(Vars::Resolver::AutoResolveCheatersOnly, FToggleEnum::Left);
- FToggle(Vars::Resolver::AutoResolveHeadshotOnly, FToggleEnum::Right);
- PushTransparent(Transparent || !Vars::Resolver::AutoResolveYawAmount.Value);
- {
- FSlider(Vars::Resolver::AutoResolveYawAmount, FSliderEnum::Left);
- }
- PopTransparent();
- PushTransparent(Transparent || !Vars::Resolver::AutoResolvePitchAmount.Value);
- {
- FSlider(Vars::Resolver::AutoResolvePitchAmount, FSliderEnum::Right);
- }
- PopTransparent();
- }
- PopTransparent();
- FSlider(Vars::Resolver::CycleYaw, FSliderEnum::Left);
- FSlider(Vars::Resolver::CyclePitch, FSliderEnum::Right);
- FToggle(Vars::Resolver::CycleView, FToggleEnum::Left);
- FToggle(Vars::Resolver::CycleMinwalk, FToggleEnum::Right);
- }
- PopTransparent();
- } EndSection();
if (Section("Auto Peek", 8))
{
FToggle(Vars::AutoPeek::Enabled);
} EndSection();
- if (Section("Cheater Detection"))
- {
- FDropdown(Vars::CheaterDetection::Methods);
- PushTransparent(!Vars::CheaterDetection::DetectionsRequired.Value);
- {
- FSlider(Vars::CheaterDetection::DetectionsRequired);
- }
- PopTransparent();
- PushTransparent(!(Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::PacketChoking));
- {
- FSlider(Vars::CheaterDetection::MinimumChoking);
- }
- PopTransparent();
- PushTransparent(!(Vars::CheaterDetection::Methods.Value & Vars::CheaterDetection::MethodsEnum::AimFlicking));
- {
- FSlider(Vars::CheaterDetection::MinimumFlick, FSliderEnum::Left);
- FSlider(Vars::CheaterDetection::MaximumNoise, FSliderEnum::Right);
- }
- PopTransparent();
- } EndSection();
if (Section("Speedhack", 8))
{
- FToggle(Vars::Speedhack::Enabled);
- PushTransparent(!Vars::Speedhack::Enabled.Value);
+ PushTransparent(Vars::Speedhack::Scale.Value == 1);
{
- FSlider(Vars::Speedhack::Amount);
+ FSlider(Vars::Speedhack::Scale);
}
PopTransparent();
} EndSection();
@@ -1389,10 +1367,10 @@ void CMenu::MenuMisc(int iTab)
if (Section("Automation"))
{
FDropdown(Vars::Misc::Automation::AntiBackstab); // pitch/fake _might_ slip up some auto backstabs
- FToggle(Vars::Misc::Automation::AntiAFK, FToggleEnum::Left);
- FToggle(Vars::Misc::Automation::AntiAutobalance, FToggleEnum::Right);
FToggle(Vars::Misc::Automation::TauntControl, FToggleEnum::Left);
FToggle(Vars::Misc::Automation::KartControl, FToggleEnum::Right);
+ FToggle(Vars::Misc::Automation::AntiAutobalance, FToggleEnum::Left);
+ FToggle(Vars::Misc::Automation::AntiAFK, FToggleEnum::Right);
FToggle(Vars::Misc::Automation::AutoF2Ignored, FToggleEnum::Left);
FToggle(Vars::Misc::Automation::AutoF1Priority, FToggleEnum::Right);
FToggle(Vars::Misc::Automation::AcceptItemDrops);
@@ -2373,27 +2351,23 @@ void CMenu::MenuLogs(int iTab)
FDropdown(Vars::Logging::NotificationPosition);
FSlider(Vars::Logging::Lifetime);
} EndSection();
- if (Section("Vote Start"))
+ if (Section("Cheat Detection"))
{
- PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::VoteStart));
+ FDropdown(Vars::CheatDetection::Methods);
+ PushTransparent(!Vars::CheatDetection::DetectionsRequired.Value);
{
- FDropdown(Vars::Logging::VoteStart::LogTo);
+ FSlider(Vars::CheatDetection::DetectionsRequired);
}
PopTransparent();
- } EndSection();
- if (Section("Vote Cast"))
- {
- PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::VoteCast));
+ PushTransparent(!(Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::PacketChoking));
{
- FDropdown(Vars::Logging::VoteCast::LogTo);
+ FSlider(Vars::CheatDetection::MinChoking);
}
PopTransparent();
- } EndSection();
- if (Section("Class Change"))
- {
- PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::ClassChanges));
+ PushTransparent(!(Vars::CheatDetection::Methods.Value & Vars::CheatDetection::MethodsEnum::AimFlicking));
{
- FDropdown(Vars::Logging::ClassChange::LogTo);
+ FSlider(Vars::CheatDetection::MinFlick, FSliderEnum::Left);
+ FSlider(Vars::CheatDetection::MaxNoise, FSliderEnum::Right);
}
PopTransparent();
} EndSection();
@@ -2401,40 +2375,43 @@ void CMenu::MenuLogs(int iTab)
/* Column 2 */
TableNextColumn();
{
- if (Section("Damage"))
+ if (Section("Log options"))
{
+ PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::VoteStart));
+ {
+ FDropdown(Vars::Logging::VoteStart::LogTo);
+ }
+ PopTransparent();
+ PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::VoteCast));
+ {
+ FDropdown(Vars::Logging::VoteCast::LogTo);
+ }
+ PopTransparent();
+ PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::ClassChanges));
+ {
+ FDropdown(Vars::Logging::ClassChange::LogTo);
+ }
+ PopTransparent();
PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::Damage));
{
FDropdown(Vars::Logging::Damage::LogTo);
}
PopTransparent();
- } EndSection();
- if (Section("Cheat Detection"))
- {
PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::CheatDetection));
{
FDropdown(Vars::Logging::CheatDetection::LogTo);
}
PopTransparent();
- } EndSection();
- if (Section("Tags"))
- {
PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::Tags));
{
FDropdown(Vars::Logging::Tags::LogTo);
}
PopTransparent();
- } EndSection();
- if (Section("Aliases"))
- {
PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::Aliases));
{
FDropdown(Vars::Logging::Aliases::LogTo);
}
PopTransparent();
- } EndSection();
- if (Section("Resolver"))
- {
PushTransparent(!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::Resolver));
{
FDropdown(Vars::Logging::Resolver::LogTo);
diff --git a/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.cpp b/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.cpp
index 672cf0cd..34277840 100644
--- a/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.cpp
+++ b/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.cpp
@@ -47,7 +47,7 @@ bool CAntiAim::ShouldRun(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pC
void CAntiAim::FakeShotAngles(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd)
{
- if (!Vars::AntiAim::InvalidShootPitch.Value || G::Attacking != 1 || G::PrimaryWeaponType != EWeaponType::HITSCAN || pLocal->m_MoveType() != MOVETYPE_WALK)
+ if (!Vars::AntiAim::HidePitchOnShot.Value || G::Attacking != 1 || G::PrimaryWeaponType != EWeaponType::HITSCAN || pLocal->m_MoveType() != MOVETYPE_WALK)
return;
switch (pWeapon ? pWeapon->GetWeaponID() : 0)
@@ -149,21 +149,9 @@ float CAntiAim::GetBaseYaw(CTFPlayer* pLocal, CUserCmd* pCmd, bool bFake)
return pCmd->viewangles.y;
}
-void CAntiAim::RunOverlapping(CTFPlayer* pEntity, CUserCmd* pCmd, float& flYaw, bool bFake, float flEpsilon)
-{
- if (!Vars::AntiAim::AntiOverlap.Value || bFake)
- return;
-
- float flFakeYaw = GetBaseYaw(pEntity, pCmd, true) + GetYawOffset(pEntity, true);
- const float flYawDiff = Math::NormalizeAngle(flYaw - flFakeYaw);
- if (fabsf(flYawDiff) < flEpsilon)
- flYaw += flYawDiff > 0 ? flEpsilon : -flEpsilon;
-}
-
float CAntiAim::GetYaw(CTFPlayer* pLocal, CUserCmd* pCmd, bool bFake)
{
float flYaw = GetBaseYaw(pLocal, pCmd, bFake) + GetYawOffset(pLocal, bFake);
- RunOverlapping(pLocal, pCmd, flYaw, bFake);
return flYaw;
}
diff --git a/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.h b/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.h
index 146f500e..7feb57d4 100644
--- a/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.h
+++ b/Amalgam/src/Features/PacketManip/AntiAim/AntiAim.h
@@ -7,7 +7,6 @@ private:
void FakeShotAngles(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, CUserCmd* pCmd);
float GetYawOffset(CTFPlayer* pEntity, bool bFake);
float GetBaseYaw(CTFPlayer* pLocal, CUserCmd* pCmd, bool bFake);
- void RunOverlapping(CTFPlayer* pEntity, CUserCmd* pCmd, float& flYaw, bool bFake, float flEpsilon = 45.f);
float GetYaw(CTFPlayer* pLocal, CUserCmd* pCmd, bool bFake);
float GetPitch(float flCurPitch);
void MinWalk(CTFPlayer* pLocal, CUserCmd* pCmd);
diff --git a/Amalgam/src/Features/Ticks/Ticks.cpp b/Amalgam/src/Features/Ticks/Ticks.cpp
index eb96a17a..0c3b9e76 100644
--- a/Amalgam/src/Features/Ticks/Ticks.cpp
+++ b/Amalgam/src/Features/Ticks/Ticks.cpp
@@ -81,7 +81,7 @@ void CTicks::Doubletap(CTFPlayer* pLocal, CUserCmd* pCmd)
void CTicks::Speedhack()
{
- m_bSpeedhack = Vars::Speedhack::Enabled.Value;
+ m_bSpeedhack = Vars::Speedhack::Scale.Value != 1;
if (!m_bSpeedhack)
return;
@@ -178,7 +178,7 @@ void CTicks::Move(float accumulated_extra_samples, bool bFinalTick)
if (m_bSpeedhack)
{
- m_iShiftedTicks = Vars::Speedhack::Amount.Value;
+ m_iShiftedTicks = Vars::Speedhack::Scale.Value;
m_iShiftedGoal = 0;
}
@@ -415,7 +415,7 @@ void CTicks::Draw(CTFPlayer* pLocal)
const auto& fFont = H::Fonts.GetFont(FONT_INDICATORS);
if (m_bSpeedhack)
- return H::Draw.StringOutlined(fFont, dtPos.x, dtPos.y + 2, Vars::Menu::Theme::Active.Value, Vars::Menu::Theme::Background.Value, ALIGN_TOP, std::format("Speedhack x{}", Vars::Speedhack::Amount.Value).c_str());
+ return H::Draw.StringOutlined(fFont, dtPos.x, dtPos.y + 2, Vars::Menu::Theme::Active.Value, Vars::Menu::Theme::Background.Value, ALIGN_TOP, std::format("Speedhack x{}", Vars::Speedhack::Scale.Value).c_str());
int iAntiAimTicks = F::AntiAim.YawOn() ? F::AntiAim.AntiAimTicks() : 0;
int iTicks = std::clamp(m_iShiftedTicks + std::max(I::ClientState->chokedcommands - iAntiAimTicks, 0), 0, m_iMaxUsrCmdProcessTicks);
diff --git a/Amalgam/src/Hooks/CHLClient_FrameStageNotify.cpp b/Amalgam/src/Hooks/CHLClient_FrameStageNotify.cpp
index 27e16afc..a1456a86 100644
--- a/Amalgam/src/Hooks/CHLClient_FrameStageNotify.cpp
+++ b/Amalgam/src/Hooks/CHLClient_FrameStageNotify.cpp
@@ -3,7 +3,7 @@
#include "../Features/Aimbot/Aimbot.h"
#include "../Features/Backtrack/Backtrack.h"
#include "../Features/Binds/Binds.h"
-#include "../Features/CheaterDetection/CheaterDetection.h"
+#include "../Features/CheatDetection/CheatDetection.h"
#include "../Features/CritHack/CritHack.h"
#include "../Features/Players/PlayerUtils.h"
#include "../Features/Simulation/MovementSimulation/MovementSimulation.h"
@@ -53,7 +53,7 @@ MAKE_HOOK(CHLClient_FrameStageNotify, U::Memory.GetVirtual(I::Client, 35), void,
F::OffscreenArrows.Store();
F::Visuals.Store();
- F::CheaterDetection.Run();
+ F::CheatDetection.Run();
F::Spectate.NetUpdateEnd(pLocal);
F::Visuals.Modulate();
diff --git a/Amalgam/src/Hooks/CViewRender_LevelInit.cpp b/Amalgam/src/Hooks/CViewRender_LevelInit.cpp
index 5ba2b3eb..6faca504 100644
--- a/Amalgam/src/Hooks/CViewRender_LevelInit.cpp
+++ b/Amalgam/src/Hooks/CViewRender_LevelInit.cpp
@@ -5,7 +5,7 @@
#include "../Features/Backtrack/Backtrack.h"
#include "../Features/Ticks/Ticks.h"
#include "../Features/NoSpread/NoSpreadHitscan/NoSpreadHitscan.h"
-#include "../Features/CheaterDetection/CheaterDetection.h"
+#include "../Features/CheatDetection/CheatDetection.h"
#include "../Features/Resolver/Resolver.h"
#include "../Features/Spectate/Spectate.h"
@@ -20,7 +20,7 @@ MAKE_HOOK(CViewRender_LevelInit, U::Memory.GetVirtual(I::ViewRender, 1), void,
F::Backtrack.Reset();
F::Ticks.Reset();
F::NoSpreadHitscan.Reset();
- F::CheaterDetection.Reset();
+ F::CheatDetection.Reset();
F::Resolver.Reset();
F::Spectate.Reset();
diff --git a/Amalgam/src/SDK/Events/Events.cpp b/Amalgam/src/SDK/Events/Events.cpp
index d140de40..68c93279 100644
--- a/Amalgam/src/SDK/Events/Events.cpp
+++ b/Amalgam/src/SDK/Events/Events.cpp
@@ -3,7 +3,7 @@
#include "../../Core/Core.h"
#include "../../Features/Aimbot/AutoHeal/AutoHeal.h"
#include "../../Features/Backtrack/Backtrack.h"
-#include "../../Features/CheaterDetection/CheaterDetection.h"
+#include "../../Features/CheatDetection/CheatDetection.h"
#include "../../Features/CritHack/CritHack.h"
#include "../../Features/Misc/Misc.h"
#include "../../Features/PacketManip/AntiAim/AntiAim.h"
@@ -57,7 +57,7 @@ void CEventListener::FireGameEvent(IGameEvent* pEvent)
case FNV1A::Hash32Const("player_hurt"):
{
F::Resolver.PlayerHurt(pEvent);
- F::CheaterDetection.ReportDamage(pEvent);
+ F::CheatDetection.ReportDamage(pEvent);
return;
}
case FNV1A::Hash32Const("player_spawn"):
diff --git a/Amalgam/src/SDK/Helpers/Entities/Entities.cpp b/Amalgam/src/SDK/Helpers/Entities/Entities.cpp
index 905911e3..b054aa61 100644
--- a/Amalgam/src/SDK/Helpers/Entities/Entities.cpp
+++ b/Amalgam/src/SDK/Helpers/Entities/Entities.cpp
@@ -4,7 +4,7 @@
#include "../../../Utils/Hash/FNV1A.h"
#include "../../../Features/Players/PlayerUtils.h"
#include "../../../Features/Backtrack/Backtrack.h"
-#include "../../../Features/CheaterDetection/CheaterDetection.h"
+#include "../../../Features/CheatDetection/CheatDetection.h"
#include "../../../Features/Resolver/Resolver.h"
void CEntities::Store()
@@ -266,7 +266,7 @@ void CEntities::Store()
m_aOrigins[n].pop_back();
if (pPlayer->IsAlive())
- F::CheaterDetection.ReportChoke(pPlayer, m_aChokes[n]);
+ F::CheatDetection.ReportChoke(pPlayer, m_aChokes[n]);
m_aOldAngles[n] = m_aEyeAngles[n], m_aEyeAngles[n] = pPlayer->As()->GetEyeAngles();
}
diff --git a/Amalgam/src/SDK/Vars.h b/Amalgam/src/SDK/Vars.h
index 3147474c..c297bf43 100644
--- a/Amalgam/src/SDK/Vars.h
+++ b/Amalgam/src/SDK/Vars.h
@@ -468,8 +468,7 @@ NAMESPACE_BEGIN(Vars)
NAMESPACE_END(AutoPeek)
NAMESPACE_BEGIN(Speedhack)
- CVar(Enabled, VA_LIST("Enabled", "Speedhack enabled"), false);
- CVar(Amount, VA_LIST("Amount", "SpeedHack amount"), 1, NONE, 1, 50);
+ CVar(Scale, VA_LIST("Scale", "SpeedHack scale"), 1, NONE, 1, 50);
NAMESPACE_END(Speedhack)
NAMESPACE_BEGIN(AntiAim, Antiaim)
@@ -496,8 +495,7 @@ NAMESPACE_BEGIN(Vars)
CVar(FakeYawValue, "Fake value", -90.f, SLIDER_CLAMP | SLIDER_PRECISION, -180.f, 180.f, 5.f);
CVar(SpinSpeed, "Spin speed", 15.f, SLIDER_PRECISION, -30.f, 30.f);
CVar(MinWalk, "Minwalk", true);
- CVar(AntiOverlap, "Anti-overlap", false);
- CVar(InvalidShootPitch, "Hide pitch on shot", false);
+ CVar(HidePitchOnShot, "Hide pitch on shot", false);
CVar(AntiAimLines, "Antiaim lines", false, NOSAVE);
NAMESPACE_END(AntiAim)
@@ -515,16 +513,6 @@ NAMESPACE_BEGIN(Vars)
CVar(CycleMinwalk, "Cycle minwalk", false);
NAMESPACE_END(Resolver)
- NAMESPACE_BEGIN(CheaterDetection, Cheater Detection)
- CVarEnum(Methods, "Detection methods", 0b0000, DROPDOWN_MULTI, nullptr,
- VA_LIST("Invalid pitch", "Packet choking", "Aim flicking", "Duck Speed"),
- InvalidPitch = 1 << 0, PacketChoking = 1 << 1, AimFlicking = 1 << 2, DuckSpeed = 1 << 3);
- CVar(DetectionsRequired, "Detections required", 10, SLIDER_MIN, 0, 50);
- CVar(MinimumChoking, "Minimum choking", 20, SLIDER_MIN, 4, 22);
- CVar(MinimumFlick, "Minimum flick angle", 20.f, SLIDER_PRECISION, 10.f, 30.f); // min flick size to suspect
- CVar(MaximumNoise, "Maximum flick noise", 1.f, SLIDER_PRECISION, 1.f, 10.f); // max difference between angles before and after flick
- NAMESPACE_END(CheaterDetection)
-
NAMESPACE_BEGIN(ESP)
CVarValues(ActiveGroups, "Active groups", int(0b11111111111111111111111111111111), VISUAL | DROPDOWN_MULTI | DROPDOWN_NOSANITIZATION, nullptr);
NAMESPACE_END(ESP)
@@ -595,8 +583,8 @@ NAMESPACE_BEGIN(Vars)
NAMESPACE_END(Tracers)
NAMESPACE_BEGIN(Viewmodel)
- CVar(CrosshairAim, "Crosshair aim position", false, VISUAL);
- CVar(ViewmodelAim, "Viewmodel aim position", false, VISUAL);
+ CVar(CrosshairAim, "Crosshair aim", false, VISUAL);
+ CVar(ViewmodelAim, "Viewmodel aim", false, VISUAL);
CVar(OffsetX, VA_LIST("Offset X", "Viewmodel offset X"), 0.f, VISUAL | SLIDER_PRECISION, -45.f, 45.f, 5.f);
CVar(OffsetY, VA_LIST("Offset Y", "Viewmodel offset Y"), 0.f, VISUAL | SLIDER_PRECISION, -45.f, 45.f, 5.f);
CVar(OffsetZ, VA_LIST("Offset Z", "Viewmodel offset Z"), 0.f, VISUAL | SLIDER_PRECISION, -45.f, 45.f, 5.f);
@@ -717,8 +705,8 @@ NAMESPACE_BEGIN(Vars)
CVarEnum(AutoStrafe, "Auto strafe", 0, NONE, nullptr,
VA_LIST("Off", "Legit", "Directional"),
Off, Legit, Directional);
- CVar(AutoStrafeTurnScale, "Auto strafe turn scale", 0.5f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 1.f, 0.1f);
- CVar(AutoStrafeMaxDelta, "Auto strafe max delta", 180.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 180.f, 5.f);
+ CVar(AutoStrafeTurnScale, VA_LIST("Turn scale", "Auto strafe turn scale"), 0.5f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 1.f, 0.1f);
+ CVar(AutoStrafeMaxDelta, VA_LIST("Max delta", "Auto strafe max delta"), 180.f, SLIDER_CLAMP | SLIDER_PRECISION, 0.f, 180.f, 5.f);
CVar(Bunnyhop, "Bunnyhop", false);
CVar(EdgeJump, "Edge jump", false);
CVar(AutoJumpbug, "Auto jumpbug", false);
@@ -746,10 +734,10 @@ NAMESPACE_BEGIN(Vars)
CVarEnum(AntiBackstab, "Anti-backstab", 0, NONE, nullptr,
VA_LIST("Off", "Yaw", "Pitch", "Fake"),
Off, Yaw, Pitch, Fake);
- CVar(AntiAFK, "Anti-AFK", false);
- CVar(AntiAutobalance, "Anti-autobalance", false);
CVar(TauntControl, "Taunt control", false);
CVar(KartControl, "Kart control", false);
+ CVar(AntiAutobalance, "Anti-autobalance", false);
+ CVar(AntiAFK, "Anti-AFK", false);
CVar(AutoF2Ignored, "Auto F2 ignored", false);
CVar(AutoF1Priority, "Auto F1 priority", false);
CVar(AcceptItemDrops, "Auto accept item drops", false);
@@ -844,46 +832,56 @@ NAMESPACE_BEGIN(Vars)
CVar(Lifetime, "Notification time", 5.f, VISUAL, 0.5f, 5.f, 0.5f);
NAMESPACE_BEGIN(VoteStart, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Vote start log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Vote start log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(VoteStart)
NAMESPACE_BEGIN(VoteCast, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Vote cast log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Vote cast log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(VoteCast)
NAMESPACE_BEGIN(ClassChange, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Class change log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Class change log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(ClassChange)
NAMESPACE_BEGIN(Damage, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Damage log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Damage log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(Damage)
NAMESPACE_BEGIN(CheatDetection, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Cheat detection log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Cheat detection log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(CheatDetection)
NAMESPACE_BEGIN(Tags, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Tags log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Tags log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(Tags)
NAMESPACE_BEGIN(Aliases, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Aliases log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Aliases log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(Aliases)
NAMESPACE_BEGIN(Resolver, Logging)
- CVarValues(LogTo, VA_LIST("Log to", "Resolver log to"), 0b000001, DROPDOWN_MULTI, nullptr,
+ CVarValues(LogTo, "Resolver log to", 0b000001, DROPDOWN_MULTI, nullptr,
"Toasts", "Chat", "Party", "Console", "Menu", "Debug");
NAMESPACE_END(Resolver)
NAMESPACE_END(Logging)
+ NAMESPACE_BEGIN(CheatDetection, Cheat Detection)
+ CVarEnum(Methods, "Detection methods", 0b0000, DROPDOWN_MULTI, nullptr,
+ VA_LIST("Invalid pitch", "Packet choking", "Aim flicking", "Duck Speed"),
+ InvalidPitch = 1 << 0, PacketChoking = 1 << 1, AimFlicking = 1 << 2, DuckSpeed = 1 << 3);
+ CVar(DetectionsRequired, "Detections required", 10, SLIDER_MIN, 0, 50);
+ CVar(MinChoking, "Min choking", 20, SLIDER_MIN, 4, 22);
+ CVar(MinFlick, "Min flick angle", 20.f, SLIDER_PRECISION, 10.f, 30.f); // min flick size to suspect
+ CVar(MaxNoise, "Max flick noise", 1.f, SLIDER_PRECISION, 1.f, 10.f); // max difference between angles before and after flick
+ NAMESPACE_END(CheatDetection)
+
NAMESPACE_BEGIN(Debug)
CVar(Info, "Debug info", false, NOSAVE);
CVar(Logging, "Debug logging", false, NOSAVE);