From 60689a50a2fa51d22c3bb834f3ba7eca3cb564e1 Mon Sep 17 00:00:00 2001 From: rei-2 <174158077+rei-2@users.noreply.github.com> Date: Sun, 8 Feb 2026 01:28:05 -0500 Subject: [PATCH] misc fixes and changes --- Amalgam/cpp.hint | 6 +- .../Aimbot/AimbotGlobal/AimbotGlobal.cpp | 15 +- .../src/Features/Aimbot/AutoHeal/AutoHeal.cpp | 7 +- Amalgam/src/Features/Backtrack/Backtrack.cpp | 5 +- Amalgam/src/Features/Backtrack/Backtrack.h | 2 +- Amalgam/src/Features/Binds/Binds.cpp | 19 ++- Amalgam/src/Features/Binds/Binds.h | 1 + Amalgam/src/Features/Commands/Commands.cpp | 160 ++++++++---------- Amalgam/src/Features/CritHack/CritHack.cpp | 27 ++- Amalgam/src/Features/ImGui/Menu/Components.h | 6 - Amalgam/src/Features/ImGui/Menu/Menu.cpp | 4 +- .../src/Features/Misc/AutoQueue/AutoQueue.cpp | 6 +- Amalgam/src/Features/Misc/Misc.cpp | 5 + .../Features/Visuals/Materials/Materials.cpp | 9 +- Amalgam/src/Features/Visuals/Visuals.cpp | 56 +++--- .../src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp | 14 +- .../Definitions/Interfaces/CTFPartyClient.h | 63 +++++++ .../src/SDK/Definitions/Main/CBaseEntity.h | 2 +- .../src/SDK/Definitions/Main/CTFPlayer.cpp | 45 ++--- .../src/SDK/Definitions/Main/KeyValues.cpp | 7 + Amalgam/src/SDK/Definitions/Main/KeyValues.h | 1 + Amalgam/src/SDK/Definitions/Types.h | 24 +-- Amalgam/src/SDK/Events/Events.cpp | 15 +- Amalgam/src/SDK/SDK.cpp | 12 +- Amalgam/src/SDK/SDK.h | 27 +-- Amalgam/src/Utils/Memory/Memory.h | 5 + Amalgam/src/Utils/NetVars/NetVars.h | 2 +- 27 files changed, 309 insertions(+), 236 deletions(-) diff --git a/Amalgam/cpp.hint b/Amalgam/cpp.hint index 9f807125..012f5af2 100644 --- a/Amalgam/cpp.hint +++ b/Amalgam/cpp.hint @@ -67,7 +67,7 @@ namespace MAKE_INTERFACE_SCOPE \ static int nOffset = U::NetVars.GetNetVar(table, name); \ return reinterpret_cast(uintptr_t(this) + nOffset); \ } -#define NETVAR_EMBED_OFF(_name, type, table, name, offset) inline type _name() \ +#define NETVAR_OFF_EMBED(_name, type, table, name, offset) inline type _name() \ { \ static int nOffset = U::NetVars.GetNetVar(table, name) + offset; \ return reinterpret_cast(uintptr_t(this) + nOffset); \ @@ -86,6 +86,10 @@ namespace MAKE_INTERFACE_SCOPE \ { \ return *reinterpret_cast(uintptr_t(this) + offset); \ } +#define OFFSET_EMBED(name, type, offset) inline type name() \ +{ \ + return reinterpret_cast(uintptr_t(this) + offset); \ +} #define CONDGET(name, conditions, cond) inline bool name() \ { \ return conditions & cond; \ diff --git a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp index fa415a4b..54afd6e3 100644 --- a/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp +++ b/Amalgam/src/Features/Aimbot/AimbotGlobal/AimbotGlobal.cpp @@ -20,16 +20,18 @@ void CAimbotGlobal::SortTargetsPre(std::vector& vTargets, int iMethod) switch (iMethod) { case Vars::Aimbot::General::TargetSelectionEnum::FOV: - return std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool + std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool { return a.m_flFOVTo < b.m_flFOVTo; }); + break; case Vars::Aimbot::General::TargetSelectionEnum::Distance: case Vars::Aimbot::General::TargetSelectionEnum::Hybrid: - return std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool - { - return a.m_flDistTo < b.m_flDistTo; - }); + std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool + { + return a.m_flDistTo < b.m_flDistTo; + }); + break; } } @@ -38,10 +40,11 @@ void CAimbotGlobal::SortTargetsPost(std::vector& vTargets, int iMethod switch (iMethod) { case Vars::Aimbot::General::TargetSelectionEnum::Hybrid: - return std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool + std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool { return a.m_flFOVTo < b.m_flFOVTo; }); + break; } std::sort(vTargets.begin(), vTargets.end(), [&](const Target_t& a, const Target_t& b) -> bool diff --git a/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp b/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp index 9bc00f93..8c90e6f5 100644 --- a/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp +++ b/Amalgam/src/Features/Aimbot/AutoHeal/AutoHeal.cpp @@ -733,11 +733,16 @@ void CAutoHeal::Event(IGameEvent* pEvent, uint32_t uHash) #ifdef DEBUG_VACCINATOR SDK::Output("Hurt", std::format("{}, {}", m_iDamagedType, m_flDamagedDPS).c_str(), { 255, 100, 100 }); #endif - break; + return; } case FNV1A::Hash32Const("player_spawn"): + { + if (I::EngineClient->GetPlayerForUserID(pEvent->GetInt("userid")) != I::EngineClient->GetLocalPlayer()) + return; + m_flDamagedTime = 0.f; } + } } #ifdef DEBUG_VACCINATOR diff --git a/Amalgam/src/Features/Backtrack/Backtrack.cpp b/Amalgam/src/Features/Backtrack/Backtrack.cpp index 912e907e..153e47da 100644 --- a/Amalgam/src/Features/Backtrack/Backtrack.cpp +++ b/Amalgam/src/Features/Backtrack/Backtrack.cpp @@ -101,10 +101,9 @@ void CBacktrack::SendLerp() } } -void CBacktrack::SetLerp(IGameEvent* pEvent) +void CBacktrack::SetLerp() { - if (I::EngineClient->GetPlayerForUserID(pEvent->GetInt("userid")) == I::EngineClient->GetLocalPlayer()) - m_flFakeInterp = m_flSentInterp; + m_flFakeInterp = m_flSentInterp; } void CBacktrack::UpdateDatagram() diff --git a/Amalgam/src/Features/Backtrack/Backtrack.h b/Amalgam/src/Features/Backtrack/Backtrack.h index 4403929d..aa8712ec 100644 --- a/Amalgam/src/Features/Backtrack/Backtrack.h +++ b/Amalgam/src/Features/Backtrack/Backtrack.h @@ -59,7 +59,7 @@ public: float GetFakeLatency(); float GetFakeInterp(); float GetWindow(); - void SetLerp(IGameEvent* pEvent); + void SetLerp(); int GetAnticipatedChoke(int iMethod = Vars::Aimbot::General::AimType.Value); void ResolverUpdate(CBaseEntity* pEntity); diff --git a/Amalgam/src/Features/Binds/Binds.cpp b/Amalgam/src/Features/Binds/Binds.cpp index 9c67d488..6d040384 100644 --- a/Amalgam/src/Features/Binds/Binds.cpp +++ b/Amalgam/src/Features/Binds/Binds.cpp @@ -17,6 +17,7 @@ static inline void SetMain(BaseVar*& pBase, int iBind) #define Set(t, b) if (IsType(t)) SetMain(pBase, b); static std::unordered_map s_mVars = {}; +static bool s_bUI = false, s_bMenu = false; static inline void LoopVars(int iBind, std::vector& vVars = G::Vars) { @@ -66,16 +67,14 @@ static inline void GetBinds(int iParent, CTFPlayer* pLocal, CTFWeaponBase* pWeap case BindEnum::KeyEnum::Toggle: bKey = U::KeyHandler.Pressed(tBind.m_iKey, false, &tBind.m_tKeyStorage); break; case BindEnum::KeyEnum::DoubleClick: bKey = U::KeyHandler.Double(tBind.m_iKey, false, &tBind.m_tKeyStorage); break; } - const bool bShouldUse = !I::EngineVGui->IsGameUIVisible() && (!I::MatSystemSurface->IsCursorVisible() || I::EngineClient->IsPlayingDemo()) - || F::Menu.m_bIsOpen && !ImGui::GetIO().WantTextInput && !F::Menu.m_bInKeybind && (!F::Menu.m_bWindowHovered || tBind.m_iKey != VK_LBUTTON && tBind.m_iKey != VK_RBUTTON); // allow in menu - bKey = bShouldUse && bKey; + bKey = bKey && (!s_bUI || s_bMenu && (!F::Menu.m_bWindowHovered || tBind.m_iKey != VK_LBUTTON && tBind.m_iKey != VK_RBUTTON)); // allow in menu switch (tBind.m_iInfo) { case BindEnum::KeyEnum::Hold: - if (tBind.m_bNot) - bKey = !bKey; tBind.m_bActive = bKey; + if (tBind.m_bNot) + tBind.m_bActive = !tBind.m_bActive; break; case BindEnum::KeyEnum::Toggle: case BindEnum::KeyEnum::DoubleClick: @@ -105,10 +104,7 @@ static inline void GetBinds(int iParent, CTFPlayer* pLocal, CTFWeaponBase* pWeap } case BindEnum::WeaponType: { - if (tBind.m_iInfo != BindEnum::WeaponTypeEnum::Throwable) - tBind.m_bActive = tBind.m_iInfo + 1 == int(SDK::GetWeaponType(pWeapon)); - else - tBind.m_bActive = G::Throwing; + tBind.m_bActive = tBind.m_iInfo == BindEnum::WeaponTypeEnum::Throwable ? G::Throwing : tBind.m_iInfo + 1 == int(SDK::GetWeaponType(pWeapon)); if (tBind.m_bNot) tBind.m_bActive = !tBind.m_bActive; break; @@ -187,8 +183,13 @@ static inline void GetBinds(int iParent, CTFPlayer* pLocal, CTFWeaponBase* pWeap void CBinds::SetVars(CTFPlayer* pLocal, CTFWeaponBase* pWeapon, bool bManage) { s_mVars.clear(); + s_bUI = I::EngineVGui->IsGameUIVisible() || I::MatSystemSurface->IsCursorVisible() && !I::EngineClient->IsPlayingDemo(); + s_bMenu = F::Menu.m_bIsOpen && !ImGui::GetIO().WantTextInput && !F::Menu.m_bInKeybind; + GetBinds(DEFAULT_BIND, pLocal, pWeapon, m_vBinds, bManage); LoopVars(DEFAULT_BIND); + + m_bDisplay = F::Menu.m_bIsOpen || Vars::Menu::BindWindow.Value && !s_bUI; } void CBinds::Run() diff --git a/Amalgam/src/Features/Binds/Binds.h b/Amalgam/src/Features/Binds/Binds.h index d1bd3dcc..952deef0 100644 --- a/Amalgam/src/Features/Binds/Binds.h +++ b/Amalgam/src/Features/Binds/Binds.h @@ -47,6 +47,7 @@ public: void Move(int i1, int i2); std::vector m_vBinds = {}; + bool m_bDisplay = false; }; ADD_FEATURE(CBinds, Binds); \ No newline at end of file diff --git a/Amalgam/src/Features/Commands/Commands.cpp b/Amalgam/src/Features/Commands/Commands.cpp index b9548e6f..4cc91583 100644 --- a/Amalgam/src/Features/Commands/Commands.cpp +++ b/Amalgam/src/Features/Commands/Commands.cpp @@ -5,108 +5,90 @@ #include #include +#define AddCommand(sCommand, fCommand) \ +{ \ + FNV1A::Hash32Const(sCommand), \ + [](const std::deque& vArgs) \ + fCommand \ +}, + static std::unordered_map s_mCommands = { + AddCommand("setcvar", { - FNV1A::Hash32Const("setcvar"), - [](const std::deque& vArgs) + if (vArgs.size() < 2) { - if (vArgs.size() < 2) - { - SDK::Output("Usage:\n\tsetcvar "); - return; - } + SDK::Output("Usage:\n\tsetcvar "); + return; + } - const char* sCVar = vArgs[0]; - auto pCVar = I::CVar->FindVar(sCVar); - if (!pCVar) - { - SDK::Output(std::format("Could not find {}", sCVar).c_str()); - return; - } + const char* sCVar = vArgs[0]; + auto pCVar = I::CVar->FindVar(sCVar); + if (!pCVar) + { + SDK::Output(std::format("Could not find {}", sCVar).c_str()); + return; + } - std::string sValue = ""; - for (int i = 1; i < vArgs.size(); i++) - sValue += std::format("{} ", vArgs[i]); - sValue.pop_back(); - boost::replace_all(sValue, "\"", ""); + std::string sValue = ""; + for (int i = 1; i < vArgs.size(); i++) + sValue += std::format("{} ", vArgs[i]); + sValue.pop_back(); + boost::replace_all(sValue, "\"", ""); - pCVar->SetValue(sValue.c_str()); - SDK::Output(std::format("Set {} to {}", sCVar, sValue).c_str()); - } - }, + pCVar->SetValue(sValue.c_str()); + SDK::Output(std::format("Set {} to {}", sCVar, sValue).c_str()); + }) + AddCommand("getcvar", { - FNV1A::Hash32Const("getcvar"), - [](const std::deque& vArgs) + if (vArgs.size() != 1) { - if (vArgs.size() != 1) - { - SDK::Output("Usage:\n\tgetcvar "); - return; - } + SDK::Output("Usage:\n\tgetcvar "); + return; + } - const char* sCVar = vArgs[0]; - auto pCVar = I::CVar->FindVar(sCVar); - if (!pCVar) - { - SDK::Output(std::format("Could not find {}", sCVar).c_str()); - return; - } + const char* sCVar = vArgs[0]; + auto pCVar = I::CVar->FindVar(sCVar); + if (!pCVar) + { + SDK::Output(std::format("Could not find {}", sCVar).c_str()); + return; + } - SDK::Output(std::format("Value of {} is {}", sCVar, pCVar->GetString()).c_str()); - } - }, + SDK::Output(std::format("Value of {} is {}", sCVar, pCVar->GetString()).c_str()); + }) + AddCommand("queue", { - FNV1A::Hash32Const("queue"), - [](const std::deque& vArgs) + if (!I::TFPartyClient->AnySelected()) + I::TFPartyClient->LoadSavedCasualCriteria(); + I::TFPartyClient->RequestQueueForMatch(k_eTFMatchGroup_Casual_Default); + }) + AddCommand("clear_chat", + { + I::ClientModeShared->m_pChatElement->SetText(""); + }) + AddCommand("menu", + { + I::MatSystemSurface->SetCursorAlwaysVisible(F::Menu.m_bIsOpen = !F::Menu.m_bIsOpen); + }) + AddCommand("unload", + { + if (F::Menu.m_bIsOpen) + I::MatSystemSurface->SetCursorAlwaysVisible(F::Menu.m_bIsOpen = false); + U::Core.m_bUnload = true; + }) + AddCommand("crash", + { // if you want to time out of a server and rejoin + switch (vArgs.empty() ? 0 : FNV1A::Hash32(vArgs.front())) { - static bool bHasLoaded = false; - if (!bHasLoaded) - { - I::TFPartyClient->LoadSavedCasualCriteria(); - bHasLoaded = true; - } - I::TFPartyClient->RequestQueueForMatch(k_eTFMatchGroup_Casual_Default); + case FNV1A::Hash32Const("true"): + case FNV1A::Hash32Const("t"): + case FNV1A::Hash32Const("1"): + break; + default: + Vars::Debug::CrashLogging.Value = false; // we are voluntarily crashing, don't give out log if we don't want one } - }, - { - FNV1A::Hash32Const("clear_chat"), - [](const std::deque& vArgs) - { - I::ClientModeShared->m_pChatElement->SetText(""); - } - }, - { - FNV1A::Hash32Const("menu"), - [](const std::deque& vArgs) - { - I::MatSystemSurface->SetCursorAlwaysVisible(F::Menu.m_bIsOpen = !F::Menu.m_bIsOpen); - } - }, - { - FNV1A::Hash32Const("unload"), - [](const std::deque& vArgs) - { - if (F::Menu.m_bIsOpen) - I::MatSystemSurface->SetCursorAlwaysVisible(F::Menu.m_bIsOpen = false); - U::Core.m_bUnload = true; - } - }, - { - FNV1A::Hash32Const("crash"), - [](const std::deque& vArgs) - { // if you want to time out of a server and rejoin - switch (vArgs.empty() ? 0 : FNV1A::Hash32(vArgs.front())) - { - case FNV1A::Hash32Const("true"): - case FNV1A::Hash32Const("t"): - case FNV1A::Hash32Const("1"): - break; - default: - Vars::Debug::CrashLogging.Value = false; // we are voluntarily crashing, don't give out log if we don't want one - } - reinterpret_cast(0)(); - } - }, + reinterpret_cast(0)(); + }) }; bool CCommands::Run(const char* sCmd, std::deque& vArgs) diff --git a/Amalgam/src/Features/CritHack/CritHack.cpp b/Amalgam/src/Features/CritHack/CritHack.cpp index 0efa4aa6..719fb733 100644 --- a/Amalgam/src/Features/CritHack/CritHack.cpp +++ b/Amalgam/src/Features/CritHack/CritHack.cpp @@ -418,7 +418,7 @@ void CCritHack::Event(IGameEvent* pEvent, uint32_t uHash, CTFPlayer* pLocal) case FNV1A::Hash32Const("player_hurt"): { if (!pLocal) - break; + return; int iVictim = I::EngineClient->GetPlayerForUserID(pEvent->GetInt("userid")); int iAttacker = I::EngineClient->GetPlayerForUserID(pEvent->GetInt("attacker")); @@ -456,7 +456,7 @@ void CCritHack::Event(IGameEvent* pEvent, uint32_t uHash, CTFPlayer* pLocal) StoreHealthHistory(iVictim, iHealth); if (iVictim == iAttacker || iAttacker != I::EngineClient->GetLocalPlayer()) - break; + return; if (auto pGameRules = I::TFGameRules()) { @@ -498,17 +498,34 @@ void CCritHack::Event(IGameEvent* pEvent, uint32_t uHash, CTFPlayer* pLocal) else m_iMeleeDamage += iDamage; - break; + return; + } + case FNV1A::Hash32Const("player_spawn"): + { + int iIndex = I::EngineClient->GetPlayerForUserID(pEvent->GetInt("userid")); + + if (m_mHealthHistory.contains(iIndex)) + { + auto& tHistory = m_mHealthHistory[iIndex]; + + tHistory.m_iSpawnCounter = -1; + } + + return; } case FNV1A::Hash32Const("scorestats_accumulated_update"): case FNV1A::Hash32Const("mvm_reset_stats"): + { m_iRangedDamage = m_iCritDamage = m_iMeleeDamage = 0; - break; + return; + } case FNV1A::Hash32Const("client_beginconnect"): case FNV1A::Hash32Const("client_disconnect"): case FNV1A::Hash32Const("game_newmap"): + { Reset(); } + } } void CCritHack::Store() @@ -533,7 +550,7 @@ void CCritHack::StoreHealthHistory(int iIndex, int iHealth, CTFPlayer* pPlayer) else if (tHistory.m_iSpawnCounter == -1) tHistory.m_iSpawnCounter = pPlayer->m_iSpawnCounter(); else if (tHistory.m_iSpawnCounter != pPlayer->m_iSpawnCounter()) - return; // wait for event + return; // wait for spawn } if (!bContains) diff --git a/Amalgam/src/Features/ImGui/Menu/Components.h b/Amalgam/src/Features/ImGui/Menu/Components.h index 0fbc8ace..f3698e3b 100644 --- a/Amalgam/src/Features/ImGui/Menu/Components.h +++ b/Amalgam/src/Features/ImGui/Menu/Components.h @@ -143,12 +143,6 @@ namespace ImGui return flMax; } - inline float fnmodf(float flX, float flY) - { - // silly fix for negative values - return fmodf(flX, flY) + (flX < 0 ? flY : 0); - } - inline bool IsColorBright(ImColor tColor, float flValue = 0.686f, float flRed = 0.299f, float flGreen = 0.587f, float flBlue = 0.114f) { return tColor.Value.x * flRed + tColor.Value.y * flGreen + tColor.Value.z * flBlue > flValue; diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp index c9c4590d..3cbdfba7 100644 --- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp +++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp @@ -2706,7 +2706,7 @@ void CMenu::MenuSettings(int iTab) case BindEnum::MiscEnum::Spectated: { sInfo = "any"; break; } case BindEnum::MiscEnum::SpectatedFirst: { sInfo = "1st"; break; } case BindEnum::MiscEnum::SpectatedThird: { sInfo = "3rd"; break; } - } + } break; case BindEnum::MiscEnum::Zoomed: case BindEnum::MiscEnum::Aiming: @@ -3539,7 +3539,7 @@ void CMenu::DrawBinds() { using namespace ImGui; - if (m_bIsOpen ? false : !Vars::Menu::BindWindow.Value || I::EngineVGui->IsGameUIVisible() || I::MatSystemSurface->IsCursorVisible() && !I::EngineClient->IsPlayingDemo()) + if (!F::Binds.m_bDisplay) return; std::vector vInfo; diff --git a/Amalgam/src/Features/Misc/AutoQueue/AutoQueue.cpp b/Amalgam/src/Features/Misc/AutoQueue/AutoQueue.cpp index b77e9f9e..bdb102af 100644 --- a/Amalgam/src/Features/Misc/AutoQueue/AutoQueue.cpp +++ b/Amalgam/src/Features/Misc/AutoQueue/AutoQueue.cpp @@ -4,12 +4,8 @@ void CAutoQueue::Run() { if (Vars::Misc::Queueing::AutoCasualQueue.Value && !I::TFPartyClient->BInQueueForMatchGroup(k_eTFMatchGroup_Casual_Default)) { - static bool bHasLoaded = false; - if (!bHasLoaded) - { + if (!I::TFPartyClient->AnySelected()) I::TFPartyClient->LoadSavedCasualCriteria(); - bHasLoaded = true; - } I::TFPartyClient->RequestQueueForMatch(k_eTFMatchGroup_Casual_Default); } } \ No newline at end of file diff --git a/Amalgam/src/Features/Misc/Misc.cpp b/Amalgam/src/Features/Misc/Misc.cpp index 91674b69..7456a594 100644 --- a/Amalgam/src/Features/Misc/Misc.cpp +++ b/Amalgam/src/Features/Misc/Misc.cpp @@ -420,8 +420,13 @@ void CMisc::Event(IGameEvent* pEvent, uint32_t uHash) switch (uHash) { case FNV1A::Hash32Const("player_spawn"): + { + if (I::EngineClient->GetPlayerForUserID(pEvent->GetInt("userid")) != I::EngineClient->GetLocalPlayer()) + return; + m_bPeekPlaced = false; } + } } int CMisc::AntiBackstab(CTFPlayer* pLocal, CUserCmd* pCmd, bool bSendPacket) diff --git a/Amalgam/src/Features/Visuals/Materials/Materials.cpp b/Amalgam/src/Features/Visuals/Materials/Materials.cpp index 739fa400..7a086a3a 100644 --- a/Amalgam/src/Features/Visuals/Materials/Materials.cpp +++ b/Amalgam/src/Features/Visuals/Materials/Materials.cpp @@ -182,9 +182,10 @@ void CMaterials::LoadMaterials() for (auto& [_, tMaterial] : m_mMaterials) { KeyValues* kv = new KeyValues(tMaterial.m_sName.c_str()); - bool bLoad = kv->LoadFromBuffer(tMaterial.m_sName.c_str(), tMaterial.m_sVMT.c_str()); + if (!kv->LoadFromBuffer(tMaterial.m_sName.c_str(), tMaterial.m_sVMT.c_str())) + continue; + ModifyKeyValues(kv); - tMaterial.m_pMaterial = Create(tMaterial.m_sName.c_str(), kv); //StoreVars(tMaterial); } @@ -233,8 +234,8 @@ void CMaterials::UnloadMaterials() { m_bLoaded = false; - for (auto& [_, mat] : m_mMaterials) - Remove(mat.m_pMaterial); + for (auto& [_, tMaterial] : m_mMaterials) + Remove(tMaterial.m_pMaterial); m_mMaterials.clear(); m_mMatList.clear(); diff --git a/Amalgam/src/Features/Visuals/Visuals.cpp b/Amalgam/src/Features/Visuals/Visuals.cpp index 1c578e93..78a137a3 100644 --- a/Amalgam/src/Features/Visuals/Visuals.cpp +++ b/Amalgam/src/Features/Visuals/Visuals.cpp @@ -450,6 +450,18 @@ std::vector CVisuals::GetHitboxes(matrix3x4* aBones, CBaseAnimating* Vec3 vMins = pBox->bbmin * pEntity->m_flModelScale(); Vec3 vMaxs = pBox->bbmax * pEntity->m_flModelScale(); + if (Vars::Debug::Info.Value) + { + float flBoneScale = Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value; + float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; + + if (F::AimbotGlobal.ShouldMultipoint(pEntity, nHitbox, Vars::Aimbot::Hitscan::MultipointHitboxes.Value)) + flBoneScale = std::max(flBoneScale, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); + + vMins = (pBox->bbmin + flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale(); + vMaxs = (pBox->bbmax - flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale(); + } + Color_t tEdge = bTargeted ? Vars::Colors::TargetHitboxEdgeIgnoreZ.Value : Vars::Colors::BoneHitboxEdgeIgnoreZ.Value; Color_t tFace = bTargeted ? Vars::Colors::TargetHitboxFaceIgnoreZ.Value : Vars::Colors::BoneHitboxFaceIgnoreZ.Value; if (tEdge.a || tFace.a) @@ -459,28 +471,6 @@ std::vector CVisuals::GetHitboxes(matrix3x4* aBones, CBaseAnimating* tFace = bTargeted ? Vars::Colors::TargetHitboxFace.Value : Vars::Colors::BoneHitboxFace.Value; if (tEdge.a || tFace.a) vBoxes.emplace_back(vOrigin, vMins, vMaxs, vAngle, I::GlobalVars->curtime + Vars::Visuals::Hitbox::DrawDuration.Value, tEdge, tFace, true); - - if (Vars::Debug::Info.Value) - { - float flBoneScale = Vars::Aimbot::Hitscan::BoneSizeMinimumScale.Value; - float flBoneSubtract = Vars::Aimbot::Hitscan::BoneSizeSubtract.Value; - - if (F::AimbotGlobal.ShouldMultipoint(pEntity, nHitbox, Vars::Aimbot::Hitscan::MultipointHitboxes.Value)) - flBoneScale = std::max(flBoneScale, Vars::Aimbot::Hitscan::MultipointScale.Value / 100.f); - - Vec3 vCheckMins = (pBox->bbmin + flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale(); - Vec3 vCheckMaxs = (pBox->bbmax - flBoneSubtract / pEntity->m_flModelScale()) * flBoneScale * pEntity->m_flModelScale(); - - tEdge = bTargeted ? Vars::Colors::TargetHitboxEdgeIgnoreZ.Value : Vars::Colors::BoneHitboxEdgeIgnoreZ.Value; - tFace = bTargeted ? Vars::Colors::TargetHitboxFaceIgnoreZ.Value : Vars::Colors::BoneHitboxFaceIgnoreZ.Value; - if (tEdge.a || tFace.a) - vBoxes.emplace_back(vOrigin, vCheckMins, vCheckMaxs, vAngle, I::GlobalVars->curtime + Vars::Visuals::Hitbox::DrawDuration.Value, tEdge, tFace); - - tEdge = bTargeted ? Vars::Colors::TargetHitboxEdge.Value : Vars::Colors::BoneHitboxEdge.Value; - tFace = bTargeted ? Vars::Colors::TargetHitboxFace.Value : Vars::Colors::BoneHitboxFace.Value; - if (tEdge.a || tFace.a) - vBoxes.emplace_back(vOrigin, vCheckMins, vCheckMaxs, vAngle, I::GlobalVars->curtime + Vars::Visuals::Hitbox::DrawDuration.Value, tEdge, tFace, true); - } } return vBoxes; @@ -766,15 +756,15 @@ void CVisuals::Event(IGameEvent* pEvent, uint32_t uHash) bool bBones = Vars::Visuals::Hitbox::BonesEnabled.Value & Vars::Visuals::Hitbox::BonesEnabledEnum::OnHit; bool bBounds = Vars::Visuals::Hitbox::BoundsEnabled.Value & Vars::Visuals::Hitbox::BoundsEnabledEnum::OnHit; if (!bBones && !bBounds) - break; + return; if (I::EngineClient->GetPlayerForUserID(pEvent->GetInt("attacker")) != I::EngineClient->GetLocalPlayer()) - break; + return; int iVictim = I::EngineClient->GetPlayerForUserID(pEvent->GetInt("userid")); auto pEntity = I::ClientEntityList->GetClientEntity(iVictim)->As(); if (!pEntity || iVictim == I::EngineClient->GetLocalPlayer()) - break; + return; switch (G::PrimaryWeaponType) { @@ -782,21 +772,21 @@ void CVisuals::Event(IGameEvent* pEvent, uint32_t uHash) case EWeaponType::MELEE: { if (!bBones) - break; + return; auto aBones = F::Backtrack.GetBones(pEntity); if (!aBones) - break; + return; auto vBoxes = GetHitboxes(aBones, pEntity); G::BoxStorage.insert(G::BoxStorage.end(), vBoxes.begin(), vBoxes.end()); - break; + return; } case EWeaponType::PROJECTILE: { if (!bBounds) - break; + return; if (Vars::Colors::BoundHitboxEdgeIgnoreZ.Value.a || Vars::Colors::BoundHitboxFaceIgnoreZ.Value.a) G::BoxStorage.emplace_back(pEntity->m_vecOrigin(), pEntity->m_vecMins(), pEntity->m_vecMaxs(), Vec3(), I::GlobalVars->curtime + Vars::Visuals::Hitbox::DrawDuration.Value, Vars::Colors::BoundHitboxEdgeIgnoreZ.Value, Vars::Colors::BoundHitboxFaceIgnoreZ.Value); @@ -805,7 +795,7 @@ void CVisuals::Event(IGameEvent* pEvent, uint32_t uHash) } } - break; + return; } case FNV1A::Hash32Const("item_pickup"): { @@ -824,15 +814,16 @@ void CVisuals::Event(IGameEvent* pEvent, uint32_t uHash) Group_t* pGroup = nullptr; if (!F::Groups.GetGroup(iType, pGroup, pEntity) || !pGroup->m_bPickupTimer) - break; + return; m_vPickups.emplace_back(iType, I::GlobalVars->curtime + 10.f, pEntity->m_vecOrigin()); - break; + return; } case FNV1A::Hash32Const("client_disconnect"): case FNV1A::Hash32Const("client_beginconnect"): case FNV1A::Hash32Const("game_newmap"): case FNV1A::Hash32Const("teamplay_round_start"): + { m_vPickups.clear(); G::LineStorage.clear(); @@ -841,6 +832,7 @@ void CVisuals::Event(IGameEvent* pEvent, uint32_t uHash) G::SphereStorage.clear(); G::SweptStorage.clear(); } + } } void CVisuals::Store() diff --git a/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp b/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp index 8996eec5..9a6bf1c7 100644 --- a/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp +++ b/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp @@ -44,12 +44,12 @@ MAKE_HOOK(VGuiMenuBuilder_AddMenuItem, S::VGuiMenuBuilder_AddMenuItem(), void*, const auto dwDesired1 = S::CTFClientScoreBoardDialog_OnScoreBoardMouseRightRelease_AddMenuItem_CallProfile(); const auto dwDesired2 = S::CTFClientScoreBoardDialog_OnScoreBoardMouseRightRelease_AddMenuItem_CallSpectate(); - if (dwRetAddr == dwDesired1 && Vars::Visuals::UI::ScoreboardUtility.Value && s_iPlayerIndex != -1) + if (dwRetAddr == dwDesired1 && Vars::Visuals::UI::ScoreboardUtility.Value) { - auto pReturn = CALL_ORIGINAL(rcx, pszButtonText, pszCommand, pszCategoryName); - - if (auto pResource = H::Entities.GetResource()) + if (auto pResource = H::Entities.GetResource(); pResource && pResource->m_bValid(s_iPlayerIndex)) { + auto pReturn = CALL_ORIGINAL(rcx, pszButtonText, pszCommand, pszCategoryName); + s_uAccountID = pResource->m_iAccountID(s_iPlayerIndex); s_sPlayerName = pResource->GetName(s_iPlayerIndex); @@ -67,12 +67,12 @@ MAKE_HOOK(VGuiMenuBuilder_AddMenuItem, S::VGuiMenuBuilder_AddMenuItem(), void*, bool bHasTag = F::PlayerUtils.HasTag(s_uAccountID, iID); CALL_ORIGINAL(rcx, std::format("{} {}", bHasTag ? "Remove" : "Add", tTag.m_sName).c_str(), std::format("modifytag{}", iID).c_str(), "tags"); } + + return pReturn; } - - return pReturn; } - if (dwRetAddr == dwDesired2 && Vars::Visuals::UI::ScoreboardUtility.Value && s_iPlayerIndex != -1) + if (dwRetAddr == dwDesired2 && Vars::Visuals::UI::ScoreboardUtility.Value) return nullptr; return CALL_ORIGINAL(rcx, pszButtonText, pszCommand, pszCategoryName); diff --git a/Amalgam/src/SDK/Definitions/Interfaces/CTFPartyClient.h b/Amalgam/src/SDK/Definitions/Interfaces/CTFPartyClient.h index fd1c16f5..edfe7aa7 100644 --- a/Amalgam/src/SDK/Definitions/Interfaces/CTFPartyClient.h +++ b/Amalgam/src/SDK/Definitions/Interfaces/CTFPartyClient.h @@ -5,6 +5,58 @@ MAKE_SIGNATURE(CTFPartyClient_SendPartyChat, "client.dll", "48 89 5C 24 ? 48 89 MAKE_SIGNATURE(CTFPartyClient_LoadSavedCasualCriteria, "client.dll", "48 83 79 ? ? C6 81 ? ? ? ? ? 74 ? 80 79 ? ? 74 ? C6 81 ? ? ? ? ? 48 8B 15", 0x0); MAKE_SIGNATURE(CTFPartyClient_BInQueueForMatchGroup, "client.dll", "48 89 5C 24 ? 57 48 83 EC ? 48 8B F9 8B DA 8B CA E8 ? ? ? ? 84 C0", 0x0); MAKE_SIGNATURE(CTFPartyClient_RequestQueueForMatch, "client.dll", "40 55 56 48 81 EC ? ? ? ? 48 63 F2", 0x0); +MAKE_SIGNATURE(CCasualCriteriaHelper_CCasualCriteriaHelper, "client.dll", "48 89 5C 24 ? 56 57 41 57 48 83 EC ? 0F 57 C0", 0x0); +MAKE_SIGNATURE(CTFGroupMatchCriteriaProto_DefaultInstance, "client.dll", "48 8B 05 ? ? ? ? 48 8B 50 ? 48 8D 4C 24 ? E8 ? ? ? ? 44 8B 44 24", 0x0); + +class CTFCasualMatchCriteria +{ +public: + +}; + +class CCasualCriteriaHelper +{ +public: + CCasualCriteriaHelper(const CTFCasualMatchCriteria* criteria) + { + S::CCasualCriteriaHelper_CCasualCriteriaHelper.Call(this, criteria); + } + + bool AnySelected() const { return !m_mapsBits.IsAllClear(); } + + CLargeVarBitVec m_mapsBits; +}; + +class CTFGroupMatchCriteriaProto +{ +public: + byte pad0[16]; + uint32 has_bits[1]; + mutable int cached_size; + bool late_join_ok; + uint32 custom_ping_tolerance; + std::string* mvm_mannup_tour; + byte mvm_mannup_missions[24]; + byte mvm_bootcamp_missions[24]; + CTFCasualMatchCriteria* casual_criteria; + + static CTFGroupMatchCriteriaProto* GetDefaultInstance() + { + auto default_instance = *reinterpret_cast(U::Memory.RelToAbs(S::CTFGroupMatchCriteriaProto_DefaultInstance())); + return default_instance; + } + + CTFCasualMatchCriteria* GetCasualCriteria() + { + return casual_criteria ? casual_criteria : GetDefaultInstance()->casual_criteria; + } +}; + +class CTFGroupMatchCriteria +{ +public: + VIRTUAL(Proto, CTFGroupMatchCriteriaProto*, 1, this); +}; class CTFPartyClient { @@ -13,6 +65,17 @@ public: SIGNATURE(LoadSavedCasualCriteria, void, CTFPartyClient, this); SIGNATURE_ARGS(BInQueueForMatchGroup, bool, CTFPartyClient, (int eMatchGroup), this, eMatchGroup); SIGNATURE_ARGS(RequestQueueForMatch, void, CTFPartyClient, (int eMatchGroup), this, eMatchGroup); + + OFFSET_EMBED(m_localGroupCriteria, CTFGroupMatchCriteria*, 432); + + bool AnySelected() + { + auto pCriteria = m_localGroupCriteria(); + auto pProto = pCriteria->Proto(); + auto pCasualCriteria = pProto->GetCasualCriteria(); + CCasualCriteriaHelper tHelper(pCasualCriteria); + return tHelper.AnySelected(); + } }; MAKE_INTERFACE_NULL(CTFPartyClient, TFPartyClient); \ No newline at end of file diff --git a/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h b/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h index 67f68afe..79018d09 100644 --- a/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h +++ b/Amalgam/src/SDK/Definitions/Main/CBaseEntity.h @@ -95,7 +95,7 @@ public: NETVAR_OFF(m_MoveType, byte, "CTFPlayer", "m_nWaterLevel", -4); NETVAR_OFF(m_MoveCollide, byte, "CTFPlayer", "m_nWaterLevel", -3); NETVAR_OFF(m_nWaterType, byte, "CTFPlayer", "m_nWaterLevel", 1); - NETVAR_EMBED_OFF(m_Particles, CParticleProperty*, "CBaseEntity", "m_flElasticity", -56); + NETVAR_OFF_EMBED(m_Particles, CParticleProperty*, "CBaseEntity", "m_flElasticity", -56); NETVAR_OFF(m_iv_vecVelocity, CInterpolatedVar, "CBaseEntity", "m_iTeamNum", 156); NETVAR_OFF(m_iv_vecOrigin, CInterpolatedVar, "CBaseEntity", "m_flShadowCastDistance", 84); NETVAR_OFF(m_iv_angRotation, CInterpolatedVar, "CBaseEntity", "m_vecOrigin", -128); diff --git a/Amalgam/src/SDK/Definitions/Main/CTFPlayer.cpp b/Amalgam/src/SDK/Definitions/Main/CTFPlayer.cpp index fc8b7075..c3c8339b 100644 --- a/Amalgam/src/SDK/Definitions/Main/CTFPlayer.cpp +++ b/Amalgam/src/SDK/Definitions/Main/CTFPlayer.cpp @@ -37,16 +37,11 @@ bool CTFPlayer::InCond(ETFCond eCond) { switch (eCond / 32) { - case 0: - return m_nPlayerCond() & (1 << eCond) || _condition_bits() & (1 << eCond); - case 1: - return m_nPlayerCondEx() & (1 << (eCond - 32)); - case 2: - return m_nPlayerCondEx2() & (1 << (eCond - 64)); - case 3: - return m_nPlayerCondEx3() & (1 << (eCond - 96)); - case 4: - return m_nPlayerCondEx4() & (1 << (eCond - 128)); + case 0: return m_nPlayerCond() & (1 << eCond) || _condition_bits() & (1 << eCond); + case 1: return m_nPlayerCondEx() & (1 << (eCond - 32)); + case 2: return m_nPlayerCondEx2() & (1 << (eCond - 64)); + case 3: return m_nPlayerCondEx3() & (1 << (eCond - 96)); + case 4: return m_nPlayerCondEx4() & (1 << (eCond - 128)); } return false; } @@ -55,16 +50,11 @@ void CTFPlayer::AddCond(ETFCond eCond) { switch (eCond / 32) { - case 0: - m_nPlayerCond() |= (1 << eCond), _condition_bits() |= (1 << eCond); break; - case 1: - m_nPlayerCondEx() |= (1 << (eCond - 32)); break; - case 2: - m_nPlayerCondEx2() |= (1 << (eCond - 64)); break; - case 3: - m_nPlayerCondEx3() |= (1 << (eCond - 96)); break; - case 4: - m_nPlayerCondEx4() |= (1 << (eCond - 128)); break; + case 0: m_nPlayerCond() |= (1 << eCond), _condition_bits() |= (1 << eCond); break; + case 1: m_nPlayerCondEx() |= (1 << (eCond - 32)); break; + case 2: m_nPlayerCondEx2() |= (1 << (eCond - 64)); break; + case 3: m_nPlayerCondEx3() |= (1 << (eCond - 96)); break; + case 4: m_nPlayerCondEx4() |= (1 << (eCond - 128)); break; } } @@ -72,16 +62,11 @@ void CTFPlayer::RemoveCond(ETFCond eCond) { switch (eCond / 32) { - case 0: - m_nPlayerCond() &= ~(1 << eCond), _condition_bits() &= ~(1 << eCond); break; - case 1: - m_nPlayerCondEx() &= ~(1 << (eCond - 32)); break; - case 2: - m_nPlayerCondEx2() &= ~(1 << (eCond - 64)); break; - case 3: - m_nPlayerCondEx3() &= ~(1 << (eCond - 96)); break; - case 4: - m_nPlayerCondEx4() &= ~(1 << (eCond - 128)); break; + case 0: m_nPlayerCond() &= ~(1 << eCond), _condition_bits() &= ~(1 << eCond); break; + case 1: m_nPlayerCondEx() &= ~(1 << (eCond - 32)); break; + case 2: m_nPlayerCondEx2() &= ~(1 << (eCond - 64)); break; + case 3: m_nPlayerCondEx3() &= ~(1 << (eCond - 96)); break; + case 4: m_nPlayerCondEx4() &= ~(1 << (eCond - 128)); break; } } diff --git a/Amalgam/src/SDK/Definitions/Main/KeyValues.cpp b/Amalgam/src/SDK/Definitions/Main/KeyValues.cpp index 4f1b978b..b6f2a503 100644 --- a/Amalgam/src/SDK/Definitions/Main/KeyValues.cpp +++ b/Amalgam/src/SDK/Definitions/Main/KeyValues.cpp @@ -462,6 +462,13 @@ void KeyValues::SetBool(const char* keyName, bool value) SetInt(keyName, value ? 1 : 0); } +void KeyValues::Clear() +{ + delete m_pSub; + m_pSub = NULL; + m_iDataType = TYPE_NONE; +} + void KeyValues::DeleteThis() { delete this; diff --git a/Amalgam/src/SDK/Definitions/Main/KeyValues.h b/Amalgam/src/SDK/Definitions/Main/KeyValues.h index 0112034b..20c90be0 100644 --- a/Amalgam/src/SDK/Definitions/Main/KeyValues.h +++ b/Amalgam/src/SDK/Definitions/Main/KeyValues.h @@ -89,6 +89,7 @@ public: void SetColor(const char* keyName, Color_t value); void SetBool(const char* keyName, bool value); + void Clear(); void DeleteThis(); }; diff --git a/Amalgam/src/SDK/Definitions/Types.h b/Amalgam/src/SDK/Definitions/Types.h index bc70ce76..bda8416b 100644 --- a/Amalgam/src/SDK/Definitions/Types.h +++ b/Amalgam/src/SDK/Definitions/Types.h @@ -843,7 +843,7 @@ struct Color_t flR = flG = flB = flV; else { - int i = int(floor(flH /= 60)); + int i = int(flH /= 60); float flF = flH - i; float flP = flV * (1 - flS); float flQ = flV * (1 - flF * flS); @@ -866,7 +866,7 @@ struct Color_t a = byte(std::clamp(flA, 0.f, 255.f)); } - inline void GetHSV(float& flH, float& flS, float& flV) + inline void GetHSV(float& flH, float& flS, float& flV) const { float flR = r / 255.f; float flG = g / 255.f; @@ -901,14 +901,14 @@ struct Color_t return tOut; } - inline bool operator==(Color_t other) const + inline bool operator==(const Color_t t) const { - return r == other.r && g == other.g && b == other.b && a == other.a; + return r == t.r && g == t.g && b == t.b && a == t.a; } - inline bool operator!=(Color_t other) const + inline bool operator!=(const Color_t t) const { - return r != other.r || g != other.g || b != other.b || a != other.a; + return r != t.r || g != t.g || b != t.b || a != t.a; } inline std::string ToHex() const @@ -981,14 +981,14 @@ struct Gradient_t Color_t StartColor = {}; Color_t EndColor = {}; - inline bool operator==(Gradient_t other) const + inline bool operator==(const Gradient_t& t) const { - return StartColor == other.StartColor && EndColor == other.EndColor; + return StartColor == t.StartColor && EndColor == t.EndColor; } - inline bool operator!=(Gradient_t other) const + inline bool operator!=(const Gradient_t& t) const { - return StartColor != other.StartColor || EndColor != other.EndColor; + return StartColor != t.StartColor || EndColor != t.EndColor; } }; @@ -1015,8 +1015,8 @@ struct Chams_t struct Glow_t { - int Stencil = 0; - float Blur = 0; + int Stencil = 0; + float Blur = 0; inline bool operator==(const Glow_t& t) const { diff --git a/Amalgam/src/SDK/Events/Events.cpp b/Amalgam/src/SDK/Events/Events.cpp index 98f187f9..d140de40 100644 --- a/Amalgam/src/SDK/Events/Events.cpp +++ b/Amalgam/src/SDK/Events/Events.cpp @@ -55,16 +55,23 @@ void CEventListener::FireGameEvent(IGameEvent* pEvent) switch (uHash) { case FNV1A::Hash32Const("player_hurt"): + { F::Resolver.PlayerHurt(pEvent); F::CheaterDetection.ReportDamage(pEvent); - break; + return; + } case FNV1A::Hash32Const("player_spawn"): - F::Backtrack.SetLerp(pEvent); - break; + { + if (I::EngineClient->GetPlayerForUserID(pEvent->GetInt("userid")) != I::EngineClient->GetLocalPlayer()) + return; + + F::Backtrack.SetLerp(); + return; + } case FNV1A::Hash32Const("revive_player_notify"): { if (!Vars::Misc::MannVsMachine::InstantRevive.Value || pEvent->GetInt("entindex") != I::EngineClient->GetLocalPlayer()) - break; + return; KeyValues* kv = new KeyValues("MVM_Revive_Response"); kv->SetBool("accepted", true); diff --git a/Amalgam/src/SDK/SDK.cpp b/Amalgam/src/SDK/SDK.cpp index 4698a389..b5a46ddc 100644 --- a/Amalgam/src/SDK/SDK.cpp +++ b/Amalgam/src/SDK/SDK.cpp @@ -276,7 +276,7 @@ bool SDK::IsOnScreen(CBaseEntity* pEntity, const matrix3x4& mTransform, float* p return !(flRight < 0 || flLeft > H::Draw.m_nScreenW || flTop < 0 || flBottom > H::Draw.m_nScreenH); } -bool SDK::IsOnScreen(CBaseEntity* pEntity, Vec3 vOrigin, bool bAll) +bool SDK::IsOnScreen(CBaseEntity* pEntity, const Vec3& vOrigin, bool bAll) { float flLeft = 0.f, flRight = 0.f, flTop = 0.f, flBottom = 0.f; @@ -389,7 +389,7 @@ bool SDK::VisPosWorld(CBaseEntity* pSkip, const CBaseEntity* pEntity, const Vec3 return true; } -Vec3 SDK::PredictOrigin(Vec3& vOrigin, Vec3 vVelocity, float flLatency, bool bTrace, Vec3 vMins, Vec3 vMaxs, unsigned int nMask, float flNormal) +Vec3 SDK::PredictOrigin(const Vec3& vOrigin, const Vec3& vVelocity, float flLatency, bool bTrace, const Vec3& vMins, const Vec3& vMaxs, unsigned int nMask, float flNormal) { if (vVelocity.IsZero() || !flLatency) return vOrigin; @@ -405,7 +405,7 @@ Vec3 SDK::PredictOrigin(Vec3& vOrigin, Vec3 vVelocity, float flLatency, bool bTr return trace.endpos + (flNormal ? trace.plane.normal * flNormal : Vec3()); } -bool SDK::PredictOrigin(Vec3& vOut, Vec3& vOrigin, Vec3 vVelocity, float flLatency, bool bTrace, Vec3 vMins, Vec3 vMaxs, unsigned int nMask, float flNormal) +bool SDK::PredictOrigin(Vec3& vOut, const Vec3& vOrigin, const Vec3& vVelocity, float flLatency, bool bTrace, const Vec3& vMins, const Vec3& vMaxs, unsigned int nMask, float flNormal) { vOut = vOrigin; if (vVelocity.IsZero() || !flLatency) @@ -764,7 +764,7 @@ bool SDK::StopMovement(CTFPlayer* pLocal, CUserCmd* pCmd) } } -Vec3 SDK::ComputeMove(const CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vFrom, Vec3& vTo) +Vec3 SDK::ComputeMove(const CUserCmd* pCmd, CTFPlayer* pLocal, const Vec3& vFrom, const Vec3& vTo) { const Vec3 vDiff = vTo - vFrom; if (!vDiff.Length2D()) @@ -782,7 +782,7 @@ Vec3 SDK::ComputeMove(const CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vFrom, Vec3 return vMove; } -void SDK::WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vFrom, Vec3& vTo, float flScale) +void SDK::WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, const Vec3& vFrom, const Vec3& vTo, float flScale) { const auto vResult = ComputeMove(pCmd, pLocal, vFrom, vTo); @@ -791,7 +791,7 @@ void SDK::WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vFrom, Vec3& vTo, floa pCmd->upmove = vResult.z * flScale; } -void SDK::WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vTo, float flScale) +void SDK::WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, const Vec3& vTo, float flScale) { Vec3 vLocalPos = pLocal->m_vecOrigin(); WalkTo(pCmd, pLocal, vLocalPos, vTo, flScale); diff --git a/Amalgam/src/SDK/SDK.h b/Amalgam/src/SDK/SDK.h index 48b82a9a..d3883752 100644 --- a/Amalgam/src/SDK/SDK.h +++ b/Amalgam/src/SDK/SDK.h @@ -61,11 +61,6 @@ #define VK_Y 0x59 #define VK_Z 0x5A -template int sign(T val) -{ - return (val > T(0)) - (val < T(0)); -} - #define OUTPUT_CONSOLE 1 << 0 #define OUTPUT_DEBUG 1 << 1 #define OUTPUT_TOAST 1 << 2 @@ -73,6 +68,16 @@ template int sign(T val) #define OUTPUT_CHAT 1 << 4 #define OUTPUT_PARTY 1 << 5 +template int sign(T val) +{ + return (val > T(0)) - (val < T(0)); +} + +inline float fnmodf(float flX, float flY) +{ // silly fix for negative values + return fmodf(flX, flY) + (flX < 0 ? flY : 0); +} + namespace SDK { void Output(const char* sFunction, const char* sLog = nullptr, Color_t tColor = { 255, 255, 255, 255 }, @@ -103,7 +108,7 @@ namespace SDK bool W2S(const Vec3& vOrigin, Vec3& vScreen, bool bAlways = false); bool IsOnScreen(CBaseEntity* pEntity, const matrix3x4& mTransform, float* pLeft = nullptr, float* pRight = nullptr, float* pTop = nullptr, float* pBottom = nullptr, bool bAll = false); - bool IsOnScreen(CBaseEntity* pEntity, Vec3 vOrigin, bool bAll = false); + bool IsOnScreen(CBaseEntity* pEntity, const Vec3& vOrigin, bool bAll = false); bool IsOnScreen(CBaseEntity* pEntity, bool bShouldGetOwner = true); void Trace(const Vec3& vStart, const Vec3& vEnd, unsigned int nMask, ITraceFilter* pFilter, CGameTrace* pTrace); @@ -113,8 +118,8 @@ namespace SDK bool VisPosCollideable(CBaseEntity* pSkip, const CBaseEntity* pEntity, const Vec3& vFrom, const Vec3& vTo, unsigned int nMask = MASK_SHOT | CONTENTS_GRATE); bool VisPosWorld(CBaseEntity* pSkip, const CBaseEntity* pEntity, const Vec3& vFrom, const Vec3& vTo, unsigned int nMask = MASK_SHOT | CONTENTS_GRATE); - Vec3 PredictOrigin(Vec3& vOrigin, Vec3 vVelocity, float flLatency, bool bTrace = true, Vec3 vMins = {}, Vec3 vMaxs = {}, unsigned int nMask = MASK_SOLID, float flNormal = 0.f); - bool PredictOrigin(Vec3& vOut, Vec3& vOrigin, Vec3 vVelocity, float flLatency, bool bTrace = true, Vec3 vMins = {}, Vec3 vMaxs = {}, unsigned int nMask = MASK_SOLID, float flNormal = 0.f); + Vec3 PredictOrigin(const Vec3& vOrigin, const Vec3& vVelocity, float flLatency, bool bTrace = true, const Vec3& vMins = {}, const Vec3& vMaxs = {}, unsigned int nMask = MASK_SOLID, float flNormal = 0.f); + bool PredictOrigin(Vec3& vOut, const Vec3& vOrigin, const Vec3& vVelocity, float flLatency, bool bTrace = true, const Vec3& vMins = {}, const Vec3& vMaxs = {}, unsigned int nMask = MASK_SOLID, float flNormal = 0.f); bool IsLoopback(); int GetRoundState(); @@ -130,9 +135,9 @@ namespace SDK void FixMovement(CUserCmd* pCmd, const Vec3& vTargetAngle); bool StopMovement(CTFPlayer* pLocal, CUserCmd* pCmd); - Vec3 ComputeMove(const CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vFrom, Vec3& vTo); - void WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vFrom, Vec3& vTo, float flScale = 1.f); - void WalkTo(CUserCmd* pCmd, CTFPlayer* pLocal, Vec3& vTo, float flScale = 1.f); + Vec3 ComputeMove(const CUserCmd* pCmd, CTFPlayer* pLocal, const Vec3& vFrom, const Vec3& vTo); + 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); diff --git a/Amalgam/src/Utils/Memory/Memory.h b/Amalgam/src/Utils/Memory/Memory.h index e5d726ab..ed2fdc74 100644 --- a/Amalgam/src/Utils/Memory/Memory.h +++ b/Amalgam/src/Utils/Memory/Memory.h @@ -59,6 +59,11 @@ ADD_FEATURE_CUSTOM(CMemory, Memory, U); return *reinterpret_cast(uintptr_t(this) + offset); \ } +#define OFFSET_EMBED(name, type, offset) inline type name() \ +{ \ + return reinterpret_cast(uintptr_t(this) + offset); \ +} + #define CONDGET(name, conditions, cond) inline bool name() \ { \ return conditions & cond; \ diff --git a/Amalgam/src/Utils/NetVars/NetVars.h b/Amalgam/src/Utils/NetVars/NetVars.h index 98ff430c..42ed2af8 100644 --- a/Amalgam/src/Utils/NetVars/NetVars.h +++ b/Amalgam/src/Utils/NetVars/NetVars.h @@ -32,7 +32,7 @@ ADD_FEATURE_CUSTOM(CNetVars, NetVars, U); return reinterpret_cast(uintptr_t(this) + nOffset); \ } -#define NETVAR_EMBED_OFF(_name, type, table, name, offset) inline type _name() \ +#define NETVAR_OFF_EMBED(_name, type, table, name, offset) inline type _name() \ { \ static int nOffset = U::NetVars.GetNetVar(table, name) + offset; \ return reinterpret_cast(uintptr_t(this) + nOffset); \