From 2dabb9f29d8828586244e1a2968545a69bc50f4d Mon Sep 17 00:00:00 2001 From: SlynxCZ Date: Wed, 22 Apr 2026 23:28:10 +0200 Subject: [PATCH] Update interface version --- managed/RayTrace/RayTraceImpl/RayTraceImpl.cs | 2 +- public/craytraceinterface.h | 38 ++-- src/raytrace.cpp | 185 +++++++++++------- src/raytrace.h | 9 + 4 files changed, 139 insertions(+), 95 deletions(-) diff --git a/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs b/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs index bb63783..39c01d1 100644 --- a/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs +++ b/managed/RayTrace/RayTraceImpl/RayTraceImpl.cs @@ -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; diff --git a/public/craytraceinterface.h b/public/craytraceinterface.h index af18c0d..d2b70c1 100644 --- a/public/craytraceinterface.h +++ b/public/craytraceinterface.h @@ -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; }; diff --git a/src/raytrace.cpp b/src/raytrace.cpp index a698bc8..f2d9c2a 100644 --- a/src/raytrace.cpp +++ b/src/raytrace.cpp @@ -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("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(pIgnoreEntity)) : CTraceFilterEx(); + auto result = TraceShapeInternal(*pVecStart, *pAngAngles, pIgnoreEntity, pTraceOptions); + if (!result.has_value()) + return false; - filter.m_nInteractsAs = 0; - filter.m_nInteractsWith = static_cast(MASK_SHOT_PHYSICS); - filter.m_nInteractsExclude = 0; - - if (pTraceOptions) - { - if (pTraceOptions->InteractsWith != static_cast(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(pIgnoreEntity)) : CTraceFilterEx(); + auto result = TraceEndShapeInternal(*pVecStart, *pVecEnd, pIgnoreEntity, pTraceOptions); + if (!result.has_value()) + return false; - filter.m_nInteractsAs = 0; - filter.m_nInteractsWith = static_cast(MASK_SHOT_PHYSICS); - filter.m_nInteractsExclude = 0; - - if (pTraceOptions) - { - if (pTraceOptions->InteractsWith != static_cast(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 CRayTrace::TraceShapeInternal(const Vector& vecStart, const QAngle& angAngles, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions) + { + CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast(pIgnoreEntity)) : CTraceFilterEx(); + + filter.m_nInteractsAs = 0; + filter.m_nInteractsWith = static_cast(MASK_SHOT_PHYSICS); + filter.m_nInteractsExclude = 0; + + if (pTraceOptions) + { + if (pTraceOptions->InteractsWith != static_cast(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 CRayTrace::TraceEndShapeInternal(const Vector& vecStart, const Vector& vecEnd, CEntityInstance* pIgnoreEntity, const TraceOptions* pTraceOptions) { CTraceFilterEx filter = pIgnoreEntity ? CTraceFilterEx(static_cast(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 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(pIgnoreEntity)) : CTraceFilterEx(); + + filter.m_nInteractsAs = 0; + filter.m_nInteractsWith = static_cast(MASK_SHOT_PHYSICS); + filter.m_nInteractsExclude = 0; + + if (pTraceOptions) + { + if (pTraceOptions->InteractsWith != static_cast(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 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()(nullptr, ray, vecStartCopy, vecEndCopy, &traceFilter, &trace); - *pTraceResult = TraceResult(&trace); - - return bResult; + return TraceResult(&trace); } } diff --git a/src/raytrace.h b/src/raytrace.h index 9b0387e..6fe4263 100644 --- a/src/raytrace.h +++ b/src/raytrace.h @@ -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 TraceShapeInternal(const Vector& vecStart, const QAngle& angAngles, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr); + std::optional TraceEndShapeInternal(const Vector& vecStart, const Vector& vecEnd, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr); + std::optional TraceHullShapeInternal(const Vector& vecStart, const Vector& vecEnd, const Vector& vecMins, const Vector& vecMaxs, CEntityInstance* pIgnoreEntity = nullptr, const TraceOptions* pTraceOptions = nullptr); + std::optional TraceShapeExInternal(const Vector& vecStart, const Vector& vecEnd, CTraceFilter& traceFilter, Ray_t ray); + protected: DynLibUtils::CMemory m_pCNavPhysicsInterface_TraceShape; protected: