119 lines
3.0 KiB
C++
119 lines
3.0 KiB
C++
#pragma once
|
|
// used: pad and findpattern
|
|
#include "../../utilities/memory.h"
|
|
// used: vector
|
|
#include "../../sdk/datatypes/vector.h"
|
|
// used: array
|
|
#include <array>
|
|
|
|
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<std::int64_t, 2> m_v1;
|
|
std::array<std::int32_t, 4> m_arrSkipHandles;
|
|
std::array<std::int16_t, 2> 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<fnTraceShape>(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<fnClipRayToEntity>(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);
|
|
}
|
|
};
|