diff --git a/Amalgam/Amalgam.vcxproj b/Amalgam/Amalgam.vcxproj index 59363316..e16d0890 100644 --- a/Amalgam/Amalgam.vcxproj +++ b/Amalgam/Amalgam.vcxproj @@ -1055,6 +1055,7 @@ + @@ -1255,6 +1256,7 @@ + diff --git a/Amalgam/Amalgam.vcxproj.filters b/Amalgam/Amalgam.vcxproj.filters index 08c48409..e7411e43 100644 --- a/Amalgam/Amalgam.vcxproj.filters +++ b/Amalgam/Amalgam.vcxproj.filters @@ -200,6 +200,7 @@ + @@ -585,6 +586,7 @@ + diff --git a/Amalgam/src/Features/ImGui/Menu/Menu.cpp b/Amalgam/src/Features/ImGui/Menu/Menu.cpp index 5a66d4ac..1716a1b5 100644 --- a/Amalgam/src/Features/ImGui/Menu/Menu.cpp +++ b/Amalgam/src/Features/ImGui/Menu/Menu.cpp @@ -318,8 +318,9 @@ void CMenu::MenuAimbot(int iTab) FSlider(Vars::Aimbot::Projectile::SplashNormalSkip, FSliderEnum::Right); FDropdown(Vars::Aimbot::Projectile::SplashMode, FDropdownEnum::Left); FDropdown(Vars::Aimbot::Projectile::RocketSplashMode, FDropdownEnum::Right, 0, &Hovered); FTooltip("Special splash type for rockets, more expensive", Hovered); - FToggle(Vars::Aimbot::Projectile::SplashGrates, FSliderEnum::Left); - FSlider(Vars::Aimbot::Projectile::Out2NormalCheck, FSliderEnum::Right); + FToggle(Vars::Aimbot::Projectile::SplashGrates); + FSlider(Vars::Aimbot::Projectile::Out2NormalMin, FSliderEnum::Left); + FSlider(Vars::Aimbot::Projectile::Out2NormalMax, FSliderEnum::Right); Divider(); FText("Misc"); @@ -1100,7 +1101,7 @@ void CMenu::MenuMisc(int iTab) if (Section("Queueing")) { FDropdown(Vars::Misc::Queueing::ForceRegions); - FToggle(Vars::Misc::Queueing::FreezeQueue, FToggleEnum::Left); + FToggle(Vars::Misc::Queueing::ExtendQueue, FToggleEnum::Left); FToggle(Vars::Misc::Queueing::AutoCasualQueue, FToggleEnum::Right); } EndSection(); if (Section("Sound")) @@ -1312,13 +1313,13 @@ void CMenu::MenuLogs(int iTab) // text + icons int lOffset = H::Draw.Scale(10); - if (tPlayer.m_bLocal || F::Spectate.m_iIntendedTarget == tPlayer.m_iUserID || tPlayer.m_bFriend || tPlayer.m_bParty) + if (tPlayer.m_bLocal || F::Spectate.GetTarget(true) == tPlayer.m_iUserID || tPlayer.m_bFriend || tPlayer.m_bParty) { lOffset += H::Draw.Scale(19); SetCursorPos({ vOriginalPos.x + H::Draw.Scale(7), vOriginalPos.y + H::Draw.Scale(6) }); if (tPlayer.m_bLocal) IconImage(ICON_MD_PERSON); - else if (F::Spectate.m_iIntendedTarget == tPlayer.m_iUserID) + else if (F::Spectate.GetTarget(true) == tPlayer.m_iUserID) IconImage(ICON_MD_VISIBILITY); else if (tPlayer.m_bFriend) IconImage(ICON_MD_GROUP); @@ -1412,7 +1413,7 @@ void CMenu::MenuLogs(int iTab) I::SteamFriends->ActivateGameOverlayToWebPage(std::format("https://steamhistory.net/id/{}", CSteamID(tPlayer.m_uAccountID, k_EUniversePublic, k_EAccountTypeIndividual).ConvertToUint64()).c_str()); } - if (FSelectable(F::Spectate.m_iIntendedTarget == tPlayer.m_iUserID ? "Unspectate" : "Spectate")) + if (FSelectable(F::Spectate.GetTarget(true) == tPlayer.m_iUserID ? "Unspectate" : "Spectate")) F::Spectate.SetTarget(tPlayer.m_iUserID); if (!I::EngineClient->IsPlayingDemo() && FBeginMenu("Votekick")) diff --git a/Amalgam/src/Features/Players/PlayerUtils.cpp b/Amalgam/src/Features/Players/PlayerUtils.cpp index dee02359..49ccf4da 100644 --- a/Amalgam/src/Features/Players/PlayerUtils.cpp +++ b/Amalgam/src/Features/Players/PlayerUtils.cpp @@ -382,17 +382,17 @@ const char* CPlayerlistUtils::GetPlayerName(int iIndex, const char* sDefault, in switch (iType) { case NameTypeEnum::Local: - return "Local"; + return LOCAL; case NameTypeEnum::Friend: - return "Friend"; + return FRIEND; case NameTypeEnum::Party: - return "Party"; + return PARTY; case NameTypeEnum::Player: if (auto pTag = GetSignificantTag(iIndex, 0)) return pTag->m_sName.c_str(); else if (auto pResource = H::Entities.GetResource(); pResource && pResource->m_bValid(iIndex)) - return pResource->m_iTeam(I::EngineClient->GetLocalPlayer()) != pResource->m_iTeam(iIndex) ? "Enemy" : "Teammate"; - return "Player"; + return pResource->m_iTeam(I::EngineClient->GetLocalPlayer()) != pResource->m_iTeam(iIndex) ? ENEMY : TEAMMATE; + return PLAYER; case NameTypeEnum::Custom: if (auto sAlias = GetPlayerAlias(GetAccountID(iIndex))) return sAlias->c_str(); @@ -408,17 +408,17 @@ const char* CPlayerlistUtils::GetPlayerName(uint32_t uAccountID, const char* sDe switch (iType) { case NameTypeEnum::Local: - return "Local"; + return LOCAL; case NameTypeEnum::Friend: - return "Friend"; + return FRIEND; case NameTypeEnum::Party: - return "Party"; + return PARTY; case NameTypeEnum::Player: if (auto pTag = GetSignificantTag(uAccountID, 0)) return pTag->m_sName.c_str(); else if (auto pResource = H::Entities.GetResource(); (iType = GetIndex(uAccountID)) && pResource && pResource->m_bValid(iType)) - return pResource->m_iTeam(I::EngineClient->GetLocalPlayer()) != pResource->m_iTeam(iType) ? "Enemy" : "Teammate"; - return "Player"; + return pResource->m_iTeam(I::EngineClient->GetLocalPlayer()) != pResource->m_iTeam(iType) ? ENEMY : TEAMMATE; + return PLAYER; case NameTypeEnum::Custom: if (auto sAlias = GetPlayerAlias(uAccountID)) return sAlias->c_str(); diff --git a/Amalgam/src/Features/Players/PlayerUtils.h b/Amalgam/src/Features/Players/PlayerUtils.h index 439e7675..2f47c445 100644 --- a/Amalgam/src/Features/Players/PlayerUtils.h +++ b/Amalgam/src/Features/Players/PlayerUtils.h @@ -9,6 +9,13 @@ #define F2P_TAG (PARTY_TAG-1) #define TAG_COUNT (-F2P_TAG) +#define LOCAL "Local" +#define FRIEND "Friend" +#define PARTY "Party" +#define ENEMY "Enemy" +#define TEAMMATE "Teammate" +#define PLAYER "Player" + struct ListPlayer { std::string m_sName; diff --git a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp index 4632b8ac..8156ff31 100644 --- a/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp +++ b/Amalgam/src/Features/Simulation/ProjectileSimulation/ProjectileSimulation.cpp @@ -6,7 +6,7 @@ bool CProjectileSimulation::GetInfoMain(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, Vec3 vAngles, ProjectileInfo& tProjInfo, int iFlags, float flAutoCharge) { - if (!pPlayer || !pPlayer->IsAlive() || pPlayer->IsAGhost() || pPlayer->IsTaunting() || !pWeapon) + if (!pWeapon || !pPlayer->IsAlive() || pPlayer->IsAGhost() || pPlayer->IsTaunting()) return false; static auto sv_gravity = H::ConVars.FindVar("sv_gravity"); @@ -287,11 +287,17 @@ bool CProjectileSimulation::GetInfo(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, { bool bInitCheck = iFlags & ProjSimEnum::InitCheck; bool bInterp = iFlags & ProjSimEnum::Interp; + bool bReturn = false; - const float flOldCurrentTime = I::GlobalVars->curtime; - I::GlobalVars->curtime = TICKS_TO_TIME(pPlayer->m_nTickBase()); - bool bReturn = GetInfoMain(pPlayer, pWeapon, vAngles, tProjInfo, iFlags, flAutoCharge); - I::GlobalVars->curtime = flOldCurrentTime; + if (auto pLocal = bInterp ? H::Entities.GetLocal() : nullptr) + { + const float flOldCurrentTime = I::GlobalVars->curtime; + I::GlobalVars->curtime = TICKS_TO_TIME(pLocal->m_nTickBase()); + bReturn = GetInfoMain(pPlayer, pWeapon, vAngles, tProjInfo, iFlags, flAutoCharge); + I::GlobalVars->curtime = flOldCurrentTime; + } + else + bReturn = GetInfoMain(pPlayer, pWeapon, vAngles, tProjInfo, iFlags, flAutoCharge); tProjInfo.m_iFlags = iFlags; if (!bReturn || !bInitCheck) @@ -627,6 +633,9 @@ Vec3 CProjectileSimulation::GetVelocity() float CProjectileSimulation::GetDesync() { + if (I::EngineClient->IsPlayingDemo()) + return 0.f; + return I::GlobalVars->curtime - TICKS_TO_TIME(I::ClientState->m_ClockDriftMgr.m_nServerTick) - F::Backtrack.GetReal(); } diff --git a/Amalgam/src/Features/Spectate/Spectate.cpp b/Amalgam/src/Features/Spectate/Spectate.cpp index f59085c5..49fd764f 100644 --- a/Amalgam/src/Features/Spectate/Spectate.cpp +++ b/Amalgam/src/Features/Spectate/Spectate.cpp @@ -1,5 +1,10 @@ #include "Spectate.h" +void CSpectate::Reset() +{ + m_iIntendedTarget = m_iTarget = -1; +} + void CSpectate::NetUpdateEnd(CTFPlayer* pLocal) { if (!pLocal) @@ -39,9 +44,6 @@ void CSpectate::NetUpdateEnd(CTFPlayer* pLocal) } pLocal->m_iObserverMode() = Vars::Visuals::Thirdperson::Enabled.Value ? OBS_MODE_THIRDPERSON : OBS_MODE_FIRSTPERSON; Vars::Visuals::Thirdperson::Enabled.Value ? I::Input->CAM_ToThirdPerson() : I::Input->CAM_ToFirstPerson(); - - m_hTargetTarget = pLocal->m_hObserverTarget(); - m_iTargetMode = pLocal->m_iObserverMode(); } void CSpectate::NetUpdateStart(CTFPlayer* pLocal) @@ -75,4 +77,9 @@ void CSpectate::CreateMove(CUserCmd* pCmd) void CSpectate::SetTarget(int iTarget) { m_iIntendedTarget = m_iIntendedTarget == iTarget ? -1 : iTarget; +} + +int CSpectate::GetTarget(bool bIntended) +{ + return bIntended ? m_iIntendedTarget : m_iTarget; } \ No newline at end of file diff --git a/Amalgam/src/Features/Spectate/Spectate.h b/Amalgam/src/Features/Spectate/Spectate.h index e36dcc68..909fff9b 100644 --- a/Amalgam/src/Features/Spectate/Spectate.h +++ b/Amalgam/src/Features/Spectate/Spectate.h @@ -3,22 +3,24 @@ class CSpectate { +private: + int m_iTarget = -1; + int m_iIntendedTarget = -1; + public: void NetUpdateEnd(CTFPlayer* pLocal); void NetUpdateStart(CTFPlayer* pLocal); void CreateMove(CUserCmd* pCmd); + void Reset(); + void SetTarget(int iTarget); - - inline bool HasTarget() { return m_iTarget != -1; } - - int m_iTarget = -1; - int m_iIntendedTarget = -1; - Vec3 m_vOldView = {}; // don't let spectating change viewangles + int GetTarget(bool bIntended = false); + inline bool HasTarget(bool bIntended = false) { return (bIntended ? m_iIntendedTarget : m_iTarget) != -1; } EHANDLE m_hOriginalTarget; int m_iOriginalMode = OBS_MODE_NONE; - EHANDLE m_hTargetTarget; - int m_iTargetMode = OBS_MODE_NONE; + + Vec3 m_vOldView = {}; // don't let spectating change viewangles }; ADD_FEATURE(CSpectate, Spectate); \ No newline at end of file diff --git a/Amalgam/src/Features/Visuals/Chams/Chams.cpp b/Amalgam/src/Features/Visuals/Chams/Chams.cpp index 07c1db37..3de733bf 100644 --- a/Amalgam/src/Features/Visuals/Chams/Chams.cpp +++ b/Amalgam/src/Features/Visuals/Chams/Chams.cpp @@ -5,15 +5,25 @@ #include "../FakeAngle/FakeAngle.h" #include "../../Backtrack/Backtrack.h" +void CChams::Begin() +{ + m_tOriginalColor = I::RenderView->GetColorModulation(); + m_flOriginalBlend = I::RenderView->GetBlend(); + I::ModelRender->GetMaterialOverride(&m_pOriginalMaterial, &m_iOriginalOverride); +} +void CChams::End() +{ + I::RenderView->SetColorModulation(m_tOriginalColor); + I::RenderView->SetBlend(m_flOriginalBlend); + I::ModelRender->ForcedMaterialOverride(m_pOriginalMaterial, m_iOriginalOverride); +} + void CChams::DrawModel(CBaseEntity* pEntity, Chams_t& tChams, IMatRenderContext* pRenderContext, bool bTwoModels) { const auto& vVisibleMaterials = !tChams.Visible.empty() ? tChams.Visible : std::vector> { { "None", {} } }; const auto& vOccludedMaterials = !tChams.Occluded.empty() ? tChams.Occluded : std::vector> { { "None", {} } }; - m_tOriginalColor = I::RenderView->GetColorModulation(); - m_flOriginalBlend = I::RenderView->GetBlend(); - I::ModelRender->GetMaterialOverride(&m_pOriginalMaterial, &m_iOriginalOverride); - + Begin(); if (bTwoModels) { pRenderContext->SetStencilEnable(true); @@ -77,10 +87,7 @@ void CChams::DrawModel(CBaseEntity* pEntity, Chams_t& tChams, IMatRenderContext* m_mEntities[pEntity->entindex()]; } - - I::RenderView->SetColorModulation(m_tOriginalColor); - I::RenderView->SetBlend(m_flOriginalBlend); - I::ModelRender->ForcedMaterialOverride(m_pOriginalMaterial, m_iOriginalOverride); + End(); } @@ -161,8 +168,6 @@ void CChams::RenderBacktrack(const DrawModelState_t& pState, const ModelRenderIn if (!pEntity || !pEntity->IsPlayer()) return; - - std::vector vRecords = {}; if (!F::Backtrack.GetRecords(pEntity, vRecords)) return; @@ -214,11 +219,9 @@ void CChams::RenderBacktrack(const DrawModelState_t& pState, const ModelRenderIn } void CChams::RenderFakeAngle(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo) { - auto pRenderContext = I::MaterialSystem->GetRenderContext(); - if (!pRenderContext) - return; - - + //auto pRenderContext = I::MaterialSystem->GetRenderContext(); + //if (!pRenderContext) + // return; //pRenderContext->DepthRange(0.f, Vars::Chams::FakeAngle::IgnoreZ.Value ? 0.2f : 1.f); @@ -252,16 +255,11 @@ bool CChams::RenderViewmodel(void* ecx, int flags, int* iReturn) if (!pRenderContext) return false; - - Group_t* pGroup = nullptr; if (!F::Groups.GetGroup(TargetsEnum::ViewmodelWeapon, pGroup) || !pGroup->m_tChams(true)) return false; - m_tOriginalColor = I::RenderView->GetColorModulation(); - m_flOriginalBlend = I::RenderView->GetBlend(); - I::ModelRender->GetMaterialOverride(&m_pOriginalMaterial, &m_iOriginalOverride); - + Begin(); for (auto& [sName, tColor] : pGroup->m_tChams.Visible) { auto pMaterial = F::Materials.GetMaterial(FNV1A::Hash32(sName.c_str())); @@ -278,10 +276,7 @@ bool CChams::RenderViewmodel(void* ecx, int flags, int* iReturn) if (pMaterial && pMaterial->m_bInvertCull) pRenderContext->CullMode(G::FlipViewmodels ? MATERIAL_CULLMODE_CW : MATERIAL_CULLMODE_CCW); } - - I::RenderView->SetColorModulation(m_tOriginalColor); - I::RenderView->SetBlend(m_flOriginalBlend); - I::ModelRender->ForcedMaterialOverride(m_pOriginalMaterial, m_iOriginalOverride); + End(); return true; } @@ -294,16 +289,11 @@ bool CChams::RenderViewmodel(const DrawModelState_t& pState, const ModelRenderIn if (!pRenderContext) return false; - - Group_t* pGroup = nullptr; if (!F::Groups.GetGroup(TargetsEnum::ViewmodelHands, pGroup) || !pGroup->m_tChams(true)) return false; - m_tOriginalColor = I::RenderView->GetColorModulation(); - m_flOriginalBlend = I::RenderView->GetBlend(); - I::ModelRender->GetMaterialOverride(&m_pOriginalMaterial, &m_iOriginalOverride); - + Begin(); for (auto& [sName, tColor] : pGroup->m_tChams.Visible) { auto pMaterial = F::Materials.GetMaterial(FNV1A::Hash32(sName.c_str())); @@ -320,10 +310,7 @@ bool CChams::RenderViewmodel(const DrawModelState_t& pState, const ModelRenderIn if (pMaterial && pMaterial->m_bInvertCull) pRenderContext->CullMode(G::FlipViewmodels ? MATERIAL_CULLMODE_CW : MATERIAL_CULLMODE_CCW); } - - I::RenderView->SetColorModulation(m_tOriginalColor); - I::RenderView->SetBlend(m_flOriginalBlend); - I::ModelRender->ForcedMaterialOverride(m_pOriginalMaterial, m_iOriginalOverride); + End(); return true; } \ No newline at end of file diff --git a/Amalgam/src/Features/Visuals/Chams/Chams.h b/Amalgam/src/Features/Visuals/Chams/Chams.h index 848191e9..c195b94b 100644 --- a/Amalgam/src/Features/Visuals/Chams/Chams.h +++ b/Amalgam/src/Features/Visuals/Chams/Chams.h @@ -4,6 +4,9 @@ class CChams { private: + void Begin(); + void End(); + void DrawModel(CBaseEntity* pEntity, Chams_t& tChams, IMatRenderContext* pRenderContext, bool bTwoModels = true); void RenderBacktrack(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo); diff --git a/Amalgam/src/Features/Visuals/ESP/ESP.cpp b/Amalgam/src/Features/Visuals/ESP/ESP.cpp index ce49f5be..684db52f 100644 --- a/Amalgam/src/Features/Visuals/ESP/ESP.cpp +++ b/Amalgam/src/Features/Visuals/ESP/ESP.cpp @@ -12,24 +12,17 @@ MAKE_SIGNATURE(CEconItemView_GetItemName, "client.dll", "40 53 48 83 EC ? 48 8B static inline void StorePlayer(CTFPlayer* pPlayer, CTFPlayer* pLocal, Group_t* pGroup, std::unordered_map& mCache) { int iIndex = pPlayer->entindex(); - auto pResource = H::Entities.GetResource(); - int iObserverTarget = pLocal->m_hObserverTarget().GetEntryIndex(); - int iObserverMode = pLocal->m_iObserverMode(); - if (F::Spectate.HasTarget()) - { - iObserverTarget = F::Spectate.m_hTargetTarget.GetEntryIndex(); - iObserverMode = F::Spectate.m_iTargetMode; - } - bool bSpectate = iObserverMode == OBS_MODE_FIRSTPERSON || iObserverMode == OBS_MODE_THIRDPERSON; - - bool bLocal = iIndex == I::EngineClient->GetLocalPlayer(); - bool bTarget = bSpectate && iObserverTarget == iIndex; - if (!bSpectate ? !I::Input->CAM_IsThirdPerson() && bLocal : iObserverMode == OBS_MODE_FIRSTPERSON && bTarget) + if (int iObserverMode = pLocal->m_iObserverMode(); + iObserverMode == OBS_MODE_FIRSTPERSON || iObserverMode == OBS_MODE_THIRDPERSON + ? !I::Input->CAM_IsThirdPerson() && iIndex == I::EngineClient->GetLocalPlayer() + : iObserverMode == OBS_MODE_FIRSTPERSON && pLocal->m_hObserverTarget().GetEntryIndex() == iIndex) return; - int iClassNum = pPlayer->m_iClass(); auto pWeapon = pPlayer->m_hActiveWeapon()->As(); + auto pResource = H::Entities.GetResource(); + bool bLocal = pPlayer->entindex() == I::EngineClient->GetLocalPlayer(); + int iClassNum = pPlayer->m_iClass(); PlayerCache_t& tCache = mCache[pPlayer]; tCache.m_flAlpha = pGroup->m_tColor.a / 255.f; diff --git a/Amalgam/src/Features/Visuals/Glow/Glow.cpp b/Amalgam/src/Features/Visuals/Glow/Glow.cpp index 727ed505..d14df396 100644 --- a/Amalgam/src/Features/Visuals/Glow/Glow.cpp +++ b/Amalgam/src/Features/Visuals/Glow/Glow.cpp @@ -5,7 +5,7 @@ #include "../FakeAngle/FakeAngle.h" #include "../../Backtrack/Backtrack.h" -void CGlow::SetupBegin(IMatRenderContext* pRenderContext) +void CGlow::Begin() { m_tOriginalColor = I::RenderView->GetColorModulation(); m_flOriginalBlend = I::RenderView->GetBlend(); @@ -14,6 +14,17 @@ void CGlow::SetupBegin(IMatRenderContext* pRenderContext) I::RenderView->SetBlend(0.f); I::RenderView->SetColorModulation(1.f, 1.f, 1.f); I::ModelRender->ForcedMaterialOverride(m_pMatGlowColor); +} +void CGlow::End() +{ + I::RenderView->SetColorModulation(m_tOriginalColor); + I::RenderView->SetBlend(m_flOriginalBlend); + I::ModelRender->ForcedMaterialOverride(m_pOriginalMaterial, m_iOriginalOverride); +} + +void CGlow::FirstBegin(IMatRenderContext* pRenderContext) +{ + Begin(); pRenderContext->SetStencilEnable(true); pRenderContext->SetStencilCompareFunction(STENCILCOMPARISONFUNCTION_ALWAYS); @@ -24,17 +35,24 @@ void CGlow::SetupBegin(IMatRenderContext* pRenderContext) pRenderContext->SetStencilWriteMask(0xFF); pRenderContext->SetStencilTestMask(0x0); } -void CGlow::SetupMid(IMatRenderContext* pRenderContext, int w, int h) +void CGlow::FirstEnd(IMatRenderContext* pRenderContext) { pRenderContext->SetStencilEnable(false); + End(); +} + +void CGlow::SecondBegin(IMatRenderContext* pRenderContext, int w, int h) +{ + Begin(); + pRenderContext->PushRenderTargetAndViewport(); pRenderContext->SetRenderTarget(m_pRenderBuffer1); pRenderContext->Viewport(0, 0, w, h); pRenderContext->ClearColor4ub(0, 0, 0, 0); pRenderContext->ClearBuffers(true, false, false); } -void CGlow::SetupEnd(Glow_t tGlow, IMatRenderContext* pRenderContext, int w, int h) +void CGlow::SecondEnd(Glow_t tGlow, IMatRenderContext* pRenderContext, int w, int h) { pRenderContext->PopRenderTargetAndViewport(); @@ -82,9 +100,7 @@ void CGlow::SetupEnd(Glow_t tGlow, IMatRenderContext* pRenderContext, int w, int pRenderContext->SetStencilEnable(false); - I::RenderView->SetColorModulation(m_tOriginalColor); - I::RenderView->SetBlend(m_flOriginalBlend); - I::ModelRender->ForcedMaterialOverride(m_pOriginalMaterial, m_iOriginalOverride); + End(); } void CGlow::DrawModel(CBaseEntity* pEntity) @@ -149,26 +165,35 @@ void CGlow::Store(CTFPlayer* pLocal) } } -void CGlow::RenderMain() +void CGlow::RenderFirst() { - const int w = H::Draw.m_nScreenW, h = H::Draw.m_nScreenH; - if (w < 1 || h < 1 || w > 4096 || h > 2160) - return; - auto pRenderContext = I::MaterialSystem->GetRenderContext(); if (!pRenderContext || !m_pMatGlowColor || !m_pMatBlurX || !m_pMatBlurY || !m_pMatHaloAddToScreen) return F::Materials.ReloadMaterials(); + FirstBegin(pRenderContext); for (auto& [tGlow, vInfo] : m_mEntities) { - SetupBegin(pRenderContext); for (auto& tInfo : vInfo) { m_iFlags = tInfo.m_iFlags; DrawModel(tInfo.m_pEntity); m_iFlags = false; } - SetupMid(pRenderContext, w, h); + } + FirstEnd(pRenderContext); +} + +void CGlow::RenderSecond() +{ + auto pRenderContext = I::MaterialSystem->GetRenderContext(); + if (!pRenderContext || !m_pMatGlowColor || !m_pMatBlurX || !m_pMatBlurY || !m_pMatHaloAddToScreen) + return F::Materials.ReloadMaterials(); + + const int w = H::Draw.m_nScreenW, h = H::Draw.m_nScreenH; + for (auto& [tGlow, vInfo] : m_mEntities) + { + SecondBegin(pRenderContext, w, h); for (auto& tInfo : vInfo) { I::RenderView->SetColorModulation(tInfo.m_cColor); @@ -178,7 +203,7 @@ void CGlow::RenderMain() DrawModel(tInfo.m_pEntity); m_iFlags = false; } - SetupEnd(tGlow, pRenderContext, w, h); + SecondEnd(tGlow, pRenderContext, w, h); } } @@ -188,8 +213,6 @@ void CGlow::RenderBacktrack(const DrawModelState_t& pState, const ModelRenderInf if (!pEntity || !pEntity->IsPlayer()) return; - - std::vector vRecords = {}; if (!F::Backtrack.GetRecords(pEntity, vRecords)) return; @@ -261,30 +284,27 @@ void CGlow::RenderViewmodel(void* ecx, int flags) if (!F::Groups.GroupsActive()) return; - const int w = H::Draw.m_nScreenW, h = H::Draw.m_nScreenH; - if (w < 1 || h < 1 || w > 4096 || h > 2160) - return; - auto pRenderContext = I::MaterialSystem->GetRenderContext(); if (!pRenderContext || !m_pMatGlowColor || !m_pMatBlurX || !m_pMatBlurY || !m_pMatHaloAddToScreen) return F::Materials.ReloadMaterials(); - - Group_t* pGroup = nullptr; if (!F::Groups.GetGroup(TargetsEnum::ViewmodelWeapon, pGroup) || !pGroup->m_tGlow()) return; static auto CBaseAnimating_InternalDrawModel = U::Hooks.m_mHooks["CBaseAnimating_InternalDrawModel"]; + const int w = H::Draw.m_nScreenW, h = H::Draw.m_nScreenH; pRenderContext->CullMode(MATERIAL_CULLMODE_CCW); // glow won't work properly with MATERIAL_CULLMODE_CW - SetupBegin(pRenderContext); + + FirstBegin(pRenderContext); CBaseAnimating_InternalDrawModel->Call(ecx, flags); - SetupMid(pRenderContext, w, h); + FirstEnd(pRenderContext); + SecondBegin(pRenderContext, w, h); I::RenderView->SetColorModulation(pGroup->m_tColor); I::RenderView->SetBlend(pGroup->m_tColor.a / 255.f); CBaseAnimating_InternalDrawModel->Call(ecx, flags); - SetupEnd(pGroup->m_tGlow, pRenderContext, w, h); + SecondEnd(pGroup->m_tGlow, pRenderContext, w, h); pRenderContext->CullMode(G::FlipViewmodels ? MATERIAL_CULLMODE_CW : MATERIAL_CULLMODE_CCW); } @@ -293,30 +313,27 @@ void CGlow::RenderViewmodel(const DrawModelState_t& pState, const ModelRenderInf if (!F::Groups.GroupsActive()) return; - const int w = H::Draw.m_nScreenW, h = H::Draw.m_nScreenH; - if (w < 1 || h < 1 || w > 4096 || h > 2160) - return; - auto pRenderContext = I::MaterialSystem->GetRenderContext(); if (!pRenderContext || !m_pMatGlowColor || !m_pMatBlurX || !m_pMatBlurY || !m_pMatHaloAddToScreen) return F::Materials.ReloadMaterials(); - - Group_t* pGroup = nullptr; if (!F::Groups.GetGroup(TargetsEnum::ViewmodelHands, pGroup) || !pGroup->m_tGlow()) return; static auto IVModelRender_DrawModelExecute = U::Hooks.m_mHooks["IVModelRender_DrawModelExecute"]; + const int w = H::Draw.m_nScreenW, h = H::Draw.m_nScreenH; pRenderContext->CullMode(MATERIAL_CULLMODE_CCW); // glow won't work properly with MATERIAL_CULLMODE_CW - SetupBegin(pRenderContext); + + FirstBegin(pRenderContext); IVModelRender_DrawModelExecute->Call(I::ModelRender, pState, pInfo, pBoneToWorld); - SetupMid(pRenderContext, w, h); + FirstEnd(pRenderContext); + SecondBegin(pRenderContext, w, h); I::RenderView->SetColorModulation(pGroup->m_tColor); I::RenderView->SetBlend(pGroup->m_tColor.a / 255.f); IVModelRender_DrawModelExecute->Call(I::ModelRender, pState, pInfo, pBoneToWorld); - SetupEnd(pGroup->m_tGlow, pRenderContext, w, h); + SecondEnd(pGroup->m_tGlow, pRenderContext, w, h); pRenderContext->CullMode(G::FlipViewmodels ? MATERIAL_CULLMODE_CW : MATERIAL_CULLMODE_CCW); } diff --git a/Amalgam/src/Features/Visuals/Glow/Glow.h b/Amalgam/src/Features/Visuals/Glow/Glow.h index df88ccf5..1ae2b3c3 100644 --- a/Amalgam/src/Features/Visuals/Glow/Glow.h +++ b/Amalgam/src/Features/Visuals/Glow/Glow.h @@ -6,9 +6,12 @@ class CGlow { private: - void SetupBegin(IMatRenderContext* pRenderContext); - void SetupMid(IMatRenderContext* pRenderContext, int w, int h); - void SetupEnd(Glow_t tGlow, IMatRenderContext* pRenderContext, int w, int h); + void Begin(); + void End(); + void FirstBegin(IMatRenderContext* pRenderContext); + void FirstEnd(IMatRenderContext* pRenderContext); + void SecondBegin(IMatRenderContext* pRenderContext, int w, int h); + void SecondEnd(Glow_t tGlow, IMatRenderContext* pRenderContext, int w, int h); void DrawModel(CBaseEntity* pEntity); @@ -55,7 +58,8 @@ private: public: void Store(CTFPlayer* pLocal); - void RenderMain(); + void RenderFirst(); + void RenderSecond(); void RenderHandler(const DrawModelState_t& pState, const ModelRenderInfo_t& pInfo, matrix3x4* pBoneToWorld); void RenderViewmodel(void* ecx, int flags); diff --git a/Amalgam/src/Features/Visuals/Materials/Materials.cpp b/Amalgam/src/Features/Visuals/Materials/Materials.cpp index 7a086a3a..b003780a 100644 --- a/Amalgam/src/Features/Visuals/Materials/Materials.cpp +++ b/Amalgam/src/Features/Visuals/Materials/Materials.cpp @@ -306,9 +306,10 @@ void CMaterials::AddMaterial(const char* sName) auto& tMaterial = m_mMaterials[uHash]; KeyValues* kv = new KeyValues(sName); - kv->LoadFromBuffer(sName, tMaterial.m_sVMT.c_str()); - ModifyKeyValues(kv); + if (!kv->LoadFromBuffer(sName, tMaterial.m_sVMT.c_str())) + return; + ModifyKeyValues(kv); tMaterial.m_pMaterial = Create(sName, kv); //StoreVars(tMaterial); @@ -334,9 +335,10 @@ void CMaterials::EditMaterial(const char* sName, const char* sVMT) tMaterial.m_sVMT = sVMT; KeyValues* kv = new KeyValues(sName); - kv->LoadFromBuffer(sName, sVMT); - ModifyKeyValues(kv); + if (!kv->LoadFromBuffer(sName, sVMT)) + return; + ModifyKeyValues(kv); tMaterial.m_pMaterial = Create(sName, kv); //StoreVars(tMaterial); diff --git a/Amalgam/src/Features/Visuals/OffscreenArrows/OffscreenArrows.cpp b/Amalgam/src/Features/Visuals/OffscreenArrows/OffscreenArrows.cpp index d7decaa6..d2aaabc9 100644 --- a/Amalgam/src/Features/Visuals/OffscreenArrows/OffscreenArrows.cpp +++ b/Amalgam/src/Features/Visuals/OffscreenArrows/OffscreenArrows.cpp @@ -5,7 +5,7 @@ void COffscreenArrows::DrawArrowTo(const Vec3& vFromPos, const Vec3& vToPos, Color_t tColor, int iOffset, float flMaxDistance) { float flMap = Math::RemapVal(vFromPos.DistTo(vToPos), flMaxDistance, flMaxDistance * 0.9f, 0.f, 1.f); - tColor.a = byte(flMap * 255.f); + tColor.a *= flMap; if (!tColor.a) return; diff --git a/Amalgam/src/Features/Visuals/Visuals.cpp b/Amalgam/src/Features/Visuals/Visuals.cpp index ddad9655..58172dc2 100644 --- a/Amalgam/src/Features/Visuals/Visuals.cpp +++ b/Amalgam/src/Features/Visuals/Visuals.cpp @@ -42,32 +42,35 @@ static std::vector SplashTrace(Vec3 vOrigin, float flRadius, Vec3 vNormal return vPoints; } -void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const bool bQuick) +void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const bool bInterp) { - if (bQuick) + if (bInterp) F::CameraWindow.m_bShouldDraw = false; - if (bQuick ? !Vars::Visuals::Simulation::TrajectoryPath.Value && !Vars::Visuals::Simulation::ProjectileCamera.Value : !Vars::Visuals::Simulation::ShotPath.Value) + if (bInterp ? !Vars::Visuals::Simulation::TrajectoryPath.Value && !Vars::Visuals::Simulation::ProjectileCamera.Value : !Vars::Visuals::Simulation::ShotPath.Value) return; - Vec3 vAngles = bQuick ? I::EngineClient->GetViewAngles() : G::CurrentUserCmd->viewangles; - int iFlags = bQuick ? ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::Quick : ProjSimEnum::Trace | ProjSimEnum::InitCheck; - if (bQuick && F::Spectate.HasTarget()) + Vec3 vAngles = bInterp ? I::EngineClient->GetViewAngles() : G::CurrentUserCmd->viewangles; + int iFlags = bInterp ? ProjSimEnum::Trace | ProjSimEnum::InitCheck | ProjSimEnum::Interp : ProjSimEnum::Trace | ProjSimEnum::InitCheck; + if (F::Spectate.HasTarget() && bInterp && pPlayer && pPlayer->m_hObserverTarget()) { - pPlayer = I::ClientEntityList->GetClientEntity(I::EngineClient->GetPlayerForUserID(F::Spectate.m_iTarget))->As(); + bool bThirdperson = pPlayer->m_iObserverMode() != OBS_MODE_FIRSTPERSON; + pPlayer = pPlayer->m_hObserverTarget()->As(); if (!pPlayer || pPlayer->IsDormant()) return; pWeapon = pPlayer->m_hActiveWeapon()->As(); - if (I::Input->CAM_IsThirdPerson()) - vAngles = pPlayer->GetEyeAngles(); + if (!pWeapon || pWeapon->GetWeaponID() == TF_WEAPON_FLAMETHROWER) + return; pPlayer->m_vecViewOffset() = pPlayer->GetViewOffset(); + if (bThirdperson) + vAngles = pPlayer->GetEyeAngles(); } - if (!pPlayer || !pWeapon || pWeapon->GetWeaponID() == TF_WEAPON_FLAMETHROWER) + else if (!pPlayer || !pWeapon || pWeapon->GetWeaponID() == TF_WEAPON_FLAMETHROWER) return; ProjectileInfo tProjInfo = {}; - if (!F::ProjSim.GetInfo(pPlayer, pWeapon, vAngles, tProjInfo, iFlags, (bQuick && Vars::Aimbot::Projectile::AutoRelease.Value) ? Vars::Aimbot::Projectile::AutoRelease.Value / 100 : -1.f) + if (!F::ProjSim.GetInfo(pPlayer, pWeapon, vAngles, tProjInfo, iFlags, (bInterp && Vars::Aimbot::Projectile::AutoRelease.Value) ? Vars::Aimbot::Projectile::AutoRelease.Value / 100 : -1.f) || !F::ProjSim.Initialize(tProjInfo)) return; @@ -75,9 +78,13 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const CTraceFilterCollideable filter = {}; filter.pSkip = pPlayer; int nMask = MASK_SOLID; - F::ProjSim.SetupTrace(filter, nMask, pWeapon, 0, bQuick); + F::ProjSim.SetupTrace(filter, nMask, pWeapon, 0, bInterp); Vec3* pNormal = nullptr; + SDK::TraceHull(F::ProjSim.GetOrigin(), F::ProjSim.GetOrigin(), tProjInfo.m_vHull * -1, tProjInfo.m_vHull, nMask, &filter, &trace); + if (trace.startsolid) + return; + int iTicks = TIME_TO_TICKS(std::min(tProjInfo.m_flLifetime, 10.f)); for (int n = 1; n <= iTicks; n++) { @@ -86,16 +93,13 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const Vec3 New = F::ProjSim.GetOrigin(); SDK::TraceHull(Old, New, tProjInfo.m_vHull * -1, tProjInfo.m_vHull, nMask, &filter, &trace); - F::ProjSim.SetupTrace(filter, nMask, pWeapon, n, bQuick); + F::ProjSim.SetupTrace(filter, nMask, pWeapon, n, bInterp); if (trace.DidHit()) { pNormal = &trace.plane.normal; - if (trace.startsolid) - *pNormal = F::ProjSim.GetVelocity().Normalized(); break; } } - if (tProjInfo.m_vPath.empty()) return; @@ -103,7 +107,7 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const float flRadius = 0.f; Vec3 vEndPos = trace.endpos; - if ((bQuick ? Vars::Visuals::Simulation::TrajectoryPath.Value : Vars::Visuals::Simulation::ShotPath.Value) && Vars::Visuals::Simulation::SplashRadius.Value & Vars::Visuals::Simulation::SplashRadiusEnum::Enabled) + if ((bInterp ? Vars::Visuals::Simulation::TrajectoryPath.Value : Vars::Visuals::Simulation::ShotPath.Value) && Vars::Visuals::Simulation::SplashRadius.Value & Vars::Visuals::Simulation::SplashRadiusEnum::Enabled) { switch (pWeapon->GetWeaponID()) { @@ -143,7 +147,7 @@ void CVisuals::ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const } } - if (bQuick) + if (bInterp) { if (Vars::Visuals::Simulation::ProjectileCamera.Value && !I::EngineVGui->IsGameUIVisible() && pPlayer->m_vecOrigin().DistTo(trace.endpos) > 500.f) { @@ -603,13 +607,13 @@ void CVisuals::DrawHitboxes(int iStore) break; auto pLocal = H::Entities.GetLocal(); - if (pLocal && pLocal->SetupBones(F::Backtrack.m_tRecord.m_aBones, MAXSTUDIOBONES, BONE_USED_BY_ANYTHING, pLocal->m_flSimulationTime())) - { - auto vBoxes = GetHitboxes(F::Backtrack.m_tRecord.m_aBones, pLocal); - for (auto& tBox : vBoxes) - tBox.m_tColorEdge = { 255, 255, 255, 255 }; - s_vLocalHitboxes.insert(s_vLocalHitboxes.end(), vBoxes.begin(), vBoxes.end()); - } + if (!pLocal || !pLocal->SetupBones(F::Backtrack.m_tRecord.m_aBones, MAXSTUDIOBONES, BONE_USED_BY_ANYTHING, pLocal->m_flSimulationTime())) + break; + + auto vBoxes = GetHitboxes(F::Backtrack.m_tRecord.m_aBones, pLocal); + for (auto& tBox : vBoxes) + tBox.m_tColorEdge = { 255, 255, 255, 255 }; + s_vLocalHitboxes.insert(s_vLocalHitboxes.end(), vBoxes.begin(), vBoxes.end()); } } } diff --git a/Amalgam/src/Features/Visuals/Visuals.h b/Amalgam/src/Features/Visuals/Visuals.h index 0fbfcdac..a3955b96 100644 --- a/Amalgam/src/Features/Visuals/Visuals.h +++ b/Amalgam/src/Features/Visuals/Visuals.h @@ -46,7 +46,7 @@ public: void Store(); void Tick(); - void ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const bool bQuick = true); + void ProjectileTrace(CTFPlayer* pPlayer, CTFWeaponBase* pWeapon, const bool bInterp = true); void DrawPickupTimers(); void DrawAntiAim(CTFPlayer* pLocal); void DrawDebugInfo(CTFPlayer* pLocal); diff --git a/Amalgam/src/Hooks/CBasePlayer_CalcView.cpp b/Amalgam/src/Hooks/CBasePlayer_CalcView.cpp index 363a181c..ed4c033b 100644 --- a/Amalgam/src/Hooks/CBasePlayer_CalcView.cpp +++ b/Amalgam/src/Hooks/CBasePlayer_CalcView.cpp @@ -3,6 +3,8 @@ #include "../Features/Spectate/Spectate.h" MAKE_SIGNATURE(CBasePlayer_CalcView, "client.dll", "40 57 48 83 EC ? 44 8B 91", 0x0); +MAKE_SIGNATURE(CTFPlayer_HandleTaunting, "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 80 BB", 0x0); +MAKE_SIGNATURE(CThirdPersonManager_GetFinalCameraOffset, "client.dll", "F2 0F 10 41 ? 8B 41", 0x0); MAKE_HOOK(CBasePlayer_CalcView, S::CBasePlayer_CalcView(), void, void* rcx, Vector& eyeOrigin, QAngle& eyeAngles, float& zNear, float& zFar, float& fov) @@ -14,8 +16,34 @@ MAKE_HOOK(CBasePlayer_CalcView, S::CBasePlayer_CalcView(), void, auto pPlayer = reinterpret_cast(rcx); - Vec3 vOldPunch = pPlayer->m_vecPunchAngle(); + Vec3 vOriginalPunch = pPlayer->m_vecPunchAngle(); pPlayer->m_vecPunchAngle() = {}; CALL_ORIGINAL(rcx, eyeOrigin, eyeAngles, zNear, zFar, fov); - pPlayer->m_vecPunchAngle() = vOldPunch; + pPlayer->m_vecPunchAngle() = vOriginalPunch; +} + +MAKE_HOOK(CTFPlayer_HandleTaunting, S::CTFPlayer_HandleTaunting(), void, + void* rcx) +{ + DEBUG_RETURN(CTFPlayer_HandleTaunting, rcx); + + if (!F::Spectate.HasTarget()) + return CALL_ORIGINAL(rcx); + + I::ThirdPersonManager->m_bOverrideThirdPerson = false; +} + +MAKE_HOOK(CThirdPersonManager_GetFinalCameraOffset, S::CThirdPersonManager_GetFinalCameraOffset(), Vector, + void* rcx) +{ + DEBUG_RETURN(CThirdPersonManager_GetFinalCameraOffset, rcx); + + if (!F::Spectate.HasTarget()) + return CALL_ORIGINAL(rcx); + + float flOriginalUpOffset = I::ThirdPersonManager->m_flUpOffset; + I::ThirdPersonManager->m_flUpOffset = 0.f; + Vec3 vReturn = CALL_ORIGINAL(rcx); + I::ThirdPersonManager->m_flUpOffset = flOriginalUpOffset; + return vReturn; } \ No newline at end of file diff --git a/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp b/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp index e089c724..bea7e422 100644 --- a/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp +++ b/Amalgam/src/Hooks/CClientModeShared_DoPostScreenSpaceEffects.cpp @@ -5,6 +5,9 @@ #include "../Features/Visuals/CameraWindow/CameraWindow.h" #include "../Features/Visuals/Visuals.h" #include "../Features/Visuals/Materials/Materials.h" +#include "../Features/Spectate/Spectate.h" + +MAKE_SIGNATURE(CViewRender_DrawViewModels, "client.dll", "48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 8B FA", 0x0); MAKE_HOOK(CClientModeShared_DoPostScreenSpaceEffects, U::Memory.GetVirtual(I::ClientModeShared, 39), bool, void* rcx, const CViewSetup* pSetup) @@ -13,22 +16,31 @@ MAKE_HOOK(CClientModeShared_DoPostScreenSpaceEffects, U::Memory.GetVirtual(I::Cl if (SDK::CleanScreenshot()) return CALL_ORIGINAL(rcx, pSetup); + + F::Visuals.ProjectileTrace(H::Entities.GetLocal(), H::Entities.GetWeapon()); + if (F::CameraWindow.m_bDrawing) + return CALL_ORIGINAL(rcx, pSetup); - auto pLocal = H::Entities.GetLocal(); - auto pWeapon = H::Entities.GetWeapon(); - if (pLocal && pWeapon) - F::Visuals.ProjectileTrace(pLocal, pWeapon); + F::Visuals.DrawEffects(); + F::Chams.m_mEntities.clear(); + if (I::EngineVGui->IsGameUIVisible() || !F::Materials.m_bLoaded) + return CALL_ORIGINAL(rcx, pSetup); - if (!F::CameraWindow.m_bDrawing) - { - F::Visuals.DrawEffects(); - F::Chams.m_mEntities.clear(); - if (!I::EngineVGui->IsGameUIVisible() && F::Materials.m_bLoaded) - { - F::Chams.RenderMain(); - F::Glow.RenderMain(); - } - } + F::Chams.RenderMain(); + F::Glow.RenderFirst(); return CALL_ORIGINAL(rcx, pSetup); +} + +MAKE_HOOK(CViewRender_DrawViewModels, S::CViewRender_DrawViewModels(), void, + void* rcx, const CViewSetup& viewRender, bool drawViewmodel) +{ + DEBUG_RETURN(CViewRender_DrawViewModels, rcx, viewRender, drawViewmodel); + + CALL_ORIGINAL(rcx, viewRender, F::Spectate.HasTarget() && !I::EngineClient->IsHLTV() ? false : drawViewmodel); + + if (SDK::CleanScreenshot() || F::CameraWindow.m_bDrawing || I::EngineVGui->IsGameUIVisible() || !F::Materials.m_bLoaded) + return; + + F::Glow.RenderSecond(); } \ No newline at end of file diff --git a/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp b/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp index 73054247..4c7637bd 100644 --- a/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp +++ b/Amalgam/src/Hooks/CHLClient_LevelShutdown.cpp @@ -10,7 +10,7 @@ MAKE_HOOK(CHLClient_LevelShutdown, U::Memory.GetVirtual(I::Client, 7), void, H::Entities.Clear(true); F::EnginePrediction.Unload(); - F::Spectate.m_iIntendedTarget = -1; + F::Spectate.Reset(); CALL_ORIGINAL(rcx); } \ No newline at end of file diff --git a/Amalgam/src/Hooks/CHLTVCamera_CalcView.cpp b/Amalgam/src/Hooks/CHLTVCamera_CalcView.cpp index 32c97517..66ccc189 100644 --- a/Amalgam/src/Hooks/CHLTVCamera_CalcView.cpp +++ b/Amalgam/src/Hooks/CHLTVCamera_CalcView.cpp @@ -39,7 +39,7 @@ MAKE_HOOK(CHLTVCamera_GetPrimaryTarget, S::CHLTVCamera_GetPrimaryTarget(), CBase auto pHLTVCamera = reinterpret_cast(rcx); if (F::Spectate.HasTarget()) - pHLTVCamera->m_iTraget1 = I::EngineClient->GetPlayerForUserID(F::Spectate.m_iTarget), F::Spectate.m_iTarget = F::Spectate.m_iIntendedTarget = -1; + pHLTVCamera->m_iTraget1 = I::EngineClient->GetPlayerForUserID(F::Spectate.GetTarget()), F::Spectate.Reset(); return CALL_ORIGINAL(rcx); } diff --git a/Amalgam/src/Hooks/CMatchInviteNotification_OnTick.cpp b/Amalgam/src/Hooks/CMatchInviteNotification_OnTick.cpp index f0dd0a0d..194a951c 100644 --- a/Amalgam/src/Hooks/CMatchInviteNotification_OnTick.cpp +++ b/Amalgam/src/Hooks/CMatchInviteNotification_OnTick.cpp @@ -2,13 +2,30 @@ MAKE_SIGNATURE(CMatchInviteNotification_OnTick, "client.dll", "40 53 48 83 EC ? 48 8B D9 E8 ? ? ? ? F7 83", 0x0); +#define JOIN_TIME (10.0) +#define FULL_TIME (180.0 - JOIN_TIME) + +static std::unordered_map s_mLastAutoJoinTime = {}; + MAKE_HOOK(CMatchInviteNotification_OnTick, S::CMatchInviteNotification_OnTick(), void, void* rcx) { DEBUG_RETURN(CMatchInviteNotification_OnTick, rcx); - if (Vars::Misc::Queueing::FreezeQueue.Value) - *reinterpret_cast(uintptr_t(rcx) + 616) = 0.0; + if (Vars::Misc::Queueing::ExtendQueue.Value) + { + auto dFloatTime = SDK::PlatFloatTime(); + auto& dAutoJoinTime = *reinterpret_cast(uintptr_t(rcx) + 616); + auto& dLastAutoJoinTime = s_mLastAutoJoinTime[rcx]; + double dExtend = dAutoJoinTime != dLastAutoJoinTime ? FULL_TIME : 0.0; + dLastAutoJoinTime = dAutoJoinTime = std::max(dAutoJoinTime + dExtend, dFloatTime + 1.0); + + for (auto& [pMatchInviteNotification, dLastAutoJoinTime] : s_mLastAutoJoinTime) + { + if (dFloatTime > dLastAutoJoinTime) + s_mLastAutoJoinTime.erase(pMatchInviteNotification); + } + } CALL_ORIGINAL(rcx); } \ No newline at end of file diff --git a/Amalgam/src/Hooks/CTFPlayer_InSameDisguisedTeam.cpp b/Amalgam/src/Hooks/CTFPlayer_InSameDisguisedTeam.cpp new file mode 100644 index 00000000..48967d2f --- /dev/null +++ b/Amalgam/src/Hooks/CTFPlayer_InSameDisguisedTeam.cpp @@ -0,0 +1,40 @@ +#include "../SDK/SDK.h" + +#include "../Features/Spectate/Spectate.h" + +MAKE_SIGNATURE(CTFPlayer_InSameDisguisedTeam, "client.dll", "48 89 5C 24 ? 57 48 83 EC ? 48 8B DA 48 8B F9 48 85 D2 75 ? 32 C0", 0x0); +MAKE_SIGNATURE(CTFFreezePanel_ShouldDraw, "client.dll", "48 81 C1 ? ? ? ? 48 8B 01 48 FF A0 ? ? ? ? CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC 40 55", 0x0); +MAKE_SIGNATURE(CTFFreezePanel_FireGameEvent, "client.dll", "40 55 53 56 57 48 8D AC 24 ? ? ? ? 48 81 EC ? ? ? ? 48 8B 02", 0x0); + +MAKE_HOOK(CTFPlayer_InSameDisguisedTeam, S::CTFPlayer_InSameDisguisedTeam(), bool, + void* rcx, CBaseEntity* pEnt) +{ + DEBUG_RETURN(CTFPlayer_InSameDisguisedTeam, rcx, pEnt); + + if (F::Spectate.HasTarget()) + return true; + + return CALL_ORIGINAL(rcx, pEnt); +} + +MAKE_HOOK(CTFFreezePanel_ShouldDraw, S::CTFFreezePanel_ShouldDraw(), bool, + void* rcx) +{ + DEBUG_RETURN(CTFFreezePanel_ShouldDraw, rcx); + + if (F::Spectate.HasTarget()) + return false; + + return CALL_ORIGINAL(rcx); +} + +MAKE_HOOK(CTFFreezePanel_FireGameEvent, S::CTFFreezePanel_FireGameEvent(), void, + void* rcx, IGameEvent* event) +{ + DEBUG_RETURN(CTFFreezePanel_FireGameEvent, rcx, event); + + if (F::Spectate.HasTarget()) + return; + + CALL_ORIGINAL(rcx, event); +} \ No newline at end of file diff --git a/Amalgam/src/Hooks/CTFPlayer_ShouldDraw.cpp b/Amalgam/src/Hooks/CTFPlayer_ShouldDraw.cpp index 1a9aef0c..90f48f99 100644 --- a/Amalgam/src/Hooks/CTFPlayer_ShouldDraw.cpp +++ b/Amalgam/src/Hooks/CTFPlayer_ShouldDraw.cpp @@ -6,7 +6,6 @@ MAKE_SIGNATURE(CTFPlayer_ShouldDraw, "client.dll", "48 89 74 24 ? 57 48 83 EC ? MAKE_SIGNATURE(CBasePlayer_ShouldDrawThisPlayer, "client.dll", "48 83 EC ? E8 ? ? ? ? 84 C0 74 ? 48 8B 0D ? ? ? ? 48 85 C9", 0x0); MAKE_SIGNATURE(CBasePlayer_ShouldDrawLocalPlayer, "client.dll", "48 83 EC ? 48 8B 0D ? ? ? ? 48 85 C9 74 ? 48 8B 01 FF 50 ? 84 C0 74 ? 8B 05", 0x0); MAKE_SIGNATURE(CBaseCombatWeapon_ShouldDraw, "client.dll", "48 89 5C 24 ? 57 48 83 EC ? 83 B9 ? ? ? ? ? 48 8B D9 74 ? 8B 81", 0x0); -MAKE_SIGNATURE(CViewRender_DrawViewModels, "client.dll", "48 89 5C 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 8D 6C 24 ? 48 81 EC ? ? ? ? 48 8B 05 ? ? ? ? 48 8B FA", 0x0); //MAKE_SIGNATURE(CTFWeaponBase_PostDataUpdate_ShouldDrawThisPlayer_Call, "client.dll", "84 C0 75 ? 8B BE", 0x0); MAKE_SIGNATURE(CBasePlayer_BuildFirstPersonMeathookTransformations_ShouldDrawThisPlayer_Call, "client.dll", "84 C0 0F 84 ? ? ? ? 48 8B 94 24 ? ? ? ? 48 8B CE", 0x0); //MAKE_SIGNATURE(CBaseCombatWeapon_CalcOverrideModelIndex_ShouldDrawLocalPlayer_Call, "client.dll", "84 C0 75 ? B8 ? ? ? ? 48 8B 5C 24", 0x0); @@ -19,7 +18,7 @@ MAKE_HOOK(CTFPlayer_ShouldDraw, S::CTFPlayer_ShouldDraw(), bool, if (F::Spectate.HasTarget() && !I::EngineClient->IsHLTV()) { auto pLocal = H::Entities.GetLocal(); - auto pTarget = I::ClientEntityList->GetClientEntity(I::EngineClient->GetPlayerForUserID(F::Spectate.m_iTarget))->As(); + auto pTarget = I::ClientEntityList->GetClientEntity(I::EngineClient->GetPlayerForUserID(F::Spectate.GetTarget()))->As(); if (pLocal && pLocal->IsAlive() && rcx == pLocal->GetClientRenderable()) return true; else if (pTarget && pTarget->IsAlive() && rcx == pTarget->GetClientRenderable()) @@ -47,7 +46,7 @@ MAKE_HOOK(CBasePlayer_ShouldDrawThisPlayer, S::CBasePlayer_ShouldDrawThisPlayer( return false; auto pLocal = H::Entities.GetLocal(); - auto pTarget = I::ClientEntityList->GetClientEntity(I::EngineClient->GetPlayerForUserID(F::Spectate.m_iTarget))->As(); + auto pTarget = I::ClientEntityList->GetClientEntity(I::EngineClient->GetPlayerForUserID(F::Spectate.GetTarget()))->As(); if (pLocal && pLocal->IsAlive() && rcx == pLocal) return true; else if (pTarget && pTarget->IsAlive() && rcx == pTarget) @@ -91,12 +90,4 @@ MAKE_HOOK(CBaseCombatWeapon_ShouldDraw, S::CBaseCombatWeapon_ShouldDraw(), bool, } return CALL_ORIGINAL(rcx); -} - -MAKE_HOOK(CViewRender_DrawViewModels, S::CViewRender_DrawViewModels(), void, - void* rcx, const CViewSetup& viewRender, bool drawViewmodel) -{ - DEBUG_RETURN(CViewRender_DrawViewModels, rcx, viewRender, drawViewmodel); - - CALL_ORIGINAL(rcx, viewRender, F::Spectate.HasTarget() && !I::EngineClient->IsHLTV() ? false : drawViewmodel); } \ No newline at end of file diff --git a/Amalgam/src/Hooks/CViewRender_LevelInit.cpp b/Amalgam/src/Hooks/CViewRender_LevelInit.cpp index 2b675e5f..5ba2b3eb 100644 --- a/Amalgam/src/Hooks/CViewRender_LevelInit.cpp +++ b/Amalgam/src/Hooks/CViewRender_LevelInit.cpp @@ -22,7 +22,7 @@ MAKE_HOOK(CViewRender_LevelInit, U::Memory.GetVirtual(I::ViewRender, 1), void, F::NoSpreadHitscan.Reset(); F::CheaterDetection.Reset(); F::Resolver.Reset(); - F::Spectate.m_iIntendedTarget = -1; + F::Spectate.Reset(); CALL_ORIGINAL(rcx); } \ No newline at end of file diff --git a/Amalgam/src/Hooks/ISteamFriends_GetFriendPersonaName.cpp b/Amalgam/src/Hooks/ISteamFriends_GetFriendPersonaName.cpp index a1fa00f3..a5b193a3 100644 --- a/Amalgam/src/Hooks/ISteamFriends_GetFriendPersonaName.cpp +++ b/Amalgam/src/Hooks/ISteamFriends_GetFriendPersonaName.cpp @@ -16,9 +16,9 @@ MAKE_HOOK(ISteamFriends_GetFriendPersonaName, U::Memory.GetVirtual(I::SteamFrien { switch (F::PlayerUtils.GetNameType(steamIDFriend.GetAccountID())) { - case NameTypeEnum::Local: return "Local"; - case NameTypeEnum::Friend: return "Friend"; - case NameTypeEnum::Party: return "Party"; + case NameTypeEnum::Local: return LOCAL; + case NameTypeEnum::Friend: return FRIEND; + case NameTypeEnum::Party: return PARTY; } } diff --git a/Amalgam/src/Hooks/IVModelRender_DrawModelExecute.cpp b/Amalgam/src/Hooks/IVModelRender_DrawModelExecute.cpp index 1401a3e9..0c1edb6e 100644 --- a/Amalgam/src/Hooks/IVModelRender_DrawModelExecute.cpp +++ b/Amalgam/src/Hooks/IVModelRender_DrawModelExecute.cpp @@ -6,7 +6,7 @@ #include "../Features/Visuals/CameraWindow/CameraWindow.h" MAKE_SIGNATURE(CBaseAnimating_DrawModel, "client.dll", "4C 8B DC 49 89 5B ? 89 54 24 ? 55 56 57 41 54 41 55 41 56 41 57 48 83 EC ? 48 8B 05 ? ? ? ? 48 8D 3D", 0x0); -MAKE_SIGNATURE(CEconEntity_DrawOverriddenViewmodel_DrawModel_Call, "client.dll", "41 8B D5 FF 50 ? 8B 97", 0x6); +MAKE_SIGNATURE(CEconEntity_DrawOverriddenViewmodel_DrawModel_Call, "client.dll", "8B 97 ? ? ? ? 85 D2 74 ? 83 FA ? 74 ? 0F B7 EA 4C 8B 05 ? ? ? ? 8B CD 49 83 C0 ? 48 C1 E1 ? 4C 03 C1 74 ? C1 EA ? 41 39 50 ? 75 ? 49 8B 18 BA", 0x0); MAKE_SIGNATURE(CBaseAnimating_InternalDrawModel, "client.dll", "48 8B C4 55 56 48 8D 6C 24 ? 48 81 EC ? ? ? ? 44 8B 81", 0x0); MAKE_HOOK(IVModelRender_DrawModelExecute, U::Memory.GetVirtual(I::ModelRender, 19), void, diff --git a/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp b/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp index ec50d154..89d105ac 100644 --- a/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp +++ b/Amalgam/src/Hooks/VGuiMenuBuilder_AddMenuItem.cpp @@ -48,7 +48,7 @@ MAKE_HOOK(VGuiMenuBuilder_AddMenuItem, S::VGuiMenuBuilder_AddMenuItem(), void*, s_sPlayerName = pResource->GetName(s_iPlayerIndex); CALL_ORIGINAL(rcx, "History", "history", "profile"); - CALL_ORIGINAL(rcx, I::EngineClient->GetPlayerForUserID(F::Spectate.m_iIntendedTarget) == s_iPlayerIndex ? "Unspectate" : "Spectate", "specplayer", "profile"); + CALL_ORIGINAL(rcx, I::EngineClient->GetPlayerForUserID(F::Spectate.GetTarget(true)) == s_iPlayerIndex ? "Unspectate" : "Spectate", "specplayer", "profile"); CALL_ORIGINAL(rcx, std::format("Tags for {}", s_sPlayerName).c_str(), "listtags", "tags"); for (auto it = F::PlayerUtils.m_vTags.begin(); it != F::PlayerUtils.m_vTags.end(); it++) @@ -77,7 +77,7 @@ MAKE_HOOK(CTFClientScoreBoardDialog_OnCommand, S::CTFClientScoreBoardDialog_OnCo { DEBUG_RETURN(CTFClientScoreBoardDialog_OnCommand, rcx, command); - if (!Vars::Visuals::UI::ScoreboardUtility.Value && !command) + if (!Vars::Visuals::UI::ScoreboardUtility.Value || !command) return CALL_ORIGINAL(rcx, command); auto uHash = FNV1A::Hash32(command); diff --git a/Amalgam/src/SDK/Definitions/Definitions.h b/Amalgam/src/SDK/Definitions/Definitions.h index 4cd6b8ef..3c500cfe 100644 --- a/Amalgam/src/SDK/Definitions/Definitions.h +++ b/Amalgam/src/SDK/Definitions/Definitions.h @@ -388,6 +388,20 @@ #define LIFE_RESPAWNABLE 3 #define LIFE_DISCARDBODY 4 +#define CAM_MIN_DIST 30.0 +#define CAM_ANGLE_MOVE .5 +#define MAX_ANGLE_DIFF 10.0 +#define PITCH_MAX 90.0 +#define PITCH_MIN 0 +#define YAW_MAX 135.0 +#define YAW_MIN -135.0 +#define DIST 2 +#define CAM_HULL_OFFSET 14.0 + +#define CAMERA_UP_OFFSET 25.0f +#define CAMERA_OFFSET_LERP_TIME 0.5f +#define CAMERA_UP_OFFSET_LERP_TIME 0.25f + #define EF_PARITY_BITS 3 #define EF_PARITY_MASK ((1<>{ { "Original", Color_t() } } || !Occluded.empty(); + return Visible != std::vector>{ { "Original", Color_t() } } || !bVisibleOnly && !Occluded.empty(); } }; diff --git a/Amalgam/src/SDK/Vars.h b/Amalgam/src/SDK/Vars.h index 310f3508..20d7587c 100644 --- a/Amalgam/src/SDK/Vars.h +++ b/Amalgam/src/SDK/Vars.h @@ -796,7 +796,7 @@ NAMESPACE_BEGIN(Vars) // Africa JNB = 1 << 28, // Johannesburg ); - CVar(FreezeQueue, "Freeze queue", false); + CVar(ExtendQueue, "Extend queue", false); CVar(AutoCasualQueue, "Auto casual queue", false); NAMESPACE_END(Queueing)