Update interface version

This commit is contained in:
SlynxCZ 2026-04-22 23:28:10 +02:00
parent b5f3d79c16
commit 2dabb9f29d
4 changed files with 139 additions and 95 deletions

View file

@ -170,7 +170,7 @@ public static class NativeBridge
public static bool Initialize()
{
Handle = (nint)Utilities.MetaFactory("CRayTraceInterface001")!;
Handle = (nint)Utilities.MetaFactory("CRayTraceInterface002")!;
if (Handle == 0)
return false;

View file

@ -4,7 +4,7 @@
#include "gametrace.h"
#include "entityinstance.h"
#define RAYTRACE_INTERFACE_VERSION "CRayTraceInterface001"
#define RAYTRACE_INTERFACE_VERSION "CRayTraceInterface002"
enum class InteractionLayers : uint64_t
{
@ -172,28 +172,28 @@ public:
virtual ~CRayTraceInterface() = default;
virtual bool TraceShape(const Vector* pVecStart,
const QAngle* pAngAngles,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions,
TraceResult* pTraceResult) = 0;
const QAngle* pAngAngles,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions,
TraceResult* pTraceResult) = 0;
virtual bool TraceEndShape(const Vector* pVecStart,
const Vector* pVecEnd,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions,
TraceResult* pTraceResult) = 0;
const Vector* pVecEnd,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions,
TraceResult* pTraceResult) = 0;
virtual bool TraceHullShape(const Vector* pVecStart,
const Vector* pVecEnd,
const Vector* pVecMins,
const Vector* pVecMaxs,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions,
TraceResult* pTraceResult) = 0;
const Vector* pVecEnd,
const Vector* pVecMins,
const Vector* pVecMaxs,
CEntityInstance* pIgnoreEntity,
TraceOptions* pTraceOptions,
TraceResult* pTraceResult) = 0;
virtual bool TraceShapeEx(const Vector* pVecStart,
const Vector* pVecEnd,
CTraceFilter* pTraceFilter,
Ray_t* pRay,
TraceResult* pTraceResult) = 0;
const Vector* pVecEnd,
CTraceFilter* pTraceFilter,
Ray_t* pRay,
TraceResult* pTraceResult) = 0;
};

View file

@ -28,89 +28,100 @@ namespace RayTracePlugin::RayTrace
return true;
}
static void DrawBeam(const Vector& start, const Vector& end, const Color& color)
void CRayTrace::DrawBeam(const Vector& vecStart, const Vector& vecEnd, const Color& colRender)
{
CBeam* beam = UTIL_CreateEntityByName<CBeam>("env_beam");
if (!beam) return;
beam->m_clrRender().SetColor(color.r(), color.g(), color.b(), color.a());
beam->m_clrRender() = colRender;
beam->m_fWidth() = 1.5f;
beam->m_nRenderMode() = kRenderNormal;
beam->m_nRenderFX() = kRenderFxNone;
beam->Teleport(&start, &VectorExtends::RotationZero, &VectorExtends::VectorZero);
beam->m_vecEndPos() = end;
beam->Teleport(&vecStart, &VectorExtends::RotationZero, &VectorExtends::VectorZero);
beam->m_vecEndPos() = vecEnd;
beam->DispatchSpawn();
}
bool CRayTrace::TraceShape(const Vector* pVecStart, const QAngle* pAngAngles, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
{
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
auto result = TraceShapeInternal(*pVecStart, *pAngAngles, pIgnoreEntity, pTraceOptions);
if (!result.has_value())
return false;
filter.m_nInteractsAs = 0;
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
filter.m_nInteractsExclude = 0;
if (pTraceOptions)
{
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
if (pTraceOptions->InteractsExclude != 0)
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
}
Vector forward;
AngleVectors(pAngAngles ? *pAngAngles : VectorExtends::RotationZero, &forward);
Vector vecEnd{
pVecStart ? pVecStart->x : 0 + forward.x * 8192.f,
pVecStart ? pVecStart->y : 0 + forward.y * 8192.f,
pVecStart ? pVecStart->z : 0 + forward.z * 8192.f
};
Ray_t ray;
auto res = TraceShapeEx(pVecStart, &vecEnd, &filter, &ray, pTraceResult);
if (pTraceOptions && pTraceOptions->DrawBeam)
{
Color col = res ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
DrawBeam(pVecStart ? *pVecStart : VectorExtends::VectorZero, (res && pTraceResult) ? pTraceResult->EndPos : vecEnd, col);
}
return res;
*pTraceResult = result.value();
return true;
}
bool CRayTrace::TraceEndShape(const Vector* pVecStart, const Vector* pVecEnd, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
{
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
auto result = TraceEndShapeInternal(*pVecStart, *pVecEnd, pIgnoreEntity, pTraceOptions);
if (!result.has_value())
return false;
filter.m_nInteractsAs = 0;
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
filter.m_nInteractsExclude = 0;
if (pTraceOptions)
{
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
if (pTraceOptions->InteractsExclude != 0)
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
}
Ray_t ray;
auto res = TraceShapeEx(pVecStart, pVecEnd, &filter, &ray, pTraceResult);
if (pTraceOptions && pTraceOptions->DrawBeam)
{
Color col = res ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
DrawBeam(pVecEnd ? *pVecEnd : VectorExtends::VectorZero, (res && pTraceResult) ? pTraceResult->EndPos : (pVecEnd ? *pVecEnd : VectorExtends::VectorZero), col);
}
return res;
*pTraceResult = result.value();
return true;
}
bool CRayTrace::TraceHullShape(const Vector* pVecStart, const Vector* pVecEnd, const Vector* pVecMins,
const Vector* pVecMaxs, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult)
{
auto result = TraceHullShapeInternal(*pVecStart, *pVecEnd, *pVecMins, *pVecMaxs, pIgnoreEntity, pTraceOptions);
if (!result.has_value())
return false;
*pTraceResult = result.value();
return true;
}
bool CRayTrace::TraceShapeEx(const Vector* pVecStart, const Vector* pVecEnd, CTraceFilter* pTraceFilter, Ray_t* pRay, TraceResult* pTraceResult)
{
auto result = TraceShapeExInternal(*pVecStart, *pVecEnd, *pTraceFilter, *pRay);
if (!result.has_value())
return false;
*pTraceResult = result.value();
return true;
}
std::optional<TraceResult> CRayTrace::TraceShapeInternal(const Vector& vecStart, const QAngle& angAngles, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions)
{
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
filter.m_nInteractsAs = 0;
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
filter.m_nInteractsExclude = 0;
if (pTraceOptions)
{
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
if (pTraceOptions->InteractsExclude != 0)
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
}
Vector vecForward;
AngleVectors(angAngles, &vecForward);
Vector vecEnd{
vecStart.x + vecForward.x * 8192.f,
vecStart.y + vecForward.y * 8192.f,
vecStart.z + vecForward.z * 8192.f
};
Ray_t ray;
auto res = TraceShapeExInternal(vecStart, vecEnd, filter, ray);
if (pTraceOptions && pTraceOptions->DrawBeam)
{
Color col = res.has_value() ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
DrawBeam(vecStart, res ? res->EndPos : vecEnd, col);
}
return res;
}
std::optional<TraceResult> CRayTrace::TraceEndShapeInternal(const Vector& vecStart, const Vector& vecEnd, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions)
{
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
@ -128,37 +139,61 @@ namespace RayTracePlugin::RayTrace
}
Ray_t ray;
ray.Init(pVecMins ? *pVecMins : VectorExtends::VectorZero, pVecMaxs ? *pVecMaxs : VectorExtends::VectorZero);
auto res = TraceShapeEx(pVecStart, pVecEnd, &filter, &ray, pTraceResult);
auto res = TraceShapeExInternal(vecStart, vecEnd, filter, ray);
if (pTraceOptions && pTraceOptions->DrawBeam)
{
Color col = res ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
DrawBeam(pVecEnd ? *pVecEnd : VectorExtends::VectorZero, (res && pTraceResult) ? pTraceResult->EndPos : (pVecEnd ? *pVecEnd : VectorExtends::VectorZero), col);
Color col = res.has_value() ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
DrawBeam(vecStart, res ? res->EndPos : vecEnd, col);
}
return res;
}
bool CRayTrace::TraceShapeEx(const Vector* pVecStart, const Vector* pVecEnd, CTraceFilter* pTraceFilter, Ray_t* pRay, TraceResult* pTraceResult)
std::optional<TraceResult> CRayTrace::TraceHullShapeInternal(const Vector& vecStart, const Vector& vecEnd, const Vector& vecMins, const Vector& vecMaxs, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions)
{
CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast<CBaseEntity*>(pIgnoreEntity)) : CTraceFilterEx();
filter.m_nInteractsAs = 0;
filter.m_nInteractsWith = static_cast<uint64_t>(MASK_SHOT_PHYSICS);
filter.m_nInteractsExclude = 0;
if (pTraceOptions)
{
if (pTraceOptions->InteractsWith != static_cast<uint64_t>(MASK_SHOT_PHYSICS))
filter.m_nInteractsWith = pTraceOptions->InteractsWith;
if (pTraceOptions->InteractsExclude != 0)
filter.m_nInteractsExclude = pTraceOptions->InteractsExclude;
}
Ray_t ray;
ray.Init(vecMins, vecMaxs);
auto res = TraceShapeExInternal(vecStart, vecEnd, filter, ray);
if (pTraceOptions && pTraceOptions->DrawBeam)
{
Color col = res.has_value() ? colors::Red().ToValveColor() : colors::Green().ToValveColor();
DrawBeam(vecStart, res ? res->EndPos : vecEnd, col);
}
return res;
}
std::optional<TraceResult> CRayTrace::TraceShapeExInternal(const Vector& vecStart, const Vector& vecEnd, CTraceFilter& traceFilter, Ray_t ray)
{
if (!m_pCNavPhysicsInterface_TraceShape)
{
FP_ERROR("CNavPhysicsInterface::TraceShape is not bound!");
return false;
return std::nullopt;
}
Vector vecStartCopy = pVecStart ? *pVecStart : VectorExtends::VectorZero;
Vector vecEndCopy = pVecEnd ? *pVecEnd : VectorExtends::VectorZero;
Vector vecStartCopy = vecStart;
Vector vecEndCopy = vecEnd;
CGameTrace trace;
bool bResult = m_pCNavPhysicsInterface_TraceShape.RCast<
bool (*)(void*, Ray_t&, Vector&, Vector&, CTraceFilter*, CGameTrace*)>()(
nullptr, *pRay, vecStartCopy, vecEndCopy, pTraceFilter, &trace);
m_pCNavPhysicsInterface_TraceShape.RCast<bool (*)(void*, Ray_t&, Vector&, Vector&, CTraceFilter*, CGameTrace*)>()(nullptr, ray, vecStartCopy, vecEndCopy, &traceFilter, &trace);
*pTraceResult = TraceResult(&trace);
return bResult;
return TraceResult(&trace);
}
}

View file

@ -30,11 +30,20 @@ namespace RayTracePlugin::RayTrace
class CRayTrace : public CRayTraceInterface {
public:
bool Initialize();
void DrawBeam(const Vector& vecStart, const Vector& vecEnd, const Color& colRender);
public:
bool TraceShape(const Vector* pVecStart, const QAngle* pAngAngles, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult) override;
bool TraceEndShape(const Vector* pVecStart, const Vector* pVecEnd, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult) override;
bool TraceHullShape(const Vector* pVecStart, const Vector* pVecEnd, const Vector* pVecMins, const Vector* pVecMaxs, CEntityInstance* pIgnoreEntity, TraceOptions* pTraceOptions, TraceResult* pTraceResult) override;
bool TraceShapeEx(const Vector* pVecStart, const Vector* pVecEnd, CTraceFilter* pTraceFilter, Ray_t* pRay, TraceResult* pTraceResult) override;
public:
std::optional<TraceResult> TraceShapeInternal(const Vector& vecStart, const QAngle& angAngles, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr);
std::optional<TraceResult> TraceEndShapeInternal(const Vector& vecStart, const Vector& vecEnd, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr);
std::optional<TraceResult> TraceHullShapeInternal(const Vector& vecStart, const Vector& vecEnd, const Vector& vecMins, const Vector& vecMaxs, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr);
std::optional<TraceResult> TraceShapeExInternal(const Vector& vecStart, const Vector& vecEnd, CTraceFilter& traceFilter, Ray_t ray);
protected:
DynLibUtils::CMemory m_pCNavPhysicsInterface_TraceShape;
protected: