Исходник SetupTraceData rebuild

august
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
25 Мар 2021
Сообщения
229
Реакции
89
C++:
Expand Collapse Copy
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.
 
Назад
Сверху Снизу