forked from UNLOZE/sm-plugins
add SMJSONAPI
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
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);
|
||||
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)
|
||||
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();
|
||||
}
|
||||
Reference in New Issue
Block a user