Fix late/incorrect calls to TR_GetEntityIndex potentially causing crash. (#513)
This commit is contained in:
parent
9b3b2eb23e
commit
31928e6282
@ -32,6 +32,25 @@
|
||||
#include "extension.h"
|
||||
#include <worldsize.h>
|
||||
|
||||
class sm_trace_t : public trace_t
|
||||
{
|
||||
public:
|
||||
cell_t GetEntRef() const { return m_EntRef; }
|
||||
void UpdateEntRef()
|
||||
{
|
||||
if (m_pEnt)
|
||||
{
|
||||
m_EntRef = gamehelpers->EntityToReference(m_pEnt);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_EntRef = INVALID_EHANDLE_INDEX;
|
||||
}
|
||||
}
|
||||
private:
|
||||
cell_t m_EntRef = INVALID_EHANDLE_INDEX;
|
||||
};
|
||||
|
||||
class CSMTraceFilter : public CTraceFilter
|
||||
{
|
||||
public:
|
||||
@ -57,7 +76,7 @@ private:
|
||||
|
||||
/* Used for the global trace version */
|
||||
Ray_t g_Ray;
|
||||
trace_t g_Trace;
|
||||
sm_trace_t g_Trace;
|
||||
Vector g_StartVec;
|
||||
Vector g_EndVec;
|
||||
Vector g_HullMins;
|
||||
@ -101,6 +120,7 @@ static cell_t smn_TRTraceRay(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
g_Ray.Init(g_StartVec, g_EndVec);
|
||||
enginetrace->TraceRay(g_Ray, params[3], &g_HitAllFilter, &g_Trace);
|
||||
g_Trace.UpdateEntRef();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -120,6 +140,7 @@ static cell_t smn_TRTraceHull(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
g_Ray.Init(g_StartVec, g_EndVec, g_HullMins, g_HullMaxs);
|
||||
enginetrace->TraceRay(g_Ray, params[5], &g_HitAllFilter, &g_Trace);
|
||||
g_Trace.UpdateEntRef();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -172,6 +193,7 @@ static cell_t smn_TRTraceRayFilter(IPluginContext *pContext, const cell_t *param
|
||||
|
||||
g_Ray.Init(g_StartVec, g_EndVec);
|
||||
enginetrace->TraceRay(g_Ray, params[3], &g_SMTraceFilter, &g_Trace);
|
||||
g_Trace.UpdateEntRef();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -203,6 +225,7 @@ static cell_t smn_TRTraceHullFilter(IPluginContext *pContext, const cell_t *para
|
||||
|
||||
g_Ray.Init(g_StartVec, g_EndVec, g_HullMins, g_HullMaxs);
|
||||
enginetrace->TraceRay(g_Ray, params[5], &g_SMTraceFilter, &g_Trace);
|
||||
g_Trace.UpdateEntRef();
|
||||
|
||||
return 1;
|
||||
}
|
||||
@ -239,9 +262,10 @@ static cell_t smn_TRTraceRayEx(IPluginContext *pContext, const cell_t *params)
|
||||
}
|
||||
}
|
||||
|
||||
trace_t *tr = new trace_t;
|
||||
sm_trace_t *tr = new sm_trace_t;
|
||||
ray.Init(StartVec, EndVec);
|
||||
enginetrace->TraceRay(ray, params[3], &g_HitAllFilter, tr);
|
||||
tr->UpdateEntRef();
|
||||
|
||||
HandleError herr;
|
||||
Handle_t hndl;
|
||||
@ -272,8 +296,9 @@ static cell_t smn_TRTraceHullEx(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
ray.Init(StartVec, EndVec, vmins, vmaxs);
|
||||
|
||||
trace_t *tr = new trace_t;
|
||||
sm_trace_t *tr = new sm_trace_t;
|
||||
enginetrace->TraceRay(ray, params[5], &g_HitAllFilter, tr);
|
||||
tr->UpdateEntRef();
|
||||
|
||||
HandleError herr;
|
||||
Handle_t hndl;
|
||||
@ -336,9 +361,10 @@ static cell_t smn_TRTraceRayFilterEx(IPluginContext *pContext, const cell_t *par
|
||||
}
|
||||
}
|
||||
|
||||
trace_t *tr = new trace_t;
|
||||
sm_trace_t *tr = new sm_trace_t;
|
||||
ray.Init(StartVec, EndVec);
|
||||
enginetrace->TraceRay(ray, params[3], &smfilter, tr);
|
||||
tr->UpdateEntRef();
|
||||
|
||||
HandleError herr;
|
||||
Handle_t hndl;
|
||||
@ -381,8 +407,9 @@ static cell_t smn_TRTraceHullFilterEx(IPluginContext *pContext, const cell_t *pa
|
||||
|
||||
ray.Init(StartVec, EndVec, vmins, vmaxs);
|
||||
|
||||
trace_t *tr = new trace_t;
|
||||
sm_trace_t *tr = new sm_trace_t;
|
||||
enginetrace->TraceRay(ray, params[5], &smfilter, tr);
|
||||
tr->UpdateEntRef();
|
||||
|
||||
HandleError herr;
|
||||
Handle_t hndl;
|
||||
@ -397,7 +424,7 @@ static cell_t smn_TRTraceHullFilterEx(IPluginContext *pContext, const cell_t *pa
|
||||
|
||||
static cell_t smn_TRGetFraction(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
trace_t *tr;
|
||||
sm_trace_t *tr;
|
||||
HandleError err;
|
||||
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
|
||||
|
||||
@ -413,7 +440,7 @@ static cell_t smn_TRGetFraction(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
static cell_t smn_TRGetPlaneNormal(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
trace_t *tr;
|
||||
sm_trace_t *tr;
|
||||
HandleError err;
|
||||
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
|
||||
|
||||
@ -438,7 +465,7 @@ static cell_t smn_TRGetPlaneNormal(IPluginContext *pContext, const cell_t *param
|
||||
|
||||
static cell_t smn_TRGetEndPosition(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
trace_t *tr;
|
||||
sm_trace_t *tr;
|
||||
HandleError err;
|
||||
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
|
||||
|
||||
@ -461,7 +488,7 @@ static cell_t smn_TRGetEndPosition(IPluginContext *pContext, const cell_t *param
|
||||
|
||||
static cell_t smn_TRDidHit(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
trace_t *tr;
|
||||
sm_trace_t *tr;
|
||||
HandleError err;
|
||||
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
|
||||
|
||||
@ -477,7 +504,7 @@ static cell_t smn_TRDidHit(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
static cell_t smn_TRGetHitGroup(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
trace_t *tr;
|
||||
sm_trace_t *tr;
|
||||
HandleError err;
|
||||
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
|
||||
|
||||
@ -493,23 +520,20 @@ static cell_t smn_TRGetHitGroup(IPluginContext *pContext, const cell_t *params)
|
||||
|
||||
static cell_t smn_TRGetEntityIndex(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
trace_t *tr;
|
||||
sm_trace_t *tr;
|
||||
HandleError err;
|
||||
HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity());
|
||||
|
||||
if (params[1] == BAD_HANDLE)
|
||||
{
|
||||
tr = &g_Trace;
|
||||
} else if ((err = handlesys->ReadHandle(params[1], g_TraceHandle, &sec, (void **)&tr)) != HandleError_None) {
|
||||
return gamehelpers->ReferenceToBCompatRef(g_Trace.GetEntRef());
|
||||
}
|
||||
else if ((err = handlesys->ReadHandle(params[1], g_TraceHandle, &sec, (void **)&tr)) != HandleError_None)
|
||||
{
|
||||
return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err);
|
||||
}
|
||||
|
||||
if (tr->m_pEnt == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return gamehelpers->EntityToBCompatRef(tr->m_pEnt);
|
||||
return gamehelpers->ReferenceToBCompatRef(tr->GetEntRef());
|
||||
}
|
||||
|
||||
static cell_t smn_TRGetPointContents(IPluginContext *pContext, const cell_t *params)
|
||||
|
Loading…
Reference in New Issue
Block a user