diff -r 045009f474b1 -r 4ad91ad970ac extensions/sdktools/output.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/extensions/sdktools/output.h Wed Apr 02 01:22:02 2008 +0000
@@ -0,0 +1,176 @@
+/**
+ * vim: set ts=4 :
+ * =============================================================================
+ * SourceMod SDKTools Extension
+ * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
+ * =============================================================================
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, version 3.0, as published by the
+ * Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see .
+ *
+ * As a special exception, AlliedModders LLC gives you permission to link the
+ * code of this program (as well as its derivative works) to "Half-Life 2," the
+ * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
+ * by the Valve Corporation. You must obey the GNU General Public License in
+ * all respects for all other code used. Additionally, AlliedModders LLC grants
+ * this exception to all derivative works. AlliedModders LLC defines further
+ * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
+ * or .
+ *
+ * Version: $Id: output.h 1775 2007-12-06 02:25:35Z faluco $
+ */
+
+#ifndef _INCLUDE_SOURCEMOD_OUTPUT_H_
+#define _INCLUDE_SOURCEMOD_OUTPUT_H_
+
+#include
+#include
+//#include "variant_t.h"
+#include "sh_list.h"
+#include "sh_stack.h"
+#include "sm_trie_tpl.h"
+#include "detours.h"
+
+extern ISourcePawnEngine *spengine;
+
+struct OutputNameStruct;
+
+/**
+ * This is a function specific hook that corresponds to an entity classname
+ * and outputname. There can be many of these for each classname/output combo
+ */
+struct omg_hooks
+{
+ int entity_filter; // if not -1 is an entity signature
+ int entity_index;
+ bool only_once;
+ IPluginFunction *pf;
+ OutputNameStruct *m_parent;
+ bool in_use;
+ bool delete_me;
+};
+
+/**
+ * This represents an output belonging to a specific classname
+ */
+struct OutputNameStruct
+{
+ SourceHook::List hooks;
+ char Name[50];
+};
+
+/**
+ * This represents an entity classname
+ */
+struct ClassNameStruct
+{
+ //Trie mapping outputname to a OutputNameStruct
+ //KTrie OutputList;
+ IBasicTrie *OutputList;
+
+ ClassNameStruct()
+ {
+ OutputList = adtfactory->CreateBasicTrie();
+ }
+
+ ~ClassNameStruct()
+ {
+ OutputList->Destroy();
+ }
+};
+
+class EntityOutputManager : public IPluginsListener
+{
+public:
+ EntityOutputManager()
+ {
+ info_address = NULL;
+ info_callback = NULL;
+ HookCount = 0;
+ is_detoured = false;
+ enabled = false;
+ }
+
+ ~EntityOutputManager()
+ {
+ EntityOutputs->Destroy();
+ ClassNames->Destroy();
+ ShutdownFireEventDetour();
+ }
+
+ void Init()
+ {
+ enabled = CreateFireEventDetour();
+
+ if (!enabled)
+ {
+ return;
+ }
+
+ EntityOutputs = adtfactory->CreateBasicTrie();
+ ClassNames = adtfactory->CreateBasicTrie();
+ }
+
+ bool IsEnabled()
+ {
+ return enabled;
+ }
+
+ void FireEventDetour(void *pOutput, CBaseEntity *pActivator, CBaseEntity *pCaller, float fDelay);
+
+ void OnPluginDestroyed(IPlugin *plugin);
+
+ OutputNameStruct *FindOutputPointer(const char *classname, const char *outputname, bool create);
+
+ void CleanUpHook(omg_hooks *hook);
+
+ omg_hooks *NewHook();
+
+ void OnHookAdded();
+ void OnHookRemoved();
+
+private:
+ bool enabled;
+
+ // Patch/unpatch the server dll
+ void InitFireEventDetour();
+ void ShutdownFireEventDetour();
+ bool is_detoured;
+
+ //These create/delete the allocated memory and write into it
+ bool CreateFireEventDetour();
+ void DeleteFireEventDetour();
+
+ const char *FindOutputName(void *pOutput, CBaseEntity *pCaller);
+ edict_t *BaseHandleToEdict(CBaseHandle &hndl);
+
+ //Maps CEntityOutput * to a OutputNameStruct
+ IBasicTrie *EntityOutputs;
+ // Maps classname to a ClassNameStruct
+ IBasicTrie *ClassNames;
+
+ SourceHook::CStack FreeHooks; //Stores hook pointers to avoid calls to new
+
+ int HookCount;
+
+ patch_t info_restore;
+ void *info_address;
+ void *info_callback;
+};
+
+void TempDetour(void *pOutput, CBaseEntity *pActivator, CBaseEntity *pCaller, float fDelay);
+
+extern EntityOutputManager g_OutputManager;
+
+extern sp_nativeinfo_t g_EntOutputNatives[];
+
+#endif //_INCLUDE_SOURCEMOD_OUTPUT_H_