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();
 | |
| }
 |