From 3fb09e8d44e5537c25867ce893db2ae6f377a720 Mon Sep 17 00:00:00 2001 From: bottiger1 <55270538+bottiger1@users.noreply.github.com> Date: Thu, 23 May 2024 17:04:22 -0700 Subject: [PATCH] add pointer sdktools type --- extensions/sdktools/vcaller.cpp | 13 +++++---- extensions/sdktools/vdecoder.cpp | 45 ++++++++++++++++++++++++++++++++ extensions/sdktools/vdecoder.h | 1 + plugins/include/sdktools.inc | 4 ++- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/extensions/sdktools/vcaller.cpp b/extensions/sdktools/vcaller.cpp index 3cabcc40ae..a6fb0098af 100644 --- a/extensions/sdktools/vcaller.cpp +++ b/extensions/sdktools/vcaller.cpp @@ -63,7 +63,8 @@ inline void DecodePassMethod(ValveType vtype, SDKPassMethod method, PassType &ty type = PassType_Basic; if (vtype == Valve_POD || vtype == Valve_Float - || vtype == Valve_Bool) + || vtype == Valve_Bool + || vtype == Valve_Pointer) { flags = PASSFLAG_BYVAL | PASSFLAG_ASPOINTER; } else { @@ -394,8 +395,8 @@ static cell_t SDKCall(IPluginContext *pContext, const cell_t *params) } //note: varargs pawn args are passed by-ref - cell_t *cell; - pContext->LocalToPhysAddr(params[startparam], &cell); + intptr_t *cell; + pContext->LocalToPhysAddr(params[startparam], reinterpret_cast(&cell)); void *thisptr = reinterpret_cast(*cell); if (thisptr == nullptr) @@ -429,7 +430,8 @@ static cell_t SDKCall(IPluginContext *pContext, const cell_t *params) { startparam += 2; } else if (vc->retinfo->vtype == Valve_Vector - || vc->retinfo->vtype == Valve_QAngle) + || vc->retinfo->vtype == Valve_QAngle + || vc->retinfo->vtype == Valve_Pointer) { startparam += 1; } @@ -506,7 +508,8 @@ static cell_t SDKCall(IPluginContext *pContext, const cell_t *params) pContext->StringToLocalUTF8(params[retparam], *addr, *(char **)vc->retbuf, &written); return (cell_t)written; } else if (vc->retinfo->vtype == Valve_Vector - || vc->retinfo->vtype == Valve_QAngle) + || vc->retinfo->vtype == Valve_QAngle + || vc->retinfo->vtype == Valve_Pointer) { if (numparams < 2) { diff --git a/extensions/sdktools/vdecoder.cpp b/extensions/sdktools/vdecoder.cpp index 7bdf2ef0eb..a07e59e148 100644 --- a/extensions/sdktools/vdecoder.cpp +++ b/extensions/sdktools/vdecoder.cpp @@ -164,6 +164,20 @@ size_t ValveParamToBinParam(ValveType type, return sizeof(float); } } + case Valve_Pointer: + { + info->type = PassType_Basic; + info->flags = flags; + if (flags & PASSFLAG_ASPOINTER) + { + needs_extra = true; + info->size = sizeof(void*); + return sizeof(void*) * 2; + } else { + info->size = sizeof(void*); + return sizeof(void*); + } + } } return 0; @@ -278,6 +292,20 @@ DataStatus EncodeValveParam(IPluginContext *pContext, return Data_Okay; } + case Valve_Pointer: // buffer -> sourcepawn + { + intptr_t *addr; + pContext->LocalToPhysAddr(param, reinterpret_cast(&addr)); + + if (data->flags & PASSFLAG_ASPOINTER) + { + buffer = *(intptr_t **)buffer; + } + + *addr = *(intptr_t *)buffer; + + return Data_Okay; + } } return Data_Fail; @@ -573,6 +601,23 @@ DataStatus DecodeValveParam(IPluginContext *pContext, *(char **)buffer = addr; return Data_Okay; } + case Valve_Pointer: // sourcepawn -> buffer + { + intptr_t *addr; + pContext->LocalToPhysAddr(param, reinterpret_cast(&addr)); + + if (data->decflags & VDECODE_FLAG_BYREF) + { + addr = reinterpret_cast(*addr); + } + if (data->flags & PASSFLAG_ASPOINTER) + { + *(void **)buffer = (unsigned char *)_buffer + pCall->stackEnd + data->obj_offset; + buffer = *(void **)buffer; + } + *(intptr_t *)buffer = *addr; + return Data_Okay; + } } return Data_Fail; diff --git a/extensions/sdktools/vdecoder.h b/extensions/sdktools/vdecoder.h index 16478cf101..bd4ad8233a 100644 --- a/extensions/sdktools/vdecoder.h +++ b/extensions/sdktools/vdecoder.h @@ -54,6 +54,7 @@ enum ValveType Valve_String, /**< String */ Valve_Bool, /**< Boolean */ Valve_Object, /**< Object, not matching one of the above types */ + Valve_Pointer, /**< 64 bit or 32 bit array */ }; enum DataStatus diff --git a/plugins/include/sdktools.inc b/plugins/include/sdktools.inc index 07fc55f82f..3d47d140d8 100644 --- a/plugins/include/sdktools.inc +++ b/plugins/include/sdktools.inc @@ -88,7 +88,9 @@ enum SDKType SDKType_Float, /**< Float (any) */ SDKType_Edict, /**< edict_t (always as pointer) */ SDKType_String, /**< NULL-terminated string (always as pointer) */ - SDKType_Bool /**< Boolean (any) */ + SDKType_Bool, /**< Boolean (any) */ + SDKType_Object, + SDKType_Pointer, /**< Pointer (pass in an array) */ }; enum SDKPassMethod