@@ -42,6 +42,8 @@ enum SDKFuncConfSource
4242SDKConf_Address
4343};
4444
45+ using ParamVector = SourceHook::CVector<ParamInfo>;
46+
4547bool GetHandleIfValidOrError (HandleType_t type, void **object, IPluginContext *pContext, cell_t param)
4648{
4749if (param == BAD_HANDLE)
@@ -81,6 +83,56 @@ bool GetCallbackArgHandleIfValidOrError(HandleType_t type, HandleType_t otherTyp
8183return true ;
8284}
8385
86+ bool GetObjectAddrOrThis (IPluginContext *pContext, const cell_t *params, void *&retAddr)
87+ {
88+ HookParamsStruct *paramStruct = NULL ;
89+ retAddr = NULL ;
90+
91+ if (!GetCallbackArgHandleIfValidOrError (g_HookParamsHandle, g_HookReturnHandle, (void **)¶mStruct, pContext, params[1 ]))
92+ {
93+ return false ;
94+ }
95+
96+ if (params[2 ] != 0 )
97+ {
98+ const ParamVector ¶msVec = paramStruct->dg ->params ;
99+
100+ if (params[2 ] < 0 || params[2 ] > static_cast <int >(paramsVec.size ()))
101+ {
102+ return pContext->ThrowNativeError (" Invalid param number %i max params is %i" , params[2 ], paramsVec.size ());
103+ }
104+
105+ int index = params[2 ] - 1 ;
106+ const ParamInfo ¶m = paramsVec.at (index);
107+
108+ if (param.type != HookParamType_ObjectPtr && param.type != HookParamType_Object)
109+ {
110+ return pContext->ThrowNativeError (" Invalid object value type %i" , param.type );
111+ }
112+
113+ size_t offset = GetParamOffset (paramStruct, index);
114+ retAddr = GetObjectAddr (param.type , param.flags , paramStruct->orgParams , offset);
115+ return true ;
116+ }
117+
118+ const DHooksInfo* dgInfo = paramStruct->dg ;
119+
120+ if (dgInfo->thisFuncCallConv != CallConv_THISCALL)
121+ {
122+ return pContext->ThrowNativeError (" Parameter 'this' is only available in member functions" );
123+ }
124+
125+ if (dgInfo->thisType != ThisPointer_Address
126+ && dgInfo->thisType != ThisPointer_CBaseEntity
127+ && dgInfo->hookType != HookType_GameRules)
128+ {
129+ return pContext->ThrowNativeError (" Parameter 'this' is not specified as an address, it is not available" );
130+ }
131+
132+ retAddr = g_SHPtr->GetIfacePtr ();
133+ return true ;
134+ }
135+
84136IPluginFunction *GetCallback (IPluginContext *pContext, HookSetup * setup, const cell_t *params, cell_t callback_index)
85137{
86138IPluginFunction *ret = NULL ;
@@ -1089,28 +1141,12 @@ cell_t Native_RemoveEntityListener(IPluginContext *pContext, const cell_t *param
10891141// native any:DHookGetParamObjectPtrVar(Handle:hParams, num, offset, ObjectValueType:type);
10901142cell_t Native_GetParamObjectPtrVar (IPluginContext *pContext, const cell_t *params)
10911143{
1092- HookParamsStruct *paramStruct;
1093-
1094- if (!GetCallbackArgHandleIfValidOrError (g_HookParamsHandle, g_HookReturnHandle, (void **)¶mStruct, pContext, params[1 ]))
1144+ void *addr = NULL ;
1145+ if (!GetObjectAddrOrThis (pContext, params, addr))
10951146{
10961147return 0 ;
10971148}
10981149
1099- if (params[2 ] <= 0 || params[2 ] > (int )paramStruct->dg ->params .size ())
1100- {
1101- return pContext->ThrowNativeError (" Invalid param number %i max params is %i" , params[2 ], paramStruct->dg ->params .size ());
1102- }
1103-
1104- int index = params[2 ] - 1 ;
1105-
1106- if (paramStruct->dg ->params .at (index).type != HookParamType_ObjectPtr && paramStruct->dg ->params .at (index).type != HookParamType_Object)
1107- {
1108- return pContext->ThrowNativeError (" Invalid object value type %i" , paramStruct->dg ->params .at (index).type );
1109- }
1110-
1111- size_t offset = GetParamOffset (paramStruct, index);
1112- void *addr = GetObjectAddr (paramStruct->dg ->params .at (index).type , paramStruct->dg ->params .at (index).flags , paramStruct->orgParams , offset);
1113-
11141150switch ((ObjectValueType)params[4 ])
11151151{
11161152case ObjectValueType_Int:
@@ -1160,28 +1196,12 @@ cell_t Native_GetParamObjectPtrVar(IPluginContext *pContext, const cell_t *param
11601196// native DHookSetParamObjectPtrVar(Handle:hParams, num, offset, ObjectValueType:type, value)
11611197cell_t Native_SetParamObjectPtrVar (IPluginContext *pContext, const cell_t *params)
11621198{
1163- HookParamsStruct *paramStruct;
1164-
1165- if (!GetCallbackArgHandleIfValidOrError (g_HookParamsHandle, g_HookReturnHandle, (void **)¶mStruct, pContext, params[1 ]))
1199+ void *addr = NULL ;
1200+ if (!GetObjectAddrOrThis (pContext, params, addr))
11661201{
11671202return 0 ;
11681203}
11691204
1170- if (params[2 ] <= 0 || params[2 ] > (int )paramStruct->dg ->params .size ())
1171- {
1172- return pContext->ThrowNativeError (" Invalid param number %i max params is %i" , params[2 ], paramStruct->dg ->params .size ());
1173- }
1174-
1175- int index = params[2 ] - 1 ;
1176-
1177- if (paramStruct->dg ->params .at (index).type != HookParamType_ObjectPtr && paramStruct->dg ->params .at (index).type != HookParamType_Object)
1178- {
1179- return pContext->ThrowNativeError (" Invalid object value type %i" , paramStruct->dg ->params .at (index).type );
1180- }
1181-
1182- size_t offset = GetParamOffset (paramStruct, index);
1183- void *addr = GetObjectAddr (paramStruct->dg ->params .at (index).type , paramStruct->dg ->params .at (index).flags , paramStruct->orgParams , offset);
1184-
11851205switch ((ObjectValueType)params[4 ])
11861206{
11871207case ObjectValueType_Int:
@@ -1245,28 +1265,12 @@ cell_t Native_SetParamObjectPtrVar(IPluginContext *pContext, const cell_t *param
12451265// native DHookGetParamObjectPtrVarVector(Handle:hParams, num, offset, ObjectValueType:type, Float:buffer[3]);
12461266cell_t Native_GetParamObjectPtrVarVector (IPluginContext *pContext, const cell_t *params)
12471267{
1248- HookParamsStruct *paramStruct;
1249-
1250- if (!GetCallbackArgHandleIfValidOrError (g_HookParamsHandle, g_HookReturnHandle, (void **)¶mStruct, pContext, params[1 ]))
1268+ void *addr = NULL ;
1269+ if (!GetObjectAddrOrThis (pContext, params, addr))
12511270{
12521271return 0 ;
12531272}
12541273
1255- if (params[2 ] <= 0 || params[2 ] > (int )paramStruct->dg ->params .size ())
1256- {
1257- return pContext->ThrowNativeError (" Invalid param number %i max params is %i" , params[2 ], paramStruct->dg ->params .size ());
1258- }
1259-
1260- int index = params[2 ] - 1 ;
1261-
1262- if (paramStruct->dg ->params .at (index).type != HookParamType_ObjectPtr && paramStruct->dg ->params .at (index).type != HookParamType_Object)
1263- {
1264- return pContext->ThrowNativeError (" Invalid object value type %i" , paramStruct->dg ->params .at (index).type );
1265- }
1266-
1267- size_t offset = GetParamOffset (paramStruct, index);
1268- void *addr = GetObjectAddr (paramStruct->dg ->params .at (index).type , paramStruct->dg ->params .at (index).flags , paramStruct->orgParams , offset);
1269-
12701274cell_t *buffer;
12711275pContext->LocalToPhysAddr (params[5 ], &buffer);
12721276
@@ -1299,28 +1303,12 @@ cell_t Native_GetParamObjectPtrVarVector(IPluginContext *pContext, const cell_t
12991303// native DHookSetParamObjectPtrVarVector(Handle:hParams, num, offset, ObjectValueType:type, Float:value[3]);
13001304cell_t Native_SetParamObjectPtrVarVector (IPluginContext *pContext, const cell_t *params)
13011305{
1302- HookParamsStruct *paramStruct;
1303-
1304- if (!GetCallbackArgHandleIfValidOrError (g_HookParamsHandle, g_HookReturnHandle, (void **)¶mStruct, pContext, params[1 ]))
1306+ void *addr = NULL ;
1307+ if (!GetObjectAddrOrThis (pContext, params, addr))
13051308{
13061309return 0 ;
13071310}
13081311
1309- if (params[2 ] <= 0 || params[2 ] > (int )paramStruct->dg ->params .size ())
1310- {
1311- return pContext->ThrowNativeError (" Invalid param number %i max params is %i" , params[2 ], paramStruct->dg ->params .size ());
1312- }
1313-
1314- int index = params[2 ] - 1 ;
1315-
1316- if (paramStruct->dg ->params .at (index).type != HookParamType_ObjectPtr && paramStruct->dg ->params .at (index).type != HookParamType_Object)
1317- {
1318- return pContext->ThrowNativeError (" Invalid object value type %i" , paramStruct->dg ->params .at (index).type );
1319- }
1320-
1321- size_t offset = GetParamOffset (paramStruct, index);
1322- void *addr = GetObjectAddr (paramStruct->dg ->params .at (index).type , paramStruct->dg ->params .at (index).flags , paramStruct->orgParams , offset);
1323-
13241312cell_t *buffer;
13251313pContext->LocalToPhysAddr (params[5 ], &buffer);
13261314
@@ -1352,28 +1340,12 @@ cell_t Native_SetParamObjectPtrVarVector(IPluginContext *pContext, const cell_t
13521340// native DHookGetParamObjectPtrString(Handle:hParams, num, offset, ObjectValueType:type, String:buffer[], size)
13531341cell_t Native_GetParamObjectPtrString (IPluginContext *pContext, const cell_t *params)
13541342{
1355- HookParamsStruct *paramStruct;
1356-
1357- if (!GetCallbackArgHandleIfValidOrError (g_HookParamsHandle, g_HookReturnHandle, (void **)¶mStruct, pContext, params[1 ]))
1343+ void *addr = NULL ;
1344+ if (!GetObjectAddrOrThis (pContext, params, addr))
13581345{
13591346return 0 ;
13601347}
13611348
1362- if (params[2 ] <= 0 || params[2 ] > (int )paramStruct->dg ->params .size ())
1363- {
1364- return pContext->ThrowNativeError (" Invalid param number %i max params is %i" , params[2 ], paramStruct->dg ->params .size ());
1365- }
1366-
1367- int index = params[2 ] - 1 ;
1368-
1369- if (paramStruct->dg ->params .at (index).type != HookParamType_ObjectPtr && paramStruct->dg ->params .at (index).type != HookParamType_Object)
1370- {
1371- return pContext->ThrowNativeError (" Invalid object value type %i" , paramStruct->dg ->params .at (index).type );
1372- }
1373-
1374- size_t offset = GetParamOffset (paramStruct, index);
1375- void *addr = GetObjectAddr (paramStruct->dg ->params .at (index).type , paramStruct->dg ->params .at (index).flags , paramStruct->orgParams , offset);
1376-
13771349switch ((ObjectValueType)params[4 ])
13781350{
13791351case ObjectValueType_CharPtr:
0 commit comments