So yeah, like the title says I want to block some events from happening, I tried calling FireEvent function from IGameEventManager2 by getting the interface of IGameEventManager2 like this:
PHP Code:
SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent *, bool);
.....
bool CSample::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool late)
{
// Getting dem interfaces!
GET_V_IFACE_CURRENT(GetEngineFactory, g_pGameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
if (!g_pGameEventManager)
rootconsole->ConsolePrint("IGameEventManager2 interface was not found.");
SH_ADD_HOOK(IGameEventManager2, FireEvent, g_pGameEventManager, SH_STATIC(Hook_OnFireEvent), true);
// g_pGameEventManager->AddListener(this, "player_death", true); This is not needed since I want to block the actual event...
return true;
}
void CSample::SDK_OnUnload()
{
SH_REMOVE_HOOK(IGameEventManager2, FireEvent, g_pGameEventManager, SH_STATIC(Hook_OnFireEvent), true);
}
bool Hook_OnFireEvent(IGameEvent *event, bool dontBroadcast)
{
int client, attacker;
const char *pEventName = event->GetName();
if (strcmp(pEventName, "player_death") == 0)
{
client = event->GetInt();
attacker = event->GetInt();
rootconsole->ConsolePrint("[DEBUG] Event: 'player_death' Fired.");
rootconsole->ConsolePrint("[DEBUG] client='%d', attacker='%d'.", client, attacker);
}
RETURN_META_VALUE(MRES_IGNORED, true);
}
but this doesnt seem to work, why?
EDIT: I know that this example show the 'post' hook which has nothing to do with blocking event, basically I want to block and call event in the same time, so I'll call the pre and post FireEvent. and btw this is for CS:GO.
EDIT 2: Okay, so after looking at the EventManager from Sourcemod core (which I dunno why I didnt look before lol, thought it doesnt exist) I figured out the way it works, so basically you have to add a listener.
It worked just fine for the pre-event hook, however it didnt work for the post-event hook and it crashes the server on map load without any error
PHP Code:
#include "main.h"
CSample g_Extension;
SMEXT_LINK(&g_Extension);
SH_DECL_HOOK2(IGameEventManager2, FireEvent, SH_NOATTRIB, 0, bool, IGameEvent *, bool);
IGameEventManager2 *g_pGameEventManager = 0;
void CSample::SDK_OnAllLoaded()
{
SH_ADD_HOOK(IGameEventManager2, FireEvent, g_pGameEventManager, SH_STATIC(Hook_OnPreFireEvent), false); // This works just fine
// SH_ADD_HOOK(IGameEventManager2, FireEvent, g_pGameEventManager, SH_STATIC(Hook_OnFireEvent), true); // This crashes the server on map load without any error...
g_pGameEventManager->AddListener(this, "player_death", true);
}
void CSample::SDK_OnUnload()
{
SH_REMOVE_HOOK(IGameEventManager2, FireEvent, g_pGameEventManager, SH_STATIC(Hook_OnPreFireEvent), false);
// SH_REMOVE_HOOK(IGameEventManager2, FireEvent, g_pGameEventManager, SH_STATIC(Hook_OnFireEvent), true);
g_pGameEventManager->RemoveListener(this);
}
bool CSample::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlen, bool late)
{
// Getting dem interfaces!
GET_V_IFACE_CURRENT(GetEngineFactory, g_pGameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2);
if (!g_pGameEventManager)
rootconsole->ConsolePrint("IGameEventManager2 interface was not found.");
return true;
}
void CSample::FireGameEvent(IGameEvent *event)
{
}
int CSample::GetEventDebugID()
{
return EVENT_DEBUG_ID_INIT;
}
bool Hook_OnPreFireEvent(IGameEvent *event, bool dontBroadcast)
{
if (!event)
{
RETURN_META_VALUE(MRES_IGNORED, false);
}
int client, attacker;
const char *pEventName = event->GetName();
if (strcmp(pEventName, "player_death") == 0)
{
client = event->GetInt();
attacker = event->GetInt();
rootconsole->ConsolePrint("[DEBUG] Pre-Event: 'player_death' Fired.");
rootconsole->ConsolePrint("[DEBUG] client='%d', attacker='%d'.", client, attacker);
}
RETURN_META_VALUE(MRES_IGNORED, true);
}
bool Hook_OnFireEvent(IGameEvent *event, bool dontBroadcast)
{
if (!event)
{
RETURN_META_VALUE(MRES_IGNORED, false);
}
int client, attacker;
const char *pEventName = event->GetName();
if (strcmp(pEventName, "player_death") == 0)
{
client = event->GetInt();
attacker = event->GetInt();
rootconsole->ConsolePrint("[DEBUG] Post-Event: 'player_death' Fired.");
rootconsole->ConsolePrint("[DEBUG] client='%d', attacker='%d'.", client, attacker);
}
RETURN_META_VALUE(MRES_IGNORED, true);
}