#pragma once // used: pad and findpattern #include "../../utilities/memory.h" // used: vector #include "../../sdk/datatypes/vector.h" // used: array #include struct Ray_t { public: Vector_t m_vecStart; Vector_t m_vecEnd; Vector_t m_vecMins; Vector_t m_vecMaxs; MEM_PAD(0x4); std::uint8_t UnkType; }; static_assert(sizeof(Ray_t) == 0x38); struct SurfaceData_t { public: MEM_PAD(0x8) float m_flPenetrationModifier; float m_flDamageModifier; MEM_PAD(0x4) int m_iMaterial; }; static_assert(sizeof(SurfaceData_t) == 0x18); struct TraceHitboxData_t { public: MEM_PAD(0x38); int m_nHitGroup; MEM_PAD(0x4); int m_nHitboxId; }; static_assert(sizeof(TraceHitboxData_t) == 0x44); class C_CSPlayerPawn; struct GameTrace_t { public: GameTrace_t() = default; SurfaceData_t* GetSurfaceData(); int GetHitboxId(); int GetHitgroup(); bool IsVisible() const; void* m_pSurface; C_CSPlayerPawn* m_pHitEntity; TraceHitboxData_t* m_pHitboxData; MEM_PAD(0x38); std::uint32_t m_uContents; MEM_PAD(0x24); Vector_t m_vecStartPos; Vector_t m_vecEndPos; Vector_t m_vecNormal; Vector_t m_vecPosition; MEM_PAD(0x4); float m_flFraction; MEM_PAD(0x6); bool m_bAllSolid; MEM_PAD(0x4D) }; // Size: 0x108 static_assert(sizeof(GameTrace_t) == 0x108); struct TraceFilter_t { public: MEM_PAD(0x8); std::int64_t m_uTraceMask; std::array m_v1; std::array m_arrSkipHandles; std::array m_arrCollisions; std::int16_t m_v2; std::uint8_t m_v3; std::uint8_t m_v4; std::uint8_t m_v5; TraceFilter_t() = default; TraceFilter_t(std::uint64_t uMask, C_CSPlayerPawn* pSkip1, C_CSPlayerPawn* pSkip2, int nLayer); }; static_assert(sizeof(TraceFilter_t) == 0x40); class CGameTraceManager { public: bool TraceShape(Ray_t* pRay, Vector_t vecStart, Vector_t vecEnd, TraceFilter_t* pFilter, GameTrace_t* pGameTrace) { using fnTraceShape = bool(__fastcall*)(CGameTraceManager*, Ray_t*, Vector_t*, Vector_t*, TraceFilter_t*, GameTrace_t*); // Credit: https://www.unknowncheats.me/forum/4265752-post6333.html static fnTraceShape oTraceShape = reinterpret_cast(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 20 48 89 4C 24 08 55 56 41"))); #ifdef CS_PARANOID CS_ASSERT(oTraceShape != nullptr); #endif return oTraceShape(this, pRay, &vecStart, &vecEnd, pFilter, pGameTrace); } bool ClipRayToEntity(Ray_t* pRay, Vector_t vecStart, Vector_t vecEnd, C_CSPlayerPawn* pPawn, TraceFilter_t* pFilter, GameTrace_t* pGameTrace) { using fnClipRayToEntity = bool(__fastcall*)(CGameTraceManager*, Ray_t*, Vector_t*, Vector_t*, C_CSPlayerPawn*, TraceFilter_t*, GameTrace_t*); static fnClipRayToEntity oClipRayToEntity = reinterpret_cast(MEM::FindPattern(CLIENT_DLL, CS_XOR("48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 48 89 7C 24 20 41 54 41 56 41 57 48 81 EC C0 00 00 00 48 8B 9C"))); #ifdef CS_PARANOID CS_ASSERT(oClipRayToEntity != nullptr); #endif return oClipRayToEntity(this, pRay, &vecStart, &vecEnd, pPawn, pFilter, pGameTrace); } };