163 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
static KeyValues g_Config;
 | 
						|
 | 
						|
bool GameEvents_Init()
 | 
						|
{
 | 
						|
	char sGame[32];
 | 
						|
	GetGameFolderName(sGame, sizeof(sGame));
 | 
						|
 | 
						|
	char sConfigFile[PLATFORM_MAX_PATH];
 | 
						|
	BuildPath(Path_SM, sConfigFile, sizeof(sConfigFile), "configs/Events.%s.cfg", sGame);
 | 
						|
	if(!FileExists(sConfigFile))
 | 
						|
	{
 | 
						|
		SetFailState("Could not find config: \"%s\"", sConfigFile);
 | 
						|
	}
 | 
						|
 | 
						|
	g_Config = new KeyValues("allevents");
 | 
						|
	if(!g_Config.ImportFromFile(sConfigFile))
 | 
						|
	{
 | 
						|
		delete g_Config;
 | 
						|
		SetFailState("ImportFromFile() failed!");
 | 
						|
	}
 | 
						|
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
static void GameEvents_OnHook(Event event, const char[] name, bool dontBroadcast)
 | 
						|
{
 | 
						|
	static char sEventName[32];
 | 
						|
	event.GetName(sEventName, sizeof(sEventName));
 | 
						|
 | 
						|
	g_Config.JumpToKey(sEventName);
 | 
						|
 | 
						|
	JSONObject jEvent = new JSONObject();
 | 
						|
	jEvent.SetString("name", sEventName);
 | 
						|
 | 
						|
	JSONObject jEventData = new JSONObject();
 | 
						|
 | 
						|
	if(g_Config.GotoFirstSubKey(false))
 | 
						|
	{
 | 
						|
		do
 | 
						|
		{
 | 
						|
			static char sKey[32];
 | 
						|
			static char sType[8];
 | 
						|
 | 
						|
			g_Config.GetSectionName(sKey, sizeof(sKey));
 | 
						|
			g_Config.GetString(NULL_STRING, sType, sizeof(sType));
 | 
						|
 | 
						|
			if(StrEqual(sKey, "_hooked"))
 | 
						|
				continue;
 | 
						|
 | 
						|
			if(StrEqual(sType, "short") || StrEqual(sType, "long") || StrEqual(sType, "byte"))
 | 
						|
			{
 | 
						|
				int iValue = event.GetInt(sKey);
 | 
						|
				jEventData.SetInt(sKey, iValue);
 | 
						|
			}
 | 
						|
			else if(StrEqual(sType, "float"))
 | 
						|
			{
 | 
						|
				float fValue = event.GetFloat(sKey);
 | 
						|
				jEventData.SetFloat(sKey, fValue);
 | 
						|
			}
 | 
						|
			else if(StrEqual(sType, "bool"))
 | 
						|
			{
 | 
						|
				bool bValue = event.GetBool(sKey);
 | 
						|
				jEventData.SetBool(sKey, bValue);
 | 
						|
			}
 | 
						|
			else if(StrEqual(sType, "string"))
 | 
						|
			{
 | 
						|
				static char sValue[1024];
 | 
						|
				event.GetString(sKey, sValue, sizeof(sValue));
 | 
						|
				jEventData.SetString(sKey, sValue);
 | 
						|
			}
 | 
						|
		} while(g_Config.GotoNextKey(false));
 | 
						|
	}
 | 
						|
	g_Config.Rewind();
 | 
						|
 | 
						|
	jEvent.Set("data", jEventData);
 | 
						|
 | 
						|
	Subscribe_GameEvents_Publish(sEventName, jEvent);
 | 
						|
}
 | 
						|
 | 
						|
int GameEvents_Hook(const char[] sEventName)
 | 
						|
{
 | 
						|
	if(!g_Config.JumpToKey(sEventName))
 | 
						|
		return -1;
 | 
						|
 | 
						|
	int Hooked = g_Config.GetNum("_hooked", 0);
 | 
						|
	if(Hooked)
 | 
						|
	{
 | 
						|
		g_Config.SetNum("_hooked", Hooked + 1);
 | 
						|
		g_Config.Rewind();
 | 
						|
		return Hooked + 1;
 | 
						|
	}
 | 
						|
 | 
						|
	Hooked = HookEventEx(sEventName, GameEvents_OnHook, EventHookMode_Post);
 | 
						|
	if(Hooked)
 | 
						|
		g_Config.SetNum("_hooked", 1);
 | 
						|
 | 
						|
	g_Config.Rewind();
 | 
						|
	return Hooked ? 1 : -1;
 | 
						|
}
 | 
						|
 | 
						|
int GameEvents_Unhook(const char[] sEventName)
 | 
						|
{
 | 
						|
	if(!g_Config.JumpToKey(sEventName))
 | 
						|
		return -1;
 | 
						|
 | 
						|
	int Hooked = g_Config.GetNum("_hooked", 0);
 | 
						|
	if(!Hooked)
 | 
						|
	{
 | 
						|
		g_Config.Rewind();
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	if(Hooked == 1)
 | 
						|
		UnhookEvent(sEventName, GameEvents_OnHook, EventHookMode_Post);
 | 
						|
 | 
						|
	g_Config.SetNum("_hooked", Hooked - 1);
 | 
						|
 | 
						|
	g_Config.Rewind();
 | 
						|
	return Hooked - 1;
 | 
						|
}
 | 
						|
 | 
						|
stock void GameEvents_HookAll()
 | 
						|
{
 | 
						|
	g_Config.GotoFirstSubKey(false);
 | 
						|
 | 
						|
	do
 | 
						|
	{
 | 
						|
		static char sKey[32];
 | 
						|
		g_Config.GetSectionName(sKey, sizeof(sKey));
 | 
						|
 | 
						|
		int Hooked = g_Config.GetNum("_hooked", 0);
 | 
						|
		if(!Hooked)
 | 
						|
		{
 | 
						|
			if(HookEventEx(sKey, GameEvents_OnHook, EventHookMode_Post))
 | 
						|
				g_Config.SetNum("_hooked", 1);
 | 
						|
		}
 | 
						|
		else
 | 
						|
			g_Config.SetNum("_hooked", Hooked + 1);
 | 
						|
	} while(g_Config.GotoNextKey(true));
 | 
						|
 | 
						|
	g_Config.Rewind();
 | 
						|
}
 | 
						|
 | 
						|
stock void GameEvents_UnhookAll()
 | 
						|
{
 | 
						|
	g_Config.GotoFirstSubKey(false);
 | 
						|
 | 
						|
	do
 | 
						|
	{
 | 
						|
		static char sKey[32];
 | 
						|
		g_Config.GetSectionName(sKey, sizeof(sKey));
 | 
						|
 | 
						|
		int Hooked = g_Config.GetNum("_hooked", 0);
 | 
						|
		if(Hooked)
 | 
						|
		{
 | 
						|
			UnhookEvent(sKey, GameEvents_OnHook, EventHookMode_Post);
 | 
						|
			g_Config.SetNum("_hooked", 0);
 | 
						|
		}
 | 
						|
	} while(g_Config.GotoNextKey(true));
 | 
						|
 | 
						|
	g_Config.Rewind();
 | 
						|
}
 |