Add support for string returns (not fully tested)
This commit is contained in:
		
							parent
							
								
									50b7eb0def
								
							
						
					
					
						commit
						6e40653db6
					
				
							
								
								
									
										79
									
								
								natives.cpp
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								natives.cpp
									
									
									
									
									
								
							| @ -376,9 +376,9 @@ cell_t Native_GetReturn(IPluginContext *pContext, const cell_t *params) | |||||||
| 		case ReturnType_Bool: | 		case ReturnType_Bool: | ||||||
| 			return *(bool *)returnStruct->orgResult? 1 : 0; | 			return *(bool *)returnStruct->orgResult? 1 : 0; | ||||||
| 		case ReturnType_CBaseEntity: | 		case ReturnType_CBaseEntity: | ||||||
| 			return gamehelpers->EntityToBCompatRef((CBaseEntity *)returnStruct->orgResult); | 			return gamehelpers->EntityToBCompatRef(*(CBaseEntity **)returnStruct->orgResult); | ||||||
| 		case ReturnType_Edict: | 		case ReturnType_Edict: | ||||||
| 			return gamehelpers->IndexOfEdict((edict_t *)returnStruct->orgResult); | 			return gamehelpers->IndexOfEdict(*(edict_t **)returnStruct->orgResult); | ||||||
| 		case ReturnType_Float: | 		case ReturnType_Float: | ||||||
| 			return sp_ftoc(*(float *)returnStruct->orgResult); | 			return sp_ftoc(*(float *)returnStruct->orgResult); | ||||||
| 		default: | 		default: | ||||||
| @ -479,8 +479,75 @@ cell_t Native_GetParamString(IPluginContext *pContext, const cell_t *params) | |||||||
| 
 | 
 | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
| //cell_t Native_GetReturnString(IPluginContext *pContext, const cell_t *params);
 | cell_t Native_GetReturnString(IPluginContext *pContext, const cell_t *params) | ||||||
| //cell_t Native_SetReturnString(IPluginContext *pContext, const cell_t *params);
 | { | ||||||
|  | 	if(params[1] == BAD_HANDLE) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %i", BAD_HANDLE); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	HandleError err; | ||||||
|  | 	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); | ||||||
|  | 	HookReturnStruct *returnStruct; | ||||||
|  | 
 | ||||||
|  | 	if((err = handlesys->ReadHandle(params[1], g_HookReturnHandle, &sec, (void **)&returnStruct)) != HandleError_None) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	switch(returnStruct->type) | ||||||
|  | 	{ | ||||||
|  | 		case ReturnType_String: | ||||||
|  | 			pContext->StringToLocal(params[2], params[3], (*(string_t *)returnStruct->orgResult == NULL_STRING) ? "" : STRING(*(string_t *)returnStruct->orgResult)); | ||||||
|  | 			return 1; | ||||||
|  | 		case ReturnType_StringPtr: | ||||||
|  | 			pContext->StringToLocal(params[2], params[3], (*(string_t **)returnStruct->orgResult == NULL) ? "" : (*(string_t **)returnStruct->orgResult)->ToCStr()); | ||||||
|  | 			return 1; | ||||||
|  | 		case ReturnType_CharPtr: | ||||||
|  | 			pContext->StringToLocal(params[2], params[3], (*(char **)returnStruct->orgResult == NULL) ? "" : *(const char **)returnStruct->orgResult); | ||||||
|  | 			return 1; | ||||||
|  | 		default: | ||||||
|  | 			return pContext->ThrowNativeError("Invalid param type to get. Param is not a string."); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | cell_t Native_SetReturnString(IPluginContext *pContext, const cell_t *params) | ||||||
|  | { | ||||||
|  | 	if(params[1] == BAD_HANDLE) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %i", BAD_HANDLE); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	HandleError err; | ||||||
|  | 	HandleSecurity sec(pContext->GetIdentity(), myself->GetIdentity()); | ||||||
|  | 	HookReturnStruct *returnStruct; | ||||||
|  | 
 | ||||||
|  | 	if((err = handlesys->ReadHandle(params[1], g_HookReturnHandle, &sec, (void **)&returnStruct)) != HandleError_None) | ||||||
|  | 	{ | ||||||
|  | 		return pContext->ThrowNativeError("Invalid Handle %x (error %d)", params[1], err); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	char *value; | ||||||
|  | 	pContext->LocalToString(params[2], &value); | ||||||
|  | 
 | ||||||
|  | 	switch(returnStruct->type) | ||||||
|  | 	{ | ||||||
|  | 		case ReturnType_String: | ||||||
|  | 			*(string_t *)returnStruct->newResult = MAKE_STRING(value); | ||||||
|  | 			returnStruct->isChanged = true; | ||||||
|  | 			return 1; | ||||||
|  | 		case ReturnType_StringPtr: | ||||||
|  | 			*(string_t **)returnStruct->newResult = new string_t(MAKE_STRING(value)); | ||||||
|  | 			returnStruct->isChanged = true; | ||||||
|  | 			return 1; | ||||||
|  | 		case ReturnType_CharPtr: | ||||||
|  | 			*(char **)returnStruct->newResult = new char[strlen(value)+1]; | ||||||
|  | 			strcpy(*(char **)returnStruct->newResult, value); | ||||||
|  | 			returnStruct->isChanged = true; | ||||||
|  | 			return 1; | ||||||
|  | 		default: | ||||||
|  | 			return pContext->ThrowNativeError("Invalid param type to get. Param is not a string."); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| //native DHookSetParamString(Handle:hParams, num, String:value[])
 | //native DHookSetParamString(Handle:hParams, num, String:value[])
 | ||||||
| cell_t Native_SetParamString(IPluginContext *pContext, const cell_t *params) | cell_t Native_SetParamString(IPluginContext *pContext, const cell_t *params) | ||||||
| @ -590,8 +657,8 @@ sp_nativeinfo_t g_Natives[] = | |||||||
| 	{"DHookSetReturnVector",				Native_SetReturnVector}, | 	{"DHookSetReturnVector",				Native_SetReturnVector}, | ||||||
| 	{"DHookSetParamVector",					Native_SetParamVector},*/ | 	{"DHookSetParamVector",					Native_SetParamVector},*/ | ||||||
| 	{"DHookGetParamString",					Native_GetParamString}, | 	{"DHookGetParamString",					Native_GetParamString}, | ||||||
| 	//{"DHookGetReturnString",				Native_GetReturnString},
 | 	{"DHookGetReturnString",				Native_GetReturnString}, | ||||||
| 	//{"DHookSetReturnString",				Native_SetReturnString},
 | 	{"DHookSetReturnString",				Native_SetReturnString}, | ||||||
| 	{"DHookSetParamString",					Native_SetParamString}, | 	{"DHookSetParamString",					Native_SetParamString}, | ||||||
| 	{"DHookAddEntityListener",				Native_AddEntityListener}, | 	{"DHookAddEntityListener",				Native_AddEntityListener}, | ||||||
| 	{"DHookRemoveEntityListener",			Native_RemoveEntityListener}, | 	{"DHookRemoveEntityListener",			Native_RemoveEntityListener}, | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								vhook.cpp
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								vhook.cpp
									
									
									
									
									
								
							| @ -125,12 +125,18 @@ HookReturnStruct *GetReturnStruct(DHooksCallback *dg, const void *result) | |||||||
| 	res->type = dg->returnType; | 	res->type = dg->returnType; | ||||||
| 	res->newResult = malloc(sizeof(void *)); | 	res->newResult = malloc(sizeof(void *)); | ||||||
| 	res->orgResult = malloc(sizeof(void *)); | 	res->orgResult = malloc(sizeof(void *)); | ||||||
|  | 	if(dg->returnType != ReturnType_CharPtr && dg->returnType != ReturnType_StringPtr) | ||||||
|  | 	{ | ||||||
|  | 		res->newResult = malloc(sizeof(void *)); | ||||||
|  | 	} | ||||||
| 
 | 
 | ||||||
| 	if(result && dg->post) | 	if(result && dg->post) | ||||||
| 	{ | 	{ | ||||||
| 		switch(dg->returnType) | 		switch(dg->returnType) | ||||||
| 		{ | 		{ | ||||||
| 			//ReturnType_String,
 | 			case ReturnType_String: | ||||||
|  | 				*(string_t *)res->orgResult = *(string_t *)res->orgResult; | ||||||
|  | 				break; | ||||||
| 			//ReturnType_Vector,
 | 			//ReturnType_Vector,
 | ||||||
| 			case ReturnType_Int: | 			case ReturnType_Int: | ||||||
| 				*(int *)res->orgResult = *(int *)result; | 				*(int *)res->orgResult = *(int *)result; | ||||||
| @ -150,7 +156,9 @@ HookReturnStruct *GetReturnStruct(DHooksCallback *dg, const void *result) | |||||||
| 	{ | 	{ | ||||||
| 		switch(dg->returnType) | 		switch(dg->returnType) | ||||||
| 		{ | 		{ | ||||||
| 			//ReturnType_String,
 | 			case ReturnType_String: | ||||||
|  | 				*(string_t *)res->orgResult = NULL_STRING; | ||||||
|  | 				break; | ||||||
| 			//ReturnType_Vector,
 | 			//ReturnType_Vector,
 | ||||||
| 			case ReturnType_Int: | 			case ReturnType_Int: | ||||||
| 				*(int *)res->orgResult = 0; | 				*(int *)res->orgResult = 0; | ||||||
|  | |||||||
							
								
								
									
										16
									
								
								vhook.h
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								vhook.h
									
									
									
									
									
								
							| @ -74,7 +74,21 @@ class HookReturnStruct | |||||||
| public: | public: | ||||||
| 	~HookReturnStruct() | 	~HookReturnStruct() | ||||||
| 	{ | 	{ | ||||||
| 		free(this->newResult); | 		if(this->type != ReturnType_CharPtr && this->type != ReturnType_StringPtr) | ||||||
|  | 		{ | ||||||
|  | 			free(this->newResult); | ||||||
|  | 		} | ||||||
|  | 		else if(this->isChanged) | ||||||
|  | 		{ | ||||||
|  | 			if(this->type != ReturnType_CharPtr) | ||||||
|  | 			{ | ||||||
|  | 				delete *(char **)this->newResult; | ||||||
|  | 			} | ||||||
|  | 			else if(this->type != ReturnType_StringPtr) | ||||||
|  | 			{ | ||||||
|  | 				delete *(string_t **)this->newResult; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		free(this->orgResult); | 		free(this->orgResult); | ||||||
| 	} | 	} | ||||||
| public: | public: | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user