Compare commits
	
		
			2 Commits
		
	
	
		
			1.10-fork
			...
			feature-SD
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					f5933d181e | ||
| 
						 | 
					246aa90f4d | 
@ -112,6 +112,7 @@ IServerTools *servertools = NULL;
 | 
			
		||||
 | 
			
		||||
// global hooks and forwards
 | 
			
		||||
IForward *g_pOnEntityCreated = NULL;
 | 
			
		||||
IForward *g_pOnEntitySpawned = NULL;
 | 
			
		||||
IForward *g_pOnEntityDestroyed = NULL;
 | 
			
		||||
 | 
			
		||||
#ifdef GAMEDESC_CAN_CHANGE
 | 
			
		||||
@ -252,6 +253,7 @@ bool SDKHooks::SDK_OnLoad(char *error, size_t maxlength, bool late)
 | 
			
		||||
	plsys->AddPluginsListener(&g_Interface);
 | 
			
		||||
 | 
			
		||||
	g_pOnEntityCreated = forwards->CreateForward("OnEntityCreated", ET_Ignore, 2, NULL, Param_Cell, Param_String);
 | 
			
		||||
	g_pOnEntitySpawned = forwards->CreateForward("OnEntitySpawned", ET_Ignore, 2, NULL, Param_Cell, Param_String);
 | 
			
		||||
	g_pOnEntityDestroyed = forwards->CreateForward("OnEntityDestroyed", ET_Ignore, 1, NULL, Param_Cell);
 | 
			
		||||
#ifdef GAMEDESC_CAN_CHANGE
 | 
			
		||||
	g_pOnGetGameNameDescription = forwards->CreateForward("OnGetGameDescription", ET_Hook, 2, NULL, Param_String);
 | 
			
		||||
@ -344,6 +346,7 @@ void SDKHooks::SDK_OnUnload()
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	forwards->ReleaseForward(g_pOnEntityCreated);
 | 
			
		||||
	forwards->ReleaseForward(g_pOnEntitySpawned);
 | 
			
		||||
	forwards->ReleaseForward(g_pOnEntityDestroyed);
 | 
			
		||||
#ifdef GAMEDESC_CAN_CHANGE
 | 
			
		||||
	forwards->ReleaseForward(g_pOnGetGameNameDescription);
 | 
			
		||||
@ -420,6 +423,7 @@ void SDKHooks::OnClientPutInServer(int client)
 | 
			
		||||
	CBaseEntity *pPlayer = gamehelpers->ReferenceToEntity(client);
 | 
			
		||||
 | 
			
		||||
	HandleEntityCreated(pPlayer, client, gamehelpers->EntityToReference(pPlayer));
 | 
			
		||||
	HandleEntitySpawned(pPlayer, client, gamehelpers->EntityToReference(pPlayer));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDKHooks::OnClientDisconnecting(int client)
 | 
			
		||||
@ -879,6 +883,27 @@ void SDKHooks::OnEntityCreated(CBaseEntity *pEntity)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDKHooks::OnEntitySpawned(CBaseEntity *pEntity)
 | 
			
		||||
{
 | 
			
		||||
	// Call OnEntitySpawned forward
 | 
			
		||||
	int ref = gamehelpers->EntityToReference(pEntity);
 | 
			
		||||
	int index = gamehelpers->ReferenceToIndex(ref);
 | 
			
		||||
 | 
			
		||||
	// This can be -1 for player ents before any players have connected
 | 
			
		||||
	if ((unsigned)index == INVALID_EHANDLE_INDEX || (index > 0 && index <= playerhelpers->GetMaxClients()))
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!IsEntityIndexInRange(index))
 | 
			
		||||
	{
 | 
			
		||||
		g_pSM->LogError(myself, "SDKHooks::OnEntitySpawned - Got entity index out of range (%d)", index);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	HandleEntitySpawned(pEntity, index, ref);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef GAMEDESC_CAN_CHANGE
 | 
			
		||||
const char *SDKHooks::Hook_GetGameDescription()
 | 
			
		||||
{
 | 
			
		||||
@ -1791,6 +1816,32 @@ void SDKHooks::HandleEntityCreated(CBaseEntity *pEntity, int index, cell_t ref)
 | 
			
		||||
	m_EntityCache[index] = ref;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDKHooks::HandleEntitySpawned(CBaseEntity *pEntity, int index, cell_t ref)
 | 
			
		||||
{
 | 
			
		||||
	if (g_pOnEntitySpawned->GetFunctionCount() || m_EntListeners.size())
 | 
			
		||||
	{
 | 
			
		||||
		cell_t bcompatRef = gamehelpers->EntityToBCompatRef(pEntity);
 | 
			
		||||
		const char *pName = gamehelpers->GetEntityClassname(pEntity);
 | 
			
		||||
		if (!pName)
 | 
			
		||||
			pName = "";
 | 
			
		||||
 | 
			
		||||
		// Send OnEntitySpawned to SM listeners
 | 
			
		||||
		for (SourceHook::List<ISMEntityListener *>::iterator iter = m_EntListeners.begin(); iter != m_EntListeners.end(); iter++)
 | 
			
		||||
		{
 | 
			
		||||
			ISMEntityListener *pListener = (*iter);
 | 
			
		||||
			pListener->OnEntitySpawned(pEntity, pName);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Call OnEntitySpawned forward
 | 
			
		||||
		if (g_pOnEntitySpawned->GetFunctionCount())
 | 
			
		||||
		{
 | 
			
		||||
			g_pOnEntitySpawned->PushCell(bcompatRef);
 | 
			
		||||
			g_pOnEntitySpawned->PushString(pName);
 | 
			
		||||
			g_pOnEntitySpawned->Execute(NULL);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SDKHooks::HandleEntityDeleted(CBaseEntity *pEntity)
 | 
			
		||||
{
 | 
			
		||||
	cell_t bcompatRef = gamehelpers->EntityToBCompatRef(pEntity);
 | 
			
		||||
 | 
			
		||||
@ -238,6 +238,7 @@ public:  // IFeatureProvider
 | 
			
		||||
 | 
			
		||||
public:  // IEntityListener
 | 
			
		||||
	virtual void OnEntityCreated(CBaseEntity *pEntity);
 | 
			
		||||
	virtual void OnEntitySpawned(CBaseEntity *pEntity);
 | 
			
		||||
	virtual void OnEntityDeleted(CBaseEntity *pEntity);
 | 
			
		||||
 | 
			
		||||
public:  // IClientListener
 | 
			
		||||
@ -330,6 +331,7 @@ public:
 | 
			
		||||
	
 | 
			
		||||
private:
 | 
			
		||||
	void HandleEntityCreated(CBaseEntity *pEntity, int index, cell_t ref);
 | 
			
		||||
	void HandleEntitySpawned(CBaseEntity *pEntity, int index, cell_t ref);
 | 
			
		||||
	void HandleEntityDeleted(CBaseEntity *pEntity);
 | 
			
		||||
	void Unhook(CBaseEntity *pEntity);
 | 
			
		||||
	void Unhook(IPluginContext *pContext);
 | 
			
		||||
 | 
			
		||||
@ -333,6 +333,14 @@ typeset SDKHookCB
 | 
			
		||||
 */
 | 
			
		||||
forward void OnEntityCreated(int entity, const char[] classname);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * When an entity is spawned
 | 
			
		||||
 *
 | 
			
		||||
 * @param entity        Entity index
 | 
			
		||||
 * @param classname     Class name
 | 
			
		||||
 */
 | 
			
		||||
forward void OnEntitySpawned(int entity, const char[] classname);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * When an entity is destroyed
 | 
			
		||||
 *
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,7 @@
 | 
			
		||||
#include <IShareSys.h>
 | 
			
		||||
 | 
			
		||||
#define SMINTERFACE_SDKHOOKS_NAME		"ISDKHooks"
 | 
			
		||||
#define SMINTERFACE_SDKHOOKS_VERSION	1
 | 
			
		||||
#define SMINTERFACE_SDKHOOKS_VERSION	2
 | 
			
		||||
 | 
			
		||||
class CBaseEntity;
 | 
			
		||||
 | 
			
		||||
@ -71,6 +71,16 @@ namespace SourceMod
 | 
			
		||||
		virtual void OnEntityDestroyed(CBaseEntity *pEntity)
 | 
			
		||||
		{
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/**
 | 
			
		||||
		 * @brief	When an entity is spawned
 | 
			
		||||
		 *
 | 
			
		||||
		 * @param	pEntity		CBaseEntity entity.
 | 
			
		||||
		 * @param	classname	Entity classname.
 | 
			
		||||
		 */
 | 
			
		||||
		virtual void OnEntitySpawned(CBaseEntity *pEntity, const char *classname)
 | 
			
		||||
		{
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user