Improve logical entity support in SDKHooks natives (bug 6069, r=asherkin).
authorNicholas Hastings <skamonkey@gmail.com>
Fri Mar 21 22:09:15 2014 -0400 (2014-03-21)
changeset 4294fa845b627daf
parent 4293 f61ae385f12e
child 4295 9b2a4619d94b
Improve logical entity support in SDKHooks natives (bug 6069, r=asherkin).
extensions/sdkhooks/extension.cpp
extensions/sdkhooks/natives.cpp
extensions/sdkhooks/util.cpp
extensions/sdkhooks/util.h
     1.1 --- a/extensions/sdkhooks/extension.cpp	Fri Mar 21 13:23:48 2014 -0400
     1.2 +++ b/extensions/sdkhooks/extension.cpp	Fri Mar 21 22:09:15 2014 -0400
     1.3 @@ -528,7 +528,7 @@
     1.4  	if(!g_HookTypes[type].supported)
     1.5  		return HookRet_NotSupported;
     1.6  
     1.7 -	CBaseEntity *pEnt = UTIL_GetCBaseEntity(entity);
     1.8 +	CBaseEntity *pEnt = gamehelpers->ReferenceToEntity(entity);
     1.9  	if(!pEnt)
    1.10  		return HookRet_InvalidEntity;
    1.11  	if(type < 0 || type >= SDKHook_MAXHOOKS)
     2.1 --- a/extensions/sdkhooks/natives.cpp	Fri Mar 21 13:23:48 2014 -0400
     2.2 +++ b/extensions/sdkhooks/natives.cpp	Fri Mar 21 22:09:15 2014 -0400
     2.3 @@ -58,14 +58,15 @@
     2.4  			break;
     2.5  		case HookRet_BadEntForHookType:
     2.6  		{
     2.7 -			const char * pClassname = gamehelpers->GetEntityClassname(PEntityOfEntIndex(gamehelpers->ReferenceToIndex(params[1])));
     2.8 -			if (!pClassname)
     2.9 -			{
    2.10 -				pContext->ThrowNativeError("Hook type not valid for this type of entity (%i).", entity);
    2.11 -			}
    2.12 -			else
    2.13 -			{
    2.14 -				pContext->ThrowNativeError("Hook type not valid for this type of entity (%s)", pClassname);
    2.15 +			CBaseEntity *pEnt = gamehelpers->ReferenceToEntity(params[1]);
    2.16 +			const char *pClassname = pEnt ? gamehelpers->GetEntityClassname(pEnt) : NULL;
    2.17 +			if (!pClassname)
    2.18 +			{
    2.19 +				pContext->ThrowNativeError("Hook type not valid for this type of entity (%i).", entity);
    2.20 +			}
    2.21 +			else
    2.22 +			{
    2.23 +				pContext->ThrowNativeError("Hook type not valid for this type of entity (%i/%s)", entity, pClassname);
    2.24  			}
    2.25  			
    2.26  			break;
    2.27 @@ -108,18 +109,18 @@
    2.28  #if !defined SH_DECL_MANUALEXTERN1
    2.29  	pContext->ThrowNativeError("SDKHooks_TakeDamage is not supported on this engine.");
    2.30  #else
    2.31 -	CBaseEntity *pVictim = UTIL_GetCBaseEntity(params[1]);
    2.32 +	CBaseEntity *pVictim = gamehelpers->ReferenceToEntity(params[1]);
    2.33  	if (!pVictim)
    2.34  		return pContext->ThrowNativeError("Invalid entity index %d for victim", params[1]);
    2.35  	
    2.36 -	CBaseEntity *pInflictor = UTIL_GetCBaseEntity(params[2]);
    2.37 +	CBaseEntity *pInflictor = gamehelpers->ReferenceToEntity(params[2]);
    2.38  	if (!pInflictor)
    2.39  		return pContext->ThrowNativeError("Invalid entity index %d for inflictor", params[2]);
    2.40  
    2.41  	CBaseEntity *pAttacker;
    2.42  	if (params[3] != -1)
    2.43  	{
    2.44 -		pAttacker = UTIL_GetCBaseEntity(params[3]);
    2.45 +		pAttacker = gamehelpers->ReferenceToEntity(params[3]);
    2.46  		if (!pAttacker)
    2.47  		{
    2.48  			return pContext->ThrowNativeError("Invalid entity index %d for attackerr", params[3]);
    2.49 @@ -136,7 +137,7 @@
    2.50  	CBaseEntity *pWeapon;
    2.51  	if (params[6] != -1)
    2.52  	{
    2.53 -		pWeapon = UTIL_GetCBaseEntity(params[6]);
    2.54 +		pWeapon = gamehelpers->ReferenceToEntity(params[6]);
    2.55  		if (!pWeapon)
    2.56  		{
    2.57  			return pContext->ThrowNativeError("Invalid entity index %d for weapon", params[6]);
    2.58 @@ -192,11 +193,15 @@
    2.59  #if !defined SH_DECL_MANUALEXTERN1
    2.60  	pContext->ThrowNativeError("SDKHooks_DropWeapon is not supported on this engine.");
    2.61  #else
    2.62 -	CBaseEntity *pPlayer = UTIL_GetCBaseEntity(params[1], true);
    2.63 +	CBaseEntity *pPlayer = gamehelpers->ReferenceToEntity(params[1]);
    2.64  	if (!pPlayer)
    2.65  		return pContext->ThrowNativeError("Invalid client index %d", params[1]);
    2.66 +
    2.67 +	IGamePlayer *pGamePlayer = playerhelpers->GetGamePlayer(gamehelpers->ReferenceToIndex(params[1]));
    2.68 +	if (!pGamePlayer || !pGamePlayer->IsInGame())
    2.69 +		return pContext->ThrowNativeError("Client index %d not in game", params[1]);
    2.70  	
    2.71 -	CBaseEntity *pWeapon = UTIL_GetCBaseEntity(params[2]);
    2.72 +	CBaseEntity *pWeapon = gamehelpers->ReferenceToEntity(params[2]);
    2.73  	if (!pWeapon)
    2.74  		return pContext->ThrowNativeError("Invalid entity index %d for weapon", params[2]);
    2.75  
     3.1 --- a/extensions/sdkhooks/util.cpp	Fri Mar 21 13:23:48 2014 -0400
     3.2 +++ b/extensions/sdkhooks/util.cpp	Fri Mar 21 22:09:15 2014 -0400
     3.3 @@ -34,36 +34,6 @@
     3.4  #include "extension.h"
     3.5  #include "util.h"
     3.6  
     3.7 -CBaseEntity *UTIL_GetCBaseEntity(int num, bool onlyPlayers)
     3.8 -{
     3.9 -	edict_t *pEdict = PEntityOfEntIndex(num);
    3.10 -	if (!pEdict || pEdict->IsFree())
    3.11 -	{
    3.12 -		return NULL;
    3.13 -	}
    3.14 -
    3.15 -	if (num > 0 && num <= playerhelpers->GetMaxClients())
    3.16 -	{
    3.17 -		IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(pEdict);
    3.18 -		if (!pPlayer || !pPlayer->IsConnected())
    3.19 -		{
    3.20 -			return NULL;
    3.21 -		}
    3.22 -	}
    3.23 -	else if (onlyPlayers)
    3.24 -	{
    3.25 -		return NULL;
    3.26 -	}
    3.27 -
    3.28 -	IServerUnknown *pUnk;
    3.29 -	if ((pUnk=pEdict->GetUnknown()) == NULL)
    3.30 -	{
    3.31 -		return NULL;
    3.32 -	}
    3.33 -
    3.34 -	return pUnk->GetBaseEntity();
    3.35 -}
    3.36 -
    3.37  bool UTIL_ContainsDataTable(SendTable *pTable, const char *name)
    3.38  {
    3.39  	const char *pname = pTable->GetName();
     4.1 --- a/extensions/sdkhooks/util.h	Fri Mar 21 13:23:48 2014 -0400
     4.2 +++ b/extensions/sdkhooks/util.h	Fri Mar 21 22:09:15 2014 -0400
     4.3 @@ -34,7 +34,6 @@
     4.4  
     4.5  #include <compat_wrappers.h>
     4.6  
     4.7 -CBaseEntity *UTIL_GetCBaseEntity(int num, bool onlyPlayers=false);
     4.8  bool UTIL_ContainsDataTable(SendTable *pTable, const char *name);
     4.9  
    4.10  #endif  //_INCLUDE_TF2TOOLS_UTIL_H_