- Статус
- Оффлайн
- Регистрация
- 25 Мар 2021
- Сообщения
- 229
- Реакции
- 89
C++:
class CSurface
{
public:
char* m_pszName;
int16_t m_nSurfaceProps;
uint16_t m_uFlags;
};
class CSurfacePropertyManager
{
public:
CSurface* GetSurface(int surfaceCount)
{
return Memory::CallVirtual<CSurface*>(this, 3, surfaceCount);
}
};
class CVPhysics
{
public:
CSurfacePropertyManager* GetSurfacePropertyManager()
{
return Memory::CallVirtual<CSurfacePropertyManager*>(this, 17);
}
};
class CShape
{
public:
int GetShapeType()
{
return Memory::CallVirtual<int>(this, 3);
}
RNCollisionAttr_t* GetCollisionAttribute()
{
return Memory::CallVirtual<RNCollisionAttr_t*>(this, 14);
}
};
class CBody
{
public:
int GetEntityId()
{
return Memory::CallVirtual<int>(this, 140);
}
CTransform* GetBodyTransform(bool* a1)
{
return Memory::CallVirtual<CTransform*>(this, 51, a1);
}
};
class CTraceHitData
{
public:
CBody* m_pBody;
CShape* m_pShape;
Vector m_vecHitPoint;
Vector m_vecHitNormal;
CSurfacePropertyManager* m_pSurfaceProperty;
float m_flHitOffset;
float m_flFraction;
int m_nTriangle;
char m_bStartInSolid;
};
/* v18 = *world2Physics;
memset(&traceData, 0, 0x34);
traceData.m_flFraction = 1.0;
traceData.m_nTriangle = -1;
traceData.m_bStartInSolid = 0;
(*(*v18 + 0x588i64))(v18, &traceData, ray, start, v33, p_m_uMask);
SetupTraceData(world2Physics, gameTrace, ray, start, v33, &traceData);
*/
void CPhysics2World::SetupTraceData(CGameTrace* gameTrace, CRay* ray, Vector start, Vector end, CTraceHitData* traceHitData)
{
gameTrace->m_nRayType = ray->m_nRayType;
if (traceHitData->m_flFraction >= 1.f || !traceHitData->m_bStartInSolid && end.IsZero())
{
Vector endPos = start + end;
CGameTrace{ gameTrace };
gameTrace->m_vecStartPos = start;
gameTrace->m_vecEndPos = endPos;
}
else
{
int entityId = traceHitData->m_pBody->GetEntityId();
RNCollisionAttr_t* collisionAttribute = traceHitData->m_pShape->GetCollisionAttribute();
float fraction = traceHitData->m_flFraction;
Vector interpolatedEndPos = Vector((end.x * fraction) + start.x, (end.y * fraction) + start.y, (end.z * fraction) + start.z);
gameTrace->m_vecEndPos = interpolatedEndPos;
gameTrace->m_vecHitNormal = traceHitData->m_vecHitNormal;
gameTrace->m_flHitOffset = traceHitData->m_flHitOffset;
gameTrace->m_flFraction = traceHitData->m_flFraction;
gameTrace->m_bStartInSolid = traceHitData->m_bStartInSolid;
CTransform* transform = traceHitData->m_pBody->GetBodyTransform(nullptr);
gameTrace->m_BodyTransform = *transform;
Vector hitPoint = traceHitData->m_vecHitPoint;
gameTrace->m_vecHitPoint = hitPoint;
if (!ray->m_nRayType || ray->m_nRayType == RAY_TYPE_SPHERE && (gameTrace->m_pShape->GetShapeType() == 3))
gameTrace->m_bExactHitPoint = true;
gameTrace->m_pSurfaceProp = traceHitData->m_pSurfaceProperty;
gameTrace->m_ShapeAttributes = *collisionAttribute;
gameTrace->m_ShapeAttributes.m_nEntityID = entityId;
gameTrace->m_unContents = collisionAttribute->m_unInteractsAs;
auto hitEntity = Interfaces::m_pEntitySystem->GetBaseEntity(entityId).As<C_CSPlayerPawn*>();
gameTrace->m_pEntity = hitEntity;
gameTrace->m_vecStartPos = start;
gameTrace->m_nTriangle = traceHitData->m_nTriangle;
}
}
This rebuild will help u to rebuild some kind of features like ClipRayToEntity, TraceShape and way more.
The point of rebuilding functions like TraceShape that is after some updates everything processing in single thread, which is not good, welcome to fix that.