Improve logical entity support in SDKHooks natives (bug 6069, r=asherkin).
Improve logical entity support in SDKHooks natives (
bug 6069, r=asherkin).
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_