<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.alliedmods.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Showdax</id>
	<title>AlliedModders Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.alliedmods.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Showdax"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/Showdax"/>
	<updated>2026-05-07T04:15:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Metamod:Source_Development&amp;diff=4903</id>
		<title>Metamod:Source Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Metamod:Source_Development&amp;diff=4903"/>
		<updated>2007-07-10T00:37:43Z</updated>

		<summary type="html">&lt;p&gt;Showdax: Restored full page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This article is an introduction to [[SourceMM]] coding.  &lt;br /&gt;
&lt;br /&gt;
{{qnotice|The majority of this documentation should be merged or moved into an article about [[SourceHook]].}}&lt;br /&gt;
&lt;br /&gt;
{{qnotice|This article probably needs some better formatting.}}&lt;br /&gt;
&lt;br /&gt;
=Requirements=&lt;br /&gt;
You must have the Valve [[HL2SDK]], available from your [[Steam]] Menu. For Windows, you must have [[Microsoft Visual Studio]] 7.0 or 7.1 (we have not tried 6.0). For [[Linux]], Valve requires you use at least [[GCC]] 3.4.1. You should also have a copy of the [[Metamod:Source]] source code, available [http://www.sourcemm.net/ here] (sourcemm/sourcehook and sourcemm/sourcemm).&lt;br /&gt;
&lt;br /&gt;
For [[Microsoft Visual Studio]], you should make sure that you have the following HL2SDK paths in your include settings (Tools -&amp;gt; Options -&amp;gt; Projects, VC++ Directories, Include Files), as well as the &amp;quot;sourcehook&amp;quot; and &amp;quot;sourcemm&amp;quot; folders:&lt;br /&gt;
*dlls&lt;br /&gt;
*public&lt;br /&gt;
*public\vstdlib&lt;br /&gt;
*public\tier1&lt;br /&gt;
*public\tier0&lt;br /&gt;
*public\engine&lt;br /&gt;
*public\dlls&lt;br /&gt;
*tier1&lt;br /&gt;
*lib\public (this should be in your Library Paths!)&lt;br /&gt;
&lt;br /&gt;
=Plugin API=&lt;br /&gt;
In order to write a plugin, you must implement the ISmmPlugin interface, similar to IServerPluginCallbacks. Each Metamod:Source release has a minimum required interface version and a current version. The minimum version is guaranteed to be upward compatible to the current, however, it may be lacking some features.&lt;br /&gt;
&lt;br /&gt;
Once you've implemented the interface, you must also have a global singleton of your plugin available. There are a few macros to assist you in properly exposing the interface as a DLL and setting up the API states.&lt;br /&gt;
&lt;br /&gt;
*{{bcode|PLUGIN_GLOBALVARS}}() - Place in header. Declares the global variables that some API calls require (such as g_SHPtr and g_PLAPI).&lt;br /&gt;
*{{bcode|PLUGIN_EXPOSE}}(class, singleton) - Place in .cpp file. Declares the external CreateInterface function which exposes the API.&lt;br /&gt;
*{{bcode|PLUGIN_SAVEVARS}}() - Use first thing in ISmmPlugin::Load(), saves the global variables sent from SourceMM.&lt;br /&gt;
&lt;br /&gt;
The actual plugin API you must implement as of this writing is version 004. To see a description of each of the functions, you can view the doxygen information here. Note that the Load, Unload, Pause, and Unpause functions allow you to refuse the action and copy an error message (you should check to make sure error is not NULL - it can be).&lt;br /&gt;
&lt;br /&gt;
=SourceHook (Hooking)=&lt;br /&gt;
SourceHook is the engine used to intercept function calls, much like Metamod. The difference with SourceHook is that it can intercept any virtual function in any class that, at compile time, you have the header for. SourceHook has the following steps of operation:&lt;br /&gt;
&lt;br /&gt;
* Declare the prototype of the function you are going to hook. This generates compile-time code that is able to pinpoint exactly how to go about hooking the function.&lt;br /&gt;
* Hook the function - as a member function of another class or a regular static function.&lt;br /&gt;
* Before the hooked function is called, all of the &amp;quot;pre&amp;quot; hook handlers attached to it are called. Each hook can set a special flag, the highest of which is chosen as a final operation. This flag specifies whether the original function should be called or not.&lt;br /&gt;
* Once all the hooks have been called, SourceHook decides whether to call the original function. Another set of hooks are called directly after, called &amp;quot;post&amp;quot; hook handlers. You can specify whether each hook is a post or pre hook - it simply changes whether it's called before or after the original call is made.&lt;br /&gt;
* After you are done using a hook, you can safely remove it.&lt;br /&gt;
&lt;br /&gt;
For example, let's say you wanted to intercept log messages in VEngineServer. Observe the prototype:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virtual void		LogPrint( const char *msg ) = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This is a virtual, public function of a class we have an instance of (let's say in IVEngineServer *m_Engine) and that we have the header for. It can be intercepted.&lt;br /&gt;
&lt;br /&gt;
The first step is to figure out how to declare its prototype to SourceHook. This function is void, and has one parameter. The declaration macro follows these formats:&lt;br /&gt;
&lt;br /&gt;
*{{bcode|SH_DECL_HOOK}}n - n is the number of parameters&lt;br /&gt;
**The parameters are: Class name, member function name, attributes, overloaded?, the return type, and a list of the parameter types.&lt;br /&gt;
*{{bcode|SH_DECL_HOOKn_void}} - n is the number of parameters&lt;br /&gt;
**_void specifies that the function does not return a value. The format is the same as above except the &amp;quot;return type&amp;quot; parameter is missing.&lt;br /&gt;
*'''Note:''' Not covered here are the SH_DECL_HOOKn[_void]_vafmt hooks. These can hook string-formattable variable argument lists. You do not pass the string format or ellipses parameter. SourceHook will automatically format the string for your hook.&lt;br /&gt;
&lt;br /&gt;
Our macro will look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SH_DECL_HOOK1_void(IVEngineServer, LogPrint, SH_NOATTRIB, 0, const char *);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This line must appear outside of a function. It means &amp;quot;Declare a hook prototype for LogPrint in IVEngineServer, which is a void function that has one parameter, which is a const char *&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Next we must actually hook the function. You can do this wherever you want to begin the interception. The two macros for hooking look like this:&lt;br /&gt;
&lt;br /&gt;
*{{bcode|SH_ADD_HOOK_STATICFUNC}}(class, memberfunction, instance_pointer, handler, post) Hooks a virtual function to a static/global function.&lt;br /&gt;
**class - The name of the class&lt;br /&gt;
**memberfunction - The name of the member function&lt;br /&gt;
**instance - A pointer to an instance of the class&lt;br /&gt;
**handler - Your function that will be called on hooking&lt;br /&gt;
**post - true for post operation, false for pre operation&lt;br /&gt;
*{{bcode|SH_ADD_HOOK_MEMFUNC}}(class, memberfunction, instance, myinstance, myfunction, post) Hooks a virtual function to a member function of another class.&lt;br /&gt;
**class - The name of the class&lt;br /&gt;
**memberfunction - The name of the member function&lt;br /&gt;
**instance - An pointer to an instance of the class&lt;br /&gt;
**myinstance - A pointer to an instance of the class that has the handler member function&lt;br /&gt;
**myfunction - The name of the handler member function in your class&lt;br /&gt;
**post - true for post operation, false for pre-operation&lt;br /&gt;
&lt;br /&gt;
Let's continue with the example. To hook LogPrint to a function in your class, CMetaHooks (instance, g_MetaHooks), you would use:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SH_ADD_HOOK_MEMFUNC(IVEngineServer, LogPrint, m_Engine, &amp;amp;g_MetaHooks, &amp;amp;CMetaHooks::LogPrint, false);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
To remove the hook (either once it will no longer be unused, or at unload time):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SH_REMOVE_HOOK_MEMFUNC(IVEngineServer, LogPrint, m_Engine &amp;amp;g_MetaHooks, &amp;amp;CMetaHooks::LogPrint, false);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now, your function contents will look something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void CMetaHooks::LogPrint(const char *msg)&lt;br /&gt;
{&lt;br /&gt;
	//Code here&lt;br /&gt;
	RETURN_META(MRES_IGNORED);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note this return statement. This style of returning is similar to Metamod's, where you can set four different flags to indicate how you would like SourceHook to proceed. In Metamod, this return statement was required. In SourceMM, it is only required if you wish to set a return state other than MRES_IGNORED.&lt;br /&gt;
&lt;br /&gt;
*{{bcode|MRES_IGNORED}} - No states were changed, act as though nothing happened. Original function is still called.&lt;br /&gt;
*{{bcode|MRES_HANDLED}} - Something changed, but the original function was still called. This can be used to tell another plugin that you did something.&lt;br /&gt;
*{{bcode|MRES_OVERRIDE}} - The original function will still be called, but your return value will override whatever it returns.&lt;br /&gt;
*{{bcode|MRES_SUPERCEDE}} - The original function is not called, and your return value will be what is returned to the caller.&lt;br /&gt;
&lt;br /&gt;
Note, that if you need to return a value, there is another macro. For example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RETURN_META_VALUE(MRES_SUPERCEDE, value);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This is required for non-void functions, athough the return value is ignored using MRES_IGNORED or MRES_HANDLED.&lt;br /&gt;
&lt;br /&gt;
Alternatively, you can hook to static member functions which has a slightly easier syntax. The DECL_HOOK line does not change. To add the hook:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SH_ADD_HOOK_STATICFUNC(IVEngineServer, LogPrint, m_Engine, LogPrint_handler, false);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Removing the hook:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SH_REMOVE_HOOK_STATICFUNC(IVEngineServer, LogPrint, m_Engine, LogPrint_handler, false);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Declaring the handler:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void LogPrint_handler(const char *msg)&lt;br /&gt;
{&lt;br /&gt;
	//Code here&lt;br /&gt;
	RETURN_META(MRES_IGNORED);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note that vafmt functions hooked with SourceHook assume that the vafmt is for a printf style string, and that the vafmt occurs at the end. When setting the parameters, you do not include the '...' notation, and SourceHook will vafmt the input string for you (meaning you also don't specify ... in your hooked function).&lt;br /&gt;
&lt;br /&gt;
=Calling Original Functions=&lt;br /&gt;
Often it will be necessary for you to call a function that's hooked, however, you don't want the hooks to be included in the calling. For example, if you want to entirely supercede a function and call it yourself from within a hook. To do this, you must request a call class. This is similar to MDLL_x() from Metamod for Half-Life 1.&lt;br /&gt;
&lt;br /&gt;
Continuing with the above example, let's say we want to supercede the original call and log a different message. Assume we also have the pointer m_Engine which is a &amp;lt;tt&amp;gt;IVEngineServer *&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
SourceHook::CallClass&amp;lt;IVEngineServer&amp;gt; *Engine_CC = SH_GET_CALLCLASS(m_Engine);&lt;br /&gt;
&lt;br /&gt;
SH_CALL(Engine_CC, &amp;amp;IVEngineServer::LogPrint)(&amp;quot;This is a log message!\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
//When you are done with the pointer..&lt;br /&gt;
SH_RELEASE_CALLCLASS(Engine_CC);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Because of the complex nature of inheritance, instance pointers, and vtables, this syntax can be quite daunting. You may wish to make macros for specific functions or classes you use quite often, to reduce the amount of typing. For example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
//Assuming you have a global pointer g_Engine...&lt;br /&gt;
#define ENGCALL(func) SH_CALL(g_Engine, &amp;amp;IVEngineServer::func)&lt;br /&gt;
&lt;br /&gt;
//Then you can do:&lt;br /&gt;
ENGCALL(LogPrint)(&amp;quot;This is a test!&amp;quot;);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The syntax of calling class construction is:&lt;br /&gt;
*&amp;lt;tt&amp;gt;SourceHook::CallClass&amp;lt;class&amp;gt; *ptr = SH_GET_CALLCLASS(instance);&amp;lt;/tt&amp;gt;&lt;br /&gt;
**Returns an object which allows you to call the original function. Class is the name of the class which is the target, instance is an instance of that class.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SH_CALL(cc_ptr, &amp;amp;class::func)([params])&amp;lt;/tt&amp;gt;&lt;br /&gt;
**Pass the pointer returned from SH_GET_CALLCLASS as cc_ptr. The target function you call must be passed as a pointer-to-member-function, which takes the form &amp;amp;Class::Function as seen in previous examples. You must then complete the function call by adding a parenthetical parameter expression, even for void functions, which would be ().&lt;br /&gt;
&lt;br /&gt;
=Other Macros=&lt;br /&gt;
All of the macros take g_PLAPI as the first parameter. For more information on this, see the global variables section.&lt;br /&gt;
&lt;br /&gt;
*{{bcode|META_CONPRINT}}(const char *msg)&lt;br /&gt;
*{{bcode|META_CONPRINTF}}(const char *fmt, ...)&lt;br /&gt;
**These two functions are recommended over Msg() for printing to the server console. Msg() does not relay commands back through rcon, and as of this writing Valve does not expose the function which does. To be able to display text through the rcon console (much like HL1), you should use these functions. If SourceMM is unable to extract the function properly, it will automatically default to Msg.&lt;br /&gt;
*{{bcode|META_LOG}}(g_PLAPI, const char *msg, ...)&lt;br /&gt;
**Logs a message through IVEngineServer::LogPrint(). A newline is automatically added, and msg is formatted as a sprintf() style string. Logging is done by the game server and can be enabled by adding ''log on'' to server.cfg or typing it in the console. The log files are found in the logs directory of the particular MOD you are running.&lt;br /&gt;
*{{bcode|META_REGCVAR}}(var)&lt;br /&gt;
**Registers a ConCommandBase pointer through SourceMM. The correct way to use this is to create an IConCommandBaseAccessor, and inside RegisterConCommandBase, call the macro on the given ConComandBase. This will ensure that SourceMM correctly detects and unloads your cvars and concommands at the appopriate time. Otherwise, unloading your plugin will cause a crash.&lt;br /&gt;
*{{bcode|META_UNREGCVAR}}(var)&lt;br /&gt;
**Unregisters a ConCommandBase pointer. This is not needed if you have set up your IConCommandBaseAccessor correctly (and called ConCommandBaseMngr::OneTimeInit()).&lt;br /&gt;
&lt;br /&gt;
=Events System=&lt;br /&gt;
The Events System is based on IMetamodListener. By implementing the IMetamodListener class and using g_SMAPI-&amp;gt;AddListener, you can watch for certain, low-traffic events. These events are split into three categories:&lt;br /&gt;
&lt;br /&gt;
*Plugin Events let you listen for plugin pauses and unloads. This is important if you're relying on information from another plugin, as you can handle cases where a live plugin has become invalid.&lt;br /&gt;
*Game Events are simple events that SourceMM is already hooking and makes available. These are LevelShutdown and LevelInit right now.&lt;br /&gt;
*Query Events occur when a factory is used. The four main factories (Engine, GameDLL, FileSystem, and Physics) are all overridable. You should simply return a non-NULL result to override, and fill the return code with IFACE_OK if available. There is no way to handle the case of two plugins overriding right now. The final factory is the Metamod Factory, which is the factory that Metamod:Source adds to the runtime space for plugins. By default, it only contains the interfaces for the PluginManager and SourceHook. Plugins can use this to add new interfaces. Other plugins request these interfaces through g_SMAPI-&amp;gt;MetaFactory().&lt;br /&gt;
&lt;br /&gt;
=Global Variables=&lt;br /&gt;
These global variables are saved by PLUGIN_EXPOSE and PLUGIN_SAVEVARS. They are declared with PLUGIN_GLOBALVARS.&lt;br /&gt;
&lt;br /&gt;
*{{bcode|g_PLAPI}}&lt;br /&gt;
**ISmmPlugin * pointer to your global class singleton.&lt;br /&gt;
*{{bcode|g_PLID}}&lt;br /&gt;
**The internal PluginId of your plugin.&lt;br /&gt;
*{{bcode|g_SHPtr}}&lt;br /&gt;
**The SourceHook::ISourceHook * pointer to SourceHook's interface.&lt;br /&gt;
*{{bcode|g_SMAPI}}&lt;br /&gt;
**The ISmmAPI * pointer to SourceMM's interface.&lt;br /&gt;
&lt;br /&gt;
=Compiling=&lt;br /&gt;
To see more about compiling, see the Sample Plugin Compiling section.&lt;br /&gt;
&lt;br /&gt;
Modifying the default Makefiles for your own projects:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tt&amp;gt;OPT_FLAGS&amp;lt;/tt&amp;gt; - Optimization flags&lt;br /&gt;
*&amp;lt;tt&amp;gt;DEBUG_FLAGS&amp;lt;/tt&amp;gt; - Debug flags&lt;br /&gt;
*&amp;lt;tt&amp;gt;CPP&amp;lt;/tt&amp;gt; - C++ Compiler&lt;br /&gt;
*&amp;lt;tt&amp;gt;OBJECTS&amp;lt;/tt&amp;gt; - List of C++ files to compile&lt;br /&gt;
*&amp;lt;tt&amp;gt;LINK&amp;lt;/tt&amp;gt; - Linker Options&lt;br /&gt;
*&amp;lt;tt&amp;gt;CFLAGS&amp;lt;/tt&amp;gt; - Base Compiler Flags&lt;br /&gt;
*&amp;lt;tt&amp;gt;BINARY&amp;lt;/tt&amp;gt; - Output Binary Name&lt;br /&gt;
&lt;br /&gt;
Makefile commands:&lt;br /&gt;
&lt;br /&gt;
*clean - Cleans all build files&lt;br /&gt;
*debug - Builds debug version&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.1 Changes=&lt;br /&gt;
SourceMM 1.1 changed quite a few things internally, and externally made many breaking changes.&lt;br /&gt;
==Late Loading==&lt;br /&gt;
*ISmmPlugin::Load() has removed the factory list parameter (the factory system was replaced with the event system). Also, a boolean parameter was added, specifying whether the plugin was loaded late or not.&lt;br /&gt;
*ISmmPlugin::Load() is now called BEFORE DLLInit(), rather than after. This means it might not have all information it needs -- for example, IGameEvents won't be parsed yet. You will need to do things like this in ISmmPlugin:AllPluginsLoaded() instead, as it is guaranteed to occur when all DLLs are initialized.&lt;br /&gt;
&lt;br /&gt;
==API Changes==&lt;br /&gt;
*ISmmPlugin now has default functions -- you don't have to implement all of them.&lt;br /&gt;
*SourceHook was modified to use interfaces rather than straight struct pointers. This breaking changes will ensure that future SourceHook modifications do not break older plugins.&lt;br /&gt;
*SourceHook was modified to be re-entrant.&lt;br /&gt;
*SourceHook now has a tiny template library with it. This removes the necessity to link against libstdc++.so.*, which harms binary compatibility across linux distributions.&lt;br /&gt;
*SourceMM's GameDLL code was completely rewritten. It will now work with newer mods much easier, and issues like the DoD:S release will be much easier to deal with (if at all). It also removes a few important speed bottlenecks.&lt;br /&gt;
&lt;br /&gt;
==Event System==&lt;br /&gt;
*An events system was added.  This lets Metamod:Source plugins listen for common internal SourceMM events, as well as intercommunicate primitively.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.2 Changes=&lt;br /&gt;
==Changing Parameters==&lt;br /&gt;
SourceMM 1.2 now supports changing the parameters in a hook chain. For example, say the GameDLL has a function called IGameDLL::PrintString(const char *str). You can hook this, let it continue, but change the &amp;quot;str&amp;quot; parameter passed in to the rest of the hooks and the GameDLL. To do this, use the following macros:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tt&amp;gt;RETURN_META_NEWPARAMS&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;RETURN_META_VALUE_NEWPARAMS&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
class ISomething&lt;br /&gt;
{&lt;br /&gt;
   virtual void Function1(int num) =0;&lt;br /&gt;
   virtual bool Function2(bool what, int hi) =0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void MyHook1(int num)&lt;br /&gt;
{&lt;br /&gt;
   //if num is 0, &lt;br /&gt;
   // we will change the num parameter in the rest of the hooks, and the gamedll, to be 1.&lt;br /&gt;
   if (num == 0)&lt;br /&gt;
       RETURN_META_NEWPARAMS(MRES_IGNORED, &amp;amp;ISomething::Function1, (1))&lt;br /&gt;
   RETURN_META(MRES_SUPERCEDE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool MyHook2(bool what, int hi)&lt;br /&gt;
{&lt;br /&gt;
   //change the &amp;quot;what&amp;quot; and &amp;quot;hi&amp;quot; parameters to be false and 3 respectively&lt;br /&gt;
   //also, return true, but specify that the value is ignored&lt;br /&gt;
   RETURN_META_VALUE_NEWPARAMS(MRES_IGNORED, true, &amp;amp;ISomething::Function2, (false, 3));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Manual Hooks==&lt;br /&gt;
SourceHook also supports manual hooking of functions. This means you must know the virtual table index, the virtual table offset (for polymorphism), and the &amp;quot;this&amp;quot; pointer offset. Luckily, the polymorphic offsets are usually zero. This type of hook is ideal when supporting different ABI, for example, across different gamedlls. The API is almost identical:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;tt&amp;gt;SH_DECL_MANUALHOOKn[_void|_vafamt]&amp;lt;/tt&amp;gt; -&lt;br /&gt;
**Declares the manual hook. A unique name must be given to each manual hook.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SH_[ADD|REMOVE]_MANUALHOOK_[STATIC|MEM]FUNC&amp;lt;/tt&amp;gt; -&lt;br /&gt;
**Adds or removes a static or member function hook on a manually declared hook.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SH_MANUALHOOK_RECONFIGURE&amp;lt;/tt&amp;gt; - &lt;br /&gt;
**Reconfigures the indexes and offsets of a manual hook.&lt;br /&gt;
&lt;br /&gt;
An example is below, using the ISomething class from above.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
SH_DECL_MANUALHOOK2(_M_Function1, 1, 0, 0, bool, bool, int);&lt;br /&gt;
&lt;br /&gt;
void OnLoad(ISomething *pSomething)&lt;br /&gt;
{&lt;br /&gt;
	//we reference the static function by its unique handle we gave it&lt;br /&gt;
	//the parameters are otherwise the same - this pointer, hook handler, and post/non-post&lt;br /&gt;
	SH_ADD_MANUALHOOK_STATICFUNC(_M_Function1, pSomething, MyHook1, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void OnUnload(ISomething *pSomething)&lt;br /&gt;
{&lt;br /&gt;
	SH_REMOVE_MANUALHOOK_STATICFUNC(_M_Function1, pSomething, MyHook1, false);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more examples of the above features, you can look in SourceHook CVS's [http://www.tcwonline.org/cgi-bin/viewcvs.cgi/sourcemm/sourcehook/test/ test suite], which demonstrates a variety of hooking scenarios.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.2.2 Changes=&lt;br /&gt;
==Manual CallClasses==&lt;br /&gt;
SourceMM 1.2.2 adds support for manual callclasses. These can be used to call manually hooked functions without invoking the hook chain. Manual callclasses work just like other callclasses with the exception that the virtual table information must be known when creating them. Here is a quick example of how to create and use them:&lt;br /&gt;
&amp;lt;cpp&amp;gt;// Creating a manual callclass&lt;br /&gt;
SourceHook::ManualCallClass *mcc = SH_GET_CALLCLASS(interfacePtr, sizeof(void*));&lt;br /&gt;
&lt;br /&gt;
// Assuming we have this manual hook&lt;br /&gt;
SH_DECL_MANUALHOOK0_void(Some_Hook, 1, 0, 0);&lt;br /&gt;
&lt;br /&gt;
// We can call the original function like so&lt;br /&gt;
SH_MCALL(mcc, Some_Hook)(); &lt;br /&gt;
&lt;br /&gt;
// And when you are done with the pointer, you release the callclass like any other&lt;br /&gt;
SH_RELEASE_CALLCLASS(mcc);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is also possible to call a function without having a hook declaration first. In order to this, you need a MFP (member function pointer) that corresponds to the function you wish to call. The class does not matter, but SourceHook::EmptyClass can be used for this purpose. For example, if the function takes two parameters (a const char * and and bool) and returns an int, you would do the following:&lt;br /&gt;
&amp;lt;cpp&amp;gt;// Member function pointer typedef&lt;br /&gt;
typedef int (SourceHook::EmptyClass::*MFP_MyFunc)(const char *, bool);&lt;br /&gt;
&lt;br /&gt;
// Now to call the function, you do this&lt;br /&gt;
int ret = SH_MCALL2(mcc, MFP_MyFunc(), 1, 0, 0)(&amp;quot;hello&amp;quot;, true);&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.2.3 Changes=&lt;br /&gt;
==Parameter Changes for Manual Hooks==&lt;br /&gt;
SourceMM 1.2.3 adds support for changing parameters in manually hooked functions with &amp;lt;tt&amp;gt;RETURN_META_(VALUE_)MNEWPARAMS&amp;lt;/tt&amp;gt;. It is mostly the same as its non-manual counterpart except that it takes the unique name given when the manual hook was declared instead of a member function pointer. Here is an example using ISomething from above:&lt;br /&gt;
&amp;lt;cpp&amp;gt;SH_DECL_MANUALHOOK2(_M_Function2, 2, 0, 0, bool, bool, int);&lt;br /&gt;
&lt;br /&gt;
void OnLoad(ISomething *pSomething)&lt;br /&gt;
{&lt;br /&gt;
	SH_ADD_MANUALHOOK_STATICFUNC(_M_Function2, pSomething, MyHook2, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
bool MyHook2(bool what, int hi)&lt;br /&gt;
{&lt;br /&gt;
   // Change the &amp;quot;what&amp;quot; and &amp;quot;hi&amp;quot; parameters to be false and 3 respectively&lt;br /&gt;
   RETURN_META_VALUE_MNEWPARAMS(MRES_SUPERCEDE, true, _M_Function2, (false, 3));&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.3 Changes=&lt;br /&gt;
==Returning References==&lt;br /&gt;
SourceMM 1.3 integrates SourceHook v4.6, which adds support for functions returning references.  Luckily, this change is both backwards compatible and is transparent to the already existing macros.  Thus, the code below is now valid.  Note that if you don't want to actually return any reference, you can opt to use the new macro &amp;lt;tt&amp;gt;RETURN_META_NOREF&amp;lt;/tt&amp;gt; instead.&lt;br /&gt;
&amp;lt;cpp&amp;gt;class Interface&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
     virtual int &amp;amp;GetMyInt() = 0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
SH_DECL_HOOK0(Interface, GetMyInt, SH_NOATTRIB, 0, int &amp;amp;);&lt;br /&gt;
&lt;br /&gt;
int &amp;amp;Hook_GetMyInt()&lt;br /&gt;
{&lt;br /&gt;
     static int gaben = 5;&lt;br /&gt;
     RETURN_META_VALUE(MRES_SUPERCEDE, gaben);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int &amp;amp;Hook_GetMyInt2()&lt;br /&gt;
{&lt;br /&gt;
     RETURN_META_NOREF(MRES_IGNORED, int &amp;amp;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void AddHook(Interface *pFace)&lt;br /&gt;
{&lt;br /&gt;
     SH_ADDHOOK_STATICFUNC(Interface, GetMyInt, pFace, Hook_GetMyInt, false);&lt;br /&gt;
     SH_ADDHOOK_STATICFUNC(Interface, GetMyInt, pFace, Hook_GetMyInt2, true);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interface Searching==&lt;br /&gt;
Yet another method of searching interfaces, &amp;lt;tt&amp;gt;ISmmAPI::VInterfaceMatch()&amp;lt;/tt&amp;gt;, is now available.  This simplified version corrects the design flaw in InterfaceSearch() whereby passing an unmodified INTERFACEVERSION string would only search interfaces later than or equal to that version.  For example, &amp;lt;tt&amp;gt;INTERFACEVERSION_SERVERGAMEDLL&amp;lt;/tt&amp;gt; being &amp;quot;ServerGameDLL005&amp;quot; would not find a GameDLL using ServerGameDLL004.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;VInterfaceMatch()&amp;lt;/tt&amp;gt; removes the &amp;quot;max&amp;quot; parameter from &amp;lt;tt&amp;gt;InterfaceSearch()&amp;lt;/tt&amp;gt; and adds an optional &amp;quot;chop&amp;quot; parameter, which specifices whether or not the interface should be searched from the beginning (default) or from the current version.&lt;br /&gt;
&lt;br /&gt;
==Compiler Support==&lt;br /&gt;
Microsoft Visual Studio 2005 is now fully supported, as are versions of GCC up to 4.1.&lt;br /&gt;
&lt;br /&gt;
=1.4 Changes=&lt;br /&gt;
==VSP Interface Hooking==&lt;br /&gt;
SourceMM 1.4 adds an API for hooking the [[Valve Server Plugin]] plugin interface.  This might be useful for querying client convars if a game uses an interface version earlier than &amp;lt;tt&amp;gt;ServerGameDLL006&amp;lt;/tt&amp;gt;.  Another potential use is knowing when a user's Steam ID has been validated by hooking &amp;lt;tt&amp;gt;IServerPluginCallbacks::NetworkIDValidated()&amp;lt;/tt&amp;gt;.  This is demonstrated below:&lt;br /&gt;
&amp;lt;cpp&amp;gt;SH_DECL_HOOK2(IServerPluginCallbacks, NetworkIDValidated, SH_NOATTRIB, 0, PLUGIN_RESULT, const char *, const char *);&lt;br /&gt;
&lt;br /&gt;
bool Plugin::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)&lt;br /&gt;
{&lt;br /&gt;
    ismm-&amp;gt;EnableVSPListener();&lt;br /&gt;
    ismm-&amp;gt;AddListener(this, this);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void Plugin::OnVSPListening(IServerPluginCallbacks *iface)&lt;br /&gt;
{&lt;br /&gt;
    SH_ADD_HOOK_MEMFUNC(IServerPluginCallbacks, NetworkIDValidated, iface, &amp;amp;g_Plugin, &amp;amp;Plugin::NetworkIDValidated, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PLUGIN_RESULT Plugin::NetworkIDValidated(const char *pszUserName, const char *pszNetworkID)&lt;br /&gt;
{&lt;br /&gt;
    META_CONPRINTF(&amp;quot;%s has been validated with Network ID %s\n&amp;quot;, pszUserName, pszNetworkID);&lt;br /&gt;
    RETURN_META_VALUE(MRES_SUPERCEDE, PLUGIN_CONTINUE);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User Message Enumeration==&lt;br /&gt;
API functions have also been added for the purpose of enumerating user messages.  These serve to replace &amp;lt;tt&amp;gt;IServerGameDLL::GetUserMessageInfo()&amp;lt;/tt&amp;gt; which can crash the server upon passing an invalid message index.  The new functions include: &lt;br /&gt;
*&amp;lt;tt&amp;gt;GetUserMessageCount()&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;FindUserMessage()&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetUserMessage()&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is a quick example of how to use them:&lt;br /&gt;
&amp;lt;cpp&amp;gt;// Get index of 'SayText' message&lt;br /&gt;
int msgSayText = g_SMAPI-&amp;gt;FindUserMessage(&amp;quot;SayText&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Get number of user messages in GameDLL&lt;br /&gt;
int count = g_SMAPI-&amp;gt;GetUserMessageCount();&lt;br /&gt;
&lt;br /&gt;
const char *name;&lt;br /&gt;
int size;&lt;br /&gt;
&lt;br /&gt;
// Print list of user message names and sizes&lt;br /&gt;
for (int i = 0; i &amp;lt; count; i++)&lt;br /&gt;
{&lt;br /&gt;
    name = g_SMAPI-&amp;gt;GetUserMessage(i, &amp;amp;size);&lt;br /&gt;
&lt;br /&gt;
    META_CONPRINTF(&amp;quot;Message %d: (name \&amp;quot;%s\&amp;quot;) (size %d)\n&amp;quot;, i, name, size);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceHook]]&lt;br /&gt;
[[Category:Documentation (SourceMM)]]&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CDODPlayer_Offset_List_(Day_of_Defeat:_Source)&amp;diff=3107</id>
		<title>CDODPlayer Offset List (Day of Defeat: Source)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CDODPlayer_Offset_List_(Day_of_Defeat:_Source)&amp;diff=3107"/>
		<updated>2006-06-29T23:44:18Z</updated>

		<summary type="html">&lt;p&gt;Showdax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Vfunc_offsets_%28SourceMM%29|VFunc offsets]].&lt;br /&gt;
&lt;br /&gt;
These are &amp;lt;strong&amp;gt;Linux offsets&amp;lt;/strong&amp;gt;. Windows offsets are one less. These should be good as of 2006/06/29.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;1       CDODPlayer::~CDODPlayer()&lt;br /&gt;
2       CBaseEntity::SetRefEHandle(CBaseHandle const&amp;amp;)&lt;br /&gt;
3       CBaseEntity::GetRefEHandle() const&lt;br /&gt;
4       CBaseEntity::GetCollideable()&lt;br /&gt;
5       CBaseEntity::GetNetworkable()&lt;br /&gt;
6       CBaseEntity::GetBaseEntity()&lt;br /&gt;
7       CBaseEntity::GetModelIndex() const&lt;br /&gt;
8       CBaseEntity::GetModelName() const&lt;br /&gt;
9       CBaseEntity::SetModelIndex(int)&lt;br /&gt;
10      CDODPlayer::_GetClassName()&lt;br /&gt;
11      CDODPlayer::GetServerClass()&lt;br /&gt;
12      CDODPlayer::GetClassName()&lt;br /&gt;
13      CDODPlayer::YouForgotToImplementOrDeclareServerClass()&lt;br /&gt;
14      CDODPlayer::GetDataDescMap()&lt;br /&gt;
15      CBaseAnimating::TestCollision(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
16      CBaseAnimating::TestHitboxes(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
17      CDODPlayer::ComputeWorldSpaceSurroundingBox(Vector*, Vector*)&lt;br /&gt;
18      CBaseEntity::ShouldCollide(int, int) const&lt;br /&gt;
19      CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
20      CBasePlayer::ShouldTransmit(CCheckTransmitInfo const*)&lt;br /&gt;
21      CBasePlayer::UpdateTransmitState()&lt;br /&gt;
22      CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo*, bool)&lt;br /&gt;
23      CBasePlayer::GetTracerType()&lt;br /&gt;
24      CDODPlayer::Spawn()&lt;br /&gt;
25      CDODPlayer::Precache()&lt;br /&gt;
26      CBaseFlex::SetModel(char const*)&lt;br /&gt;
27      CBaseEntity::PostConstructor(char const*)&lt;br /&gt;
28      CBaseEntity::PostClientActive()&lt;br /&gt;
29      CBaseEntity::ParseMapData(CEntityMapData*)&lt;br /&gt;
30      CBaseEntity::KeyValue(char const*, char const*)&lt;br /&gt;
31      CBaseEntity::KeyValue(char const*, float)&lt;br /&gt;
32      CBaseEntity::KeyValue(char const*, Vector)&lt;br /&gt;
33      CBasePlayer::Activate()&lt;br /&gt;
34      CBaseEntity::SetParent(CBaseEntity*, int)&lt;br /&gt;
35      CBasePlayer::ObjectCaps()&lt;br /&gt;
36      CBaseEntity::AcceptInput(char const*, CBaseEntity*, CBaseEntity*, variant_t, int)&lt;br /&gt;
37      CBaseAnimating::GetInputDispatchEffectPosition(char const*, Vector&amp;amp;, QAngle&amp;amp;)&lt;br /&gt;
38      CBasePlayer::DrawDebugGeometryOverlays()&lt;br /&gt;
39      CBaseAnimating::DrawDebugTextOverlays()&lt;br /&gt;
40      CBasePlayer::Save(ISave&amp;amp;)&lt;br /&gt;
41      CBasePlayer::Restore(IRestore&amp;amp;)&lt;br /&gt;
42      CBasePlayer::ShouldSavePhysics()&lt;br /&gt;
43      CBaseEntity::OnSave(IEntitySaveUtils*)&lt;br /&gt;
44      CBasePlayer::OnRestore()&lt;br /&gt;
45      CBasePlayer::RequiredEdictIndex()&lt;br /&gt;
46      CBaseEntity::MoveDone()&lt;br /&gt;
47      CBaseEntity::Think()&lt;br /&gt;
48      CBasePlayer::NetworkStateChanged_m_nNextThinkTick()&lt;br /&gt;
49      CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void*)&lt;br /&gt;
50      CBaseAnimating::GetBaseAnimating()&lt;br /&gt;
51      CBaseEntity::GetResponseSystem()&lt;br /&gt;
52      CBaseEntity::DispatchResponse(char const*)&lt;br /&gt;
53      CBasePlayer::Classify()&lt;br /&gt;
54      CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
55      CBaseEntity::ShouldAttractAutoAim(CBaseEntity*)&lt;br /&gt;
56      CBaseEntity::GetAutoAimRadius()&lt;br /&gt;
57      CBaseEntity::GetAutoAimCenter()&lt;br /&gt;
58      CBaseEntity::PassesDamageFilter(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
59      CDODPlayer::TraceAttack(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;, CGameTrace*)&lt;br /&gt;
60      CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
61      CDODPlayer::OnTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
62      CBasePlayer::TakeHealth(float, int)&lt;br /&gt;
63      CDODPlayer::Event_Killed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
64      CBaseEntity::Event_KilledOther(CBaseEntity*, CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
65      CBaseCombatCharacter::BloodColor()&lt;br /&gt;
66      CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
67      CBaseEntity::IsNPC() const&lt;br /&gt;
68      CBaseCombatCharacter::MyCombatCharacterPointer()&lt;br /&gt;
69      CBaseEntity::GetDelay()&lt;br /&gt;
70      CBaseEntity::IsMoving()&lt;br /&gt;
71      CBaseEntity::DamageDecal(int, int)&lt;br /&gt;
72      CBaseEntity::DecalTrace(CGameTrace*, char const*)&lt;br /&gt;
73      CBaseEntity::ImpactTrace(CGameTrace*, int, char*)&lt;br /&gt;
74      CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
75      CBaseEntity::HasTarget(string_t)&lt;br /&gt;
76      CBasePlayer::IsPlayer() const&lt;br /&gt;
77      CBasePlayer::IsNetClient() const&lt;br /&gt;
78      CBaseEntity::IsTemplate()&lt;br /&gt;
79      CBaseEntity::IsBaseObject() const&lt;br /&gt;
80      CBaseEntity::GetServerVehicle()&lt;br /&gt;
81      CBaseEntity::IsViewable()&lt;br /&gt;
82      CDODPlayer::ChangeTeam(int)&lt;br /&gt;
83      CBaseEntity::OnEntityEvent(EntityEvent_t, void*)&lt;br /&gt;
84      CBaseEntity::CanStandOn(CBaseEntity*) const&lt;br /&gt;
85      CBaseEntity::CanStandOn(edict_t*) const&lt;br /&gt;
86      CBaseEntity::GetEnemy()&lt;br /&gt;
87      CBaseEntity::GetEnemy() const&lt;br /&gt;
88      CBaseEntity::Use(CBaseEntity*, CBaseEntity*, USE_TYPE, float)&lt;br /&gt;
89      CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
90      CBasePlayer::Touch(CBaseEntity*)&lt;br /&gt;
91      CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
92      CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
93      CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
94      CBaseEntity::EndBlocked()&lt;br /&gt;
95      CBasePlayer::PhysicsSimulate()&lt;br /&gt;
96      CBasePlayer::UpdateOnRemove()&lt;br /&gt;
97      CBaseEntity::StopLoopingSounds()&lt;br /&gt;
98      CBaseEntity::SUB_AllowedToFade()&lt;br /&gt;
99      CBaseAnimating::Teleport(Vector const*, QAngle const*, Vector const*)&lt;br /&gt;
100     CBaseEntity::NotifySystemEvent(CBaseEntity*, notify_system_event_t, notify_system_event_params_t const&amp;amp;)&lt;br /&gt;
101     CBasePlayer::MakeTracer(Vector const&amp;amp;, CGameTrace const&amp;amp;, int)&lt;br /&gt;
102     CDODPlayer::FireBullets(FireBulletsInfo_t const&amp;amp;)&lt;br /&gt;
103     CBasePlayer::DoImpactEffect(CGameTrace&amp;amp;, int)&lt;br /&gt;
104     CBaseEntity::Respawn()&lt;br /&gt;
105     CBaseEntity::IsLockedByMaster()&lt;br /&gt;
106     CBaseAnimating::ModifyOrAppendCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
107     CBaseEntity::NetworkStateChanged_m_iMaxHealth()&lt;br /&gt;
108     CBaseEntity::NetworkStateChanged_m_iMaxHealth(void*)&lt;br /&gt;
109     CBasePlayer::NetworkStateChanged_m_iHealth()&lt;br /&gt;
110     CBasePlayer::NetworkStateChanged_m_iHealth(void*)&lt;br /&gt;
111     CBasePlayer::NetworkStateChanged_m_lifeState()&lt;br /&gt;
112     CBasePlayer::NetworkStateChanged_m_lifeState(void*)&lt;br /&gt;
113     CBaseEntity::NetworkStateChanged_m_takedamage()&lt;br /&gt;
114     CBaseEntity::NetworkStateChanged_m_takedamage(void*)&lt;br /&gt;
115     CBaseEntity::GetDamageType() const&lt;br /&gt;
116     CBaseEntity::GetDamage()&lt;br /&gt;
117     CBaseEntity::SetDamage(float)&lt;br /&gt;
118     CBasePlayer::EyePosition()&lt;br /&gt;
119     CBasePlayer::EyeAngles()&lt;br /&gt;
120     CBasePlayer::LocalEyeAngles()&lt;br /&gt;
121     CBaseEntity::EarPosition()&lt;br /&gt;
122     CBasePlayer::BodyTarget(Vector const&amp;amp;, bool)&lt;br /&gt;
123     CBaseEntity::HeadTarget(Vector const&amp;amp;)&lt;br /&gt;
124     CBaseEntity::GetVectors(Vector*, Vector*, Vector*) const&lt;br /&gt;
125     CBaseEntity::GetViewOffset()&lt;br /&gt;
126     CBasePlayer::GetSmoothedVelocity()&lt;br /&gt;
127     CBaseAnimating::GetVelocity(Vector*, Vector*)&lt;br /&gt;
128     CBaseCombatCharacter::FVisible(CBaseEntity*, int, CBaseEntity**)&lt;br /&gt;
129     CBaseCombatCharacter::FVisible(Vector const&amp;amp;, int, CBaseEntity**)&lt;br /&gt;
130     CBaseEntity::CanBeSeenBy(CAI_BaseNPC*)&lt;br /&gt;
131     CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
132     CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
133     CBaseEntity::CanBePoweredUp()&lt;br /&gt;
134     CBaseEntity::AttemptToPowerup(int, float, float, CBaseEntity*, CDamageModifier*)&lt;br /&gt;
135     CBaseEntity::GetGroundVelocityToApply(Vector&amp;amp;)&lt;br /&gt;
136     CBaseEntity::PhysicsSplash(Vector const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
137     CBaseEntity::Splash()&lt;br /&gt;
138     CBaseEntity::WorldSpaceCenter() const&lt;br /&gt;
139     CBaseEntity::GetSoundEmissionOrigin() const&lt;br /&gt;
140     CBaseEntity::CreateVPhysics()&lt;br /&gt;
141     CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
142     CBasePlayer::VPhysicsDestroyObject()&lt;br /&gt;
143     CBasePlayer::VPhysicsUpdate(IPhysicsObject*)&lt;br /&gt;
144     CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
145     CBaseCombatCharacter::VPhysicsShadowCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
146     CDODPlayer::VPhysicsShadowUpdate(IPhysicsObject*)&lt;br /&gt;
147     CBasePlayer::VPhysicsCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
148     CBaseEntity::VPhysicsFriction(IPhysicsObject*, float, int, int)&lt;br /&gt;
149     CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
150     CBaseEntity::VPhysicsGetObjectList(IPhysicsObject**, int)&lt;br /&gt;
151     CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
152     CBasePlayer::PhysicsSolidMaskForEntity() const&lt;br /&gt;
153     CBaseEntity::ResolveFlyCollisionCustom(CGameTrace&amp;amp;, Vector&amp;amp;)&lt;br /&gt;
154     CBaseEntity::PerformCustomPhysics(Vector*, Vector*, QAngle*, QAngle*)&lt;br /&gt;
155     CBaseAnimating::GetStepOrigin() const&lt;br /&gt;
156     CBaseAnimating::GetStepAngles() const&lt;br /&gt;
157     CBaseEntity::ShouldDrawWaterImpacts()&lt;br /&gt;
158     CBaseEntity::NetworkStateChanged_m_fFlags()&lt;br /&gt;
159     CBaseEntity::NetworkStateChanged_m_fFlags(void*)&lt;br /&gt;
160     CBasePlayer::NetworkStateChanged_m_nWaterLevel()&lt;br /&gt;
161     CBasePlayer::NetworkStateChanged_m_nWaterLevel(void*)&lt;br /&gt;
162     CBasePlayer::NetworkStateChanged_m_hGroundEntity()&lt;br /&gt;
163     CBasePlayer::NetworkStateChanged_m_hGroundEntity(void*)&lt;br /&gt;
164     CBasePlayer::NetworkStateChanged_m_vecBaseVelocity()&lt;br /&gt;
165     CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void*)&lt;br /&gt;
166     CBasePlayer::NetworkStateChanged_m_flFriction()&lt;br /&gt;
167     CBasePlayer::NetworkStateChanged_m_flFriction(void*)&lt;br /&gt;
168     CBasePlayer::NetworkStateChanged_m_vecVelocity()&lt;br /&gt;
169     CBasePlayer::NetworkStateChanged_m_vecVelocity(void*)&lt;br /&gt;
170     CBasePlayer::NetworkStateChanged_m_vecViewOffset()&lt;br /&gt;
171     CBasePlayer::NetworkStateChanged_m_vecViewOffset(void*)&lt;br /&gt;
172     CBaseAnimating::GetIdealSpeed() const&lt;br /&gt;
173     CBaseAnimating::GetIdealAccel() const&lt;br /&gt;
174     CBaseAnimatingOverlay::StudioFrameAdvance()&lt;br /&gt;
175     CBaseAnimating::IsActivityFinished()&lt;br /&gt;
176     CBaseAnimating::ClampRagdollForce(Vector const&amp;amp;, Vector*)&lt;br /&gt;
177     CBaseAnimating::BecomeRagdollOnClient(Vector const&amp;amp;)&lt;br /&gt;
178     CBaseAnimating::IsRagdoll()&lt;br /&gt;
179     CBaseAnimating::CanBecomeRagdoll()&lt;br /&gt;
180     CBaseAnimatingOverlay::GetSkeleton(CStudioHdr*, Vector*, Quaternion*, int)&lt;br /&gt;
181     CBaseAnimating::GetBoneTransform(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
182     CDODPlayer::SetupBones(matrix3x4_t*, int)&lt;br /&gt;
183     CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
184     CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating*)&lt;br /&gt;
185     CBaseAnimating::HandleAnimEvent(animevent_t*)&lt;br /&gt;
186     CBaseAnimating::GetAttachment(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
187     CBaseAnimating::InitBoneControllers()&lt;br /&gt;
188     CBaseAnimating::GetGroundSpeedVelocity()&lt;br /&gt;
189     CBaseAnimating::Ignite(float, bool, float, bool)&lt;br /&gt;
190     CBaseAnimating::Extinguish()&lt;br /&gt;
191     CBaseCombatCharacter::SetLightingOriginRelative(CBaseEntity*)&lt;br /&gt;
192     CBaseAnimating::SetLightingOrigin(CBaseEntity*)&lt;br /&gt;
193     CBaseFlex::SetViewtarget(Vector const&amp;amp;)&lt;br /&gt;
194     CBaseFlex::StartSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*, CChoreoActor*, CBaseEntity*)&lt;br /&gt;
195     CBaseFlex::ProcessSceneEvents()&lt;br /&gt;
196     CBaseFlex::ProcessSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
197     CBaseFlex::ClearSceneEvent(CSceneEventInfo*, bool, bool)&lt;br /&gt;
198     CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo*, float, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
199     CBaseCombatCharacter::GetPhysicsImpactDamageTable()&lt;br /&gt;
200     CBaseCombatCharacter::FInViewCone(CBaseEntity*)&lt;br /&gt;
201     CBaseCombatCharacter::FInViewCone(Vector const&amp;amp;)&lt;br /&gt;
202     CBaseCombatCharacter::FInAimCone(CBaseEntity*)&lt;br /&gt;
203     CBaseCombatCharacter::FInAimCone(Vector const&amp;amp;)&lt;br /&gt;
204     CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
205     CBaseCombatCharacter::FindMissTarget()&lt;br /&gt;
206     CBaseCombatCharacter::HandleInteraction(int, void*, CBaseCombatCharacter*)&lt;br /&gt;
207     CBasePlayer::BodyAngles()&lt;br /&gt;
208     CBaseCombatCharacter::BodyDirection2D()&lt;br /&gt;
209     CBaseCombatCharacter::BodyDirection3D()&lt;br /&gt;
210     CBaseCombatCharacter::HeadDirection2D()&lt;br /&gt;
211     CBaseCombatCharacter::HeadDirection3D()&lt;br /&gt;
212     CBaseCombatCharacter::EyeDirection2D()&lt;br /&gt;
213     CBaseCombatCharacter::EyeDirection3D()&lt;br /&gt;
214     CBaseCombatCharacter::GiveAmmo(int, int, bool)&lt;br /&gt;
215     CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
216     CBaseCombatCharacter::Weapon_TranslateActivity(Activity, bool*)&lt;br /&gt;
217     CBasePlayer::Weapon_CanUse(CBaseCombatWeapon*)&lt;br /&gt;
218     CBasePlayer::Weapon_Equip(CBaseCombatWeapon*)&lt;br /&gt;
219     CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon*)&lt;br /&gt;
220     CBasePlayer::Weapon_Drop(CBaseCombatWeapon*, Vector const*, Vector const*)&lt;br /&gt;
221     CBasePlayer::Weapon_Switch(CBaseCombatWeapon*, int)&lt;br /&gt;
222     CBasePlayer::Weapon_ShootPosition()&lt;br /&gt;
223     CDODPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon*)&lt;br /&gt;
224     CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon*)&lt;br /&gt;
225     CBaseCombatCharacter::Weapon_GetSlot(int) const&lt;br /&gt;
226     CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
227     CBasePlayer::RemovePlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
228     CBaseCombatCharacter::CanBecomeServerRagdoll()&lt;br /&gt;
229     CDODPlayer::OnTakeDamage_Alive(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
230     CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
231     CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
232     CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*, CBaseEntity*)&lt;br /&gt;
233     CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity*)&lt;br /&gt;
234     CBaseCombatCharacter::GetDeathActivity()&lt;br /&gt;
235     CBaseCombatCharacter::CorpseGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
236     CBaseCombatCharacter::CorpseFade()&lt;br /&gt;
237     CBaseCombatCharacter::HasHumanGibs()&lt;br /&gt;
238     CBaseCombatCharacter::HasAlienGibs()&lt;br /&gt;
239     CBaseCombatCharacter::ShouldGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
240     CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
241     CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
242     CBasePlayer::Event_Dying()&lt;br /&gt;
243     CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
244     CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity*)&lt;br /&gt;
245     CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity*, Vector const&amp;amp;, float, int)&lt;br /&gt;
246     CBaseCombatCharacter::CheckTraceHullAttack(float, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
247     CBaseCombatCharacter::CheckTraceHullAttack(Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
248     CBaseCombatCharacter::PushawayTouch(CBaseEntity*)&lt;br /&gt;
249     CBaseCombatCharacter::IRelationType(CBaseEntity*)&lt;br /&gt;
250     CBaseCombatCharacter::IRelationPriority(CBaseEntity*)&lt;br /&gt;
251     CBaseCombatCharacter::IsInAVehicle()&lt;br /&gt;
252     CBasePlayer::GetVehicle()&lt;br /&gt;
253     CBasePlayer::GetVehicleEntity()&lt;br /&gt;
254     CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon*)&lt;br /&gt;
255     CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
256     CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
257     CBasePlayer::DoMuzzleFlash()&lt;br /&gt;
258     CBaseCombatCharacter::AddEntityRelationship(CBaseEntity*, Disposition_t, int)&lt;br /&gt;
259     CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity*)&lt;br /&gt;
260     CBaseCombatCharacter::AddClassRelationship(Class_T, Disposition_t, int)&lt;br /&gt;
261     CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
262     CBasePlayer::NetworkStateChanged_m_iAmmo()&lt;br /&gt;
263     CBasePlayer::NetworkStateChanged_m_iAmmo(void*)&lt;br /&gt;
264     CDODPlayer::CreateViewModel(int)&lt;br /&gt;
265     CDODPlayer::SetupVisibility(CBaseEntity*, unsigned char*, int)&lt;br /&gt;
266     CDODPlayer::WantsLagCompensationOnEntity(CBasePlayer const*, CUserCmd const*, CBitVec&amp;lt;2048&amp;gt; const*) const&lt;br /&gt;
267     CDODPlayer::SharedSpawn()&lt;br /&gt;
268     CDODPlayer::InitialSpawn()&lt;br /&gt;
269     CBasePlayer::InitHUD()&lt;br /&gt;
270     CBasePlayer::ShowViewPortPanel(char const*, bool, KeyValues*)&lt;br /&gt;
271     CDODPlayer::PlayerDeathThink()&lt;br /&gt;
272     CBasePlayer::Jump()&lt;br /&gt;
273     CBasePlayer::Duck()&lt;br /&gt;
274     CDODPlayer::PreThink()&lt;br /&gt;
275     CDODPlayer::PostThink()&lt;br /&gt;
276     CBasePlayer::DamageEffect(float, int)&lt;br /&gt;
277     CDODPlayer::OnDamagedByExplosion(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
278     CBasePlayer::ShouldFadeOnDeath()&lt;br /&gt;
279     CBasePlayer::IsFakeClient() const&lt;br /&gt;
280     CDODPlayer::GetPlayerMins() const&lt;br /&gt;
281     CDODPlayer::GetPlayerMaxs() const&lt;br /&gt;
282     CBasePlayer::CalcRoll(QAngle const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
283     CBasePlayer::PackDeadPlayerItems()&lt;br /&gt;
284     CBasePlayer::RemoveAllItems(bool)&lt;br /&gt;
285     CBasePlayer::Weapon_SetLast(CBaseCombatWeapon*)&lt;br /&gt;
286     CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
287     CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon*)&lt;br /&gt;
288     CBasePlayer::UpdateClientData()&lt;br /&gt;
289     CBasePlayer::ExitLadder()&lt;br /&gt;
290     CDODPlayer::FlashlightIsOn()&lt;br /&gt;
291     CDODPlayer::FlashlightTurnOn()&lt;br /&gt;
292     CDODPlayer::FlashlightTurnOff()&lt;br /&gt;
293     CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity*, float*)&lt;br /&gt;
294     CDODPlayer::UpdateStepSound(surfacedata_t*, Vector const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
295     CDODPlayer::PlayStepSound(Vector&amp;amp;, surfacedata_t*, float, bool)&lt;br /&gt;
296     CDODPlayer::DeathSound(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
297     CDODPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
298     CBasePlayer::ImpulseCommands()&lt;br /&gt;
299     CDODPlayer::CheatImpulseCommands(int)&lt;br /&gt;
300     CDODPlayer::ClientCommand(char const*)&lt;br /&gt;
301     CBasePlayer::StartObserverMode(int)&lt;br /&gt;
302     CBasePlayer::StopObserverMode()&lt;br /&gt;
303     CDODPlayer::SetObserverMode(int)&lt;br /&gt;
304     CBasePlayer::GetObserverMode()&lt;br /&gt;
305     CBasePlayer::SetObserverTarget(CBaseEntity*)&lt;br /&gt;
306     CBasePlayer::ObserverUse(bool)&lt;br /&gt;
307     CBasePlayer::GetObserverTarget()&lt;br /&gt;
308     CBasePlayer::FindNextObserverTarget(bool)&lt;br /&gt;
309     CBasePlayer::IsValidObserverTarget(CBaseEntity*)&lt;br /&gt;
310     CBasePlayer::CheckObserverSettings()&lt;br /&gt;
311     CBasePlayer::JumptoPosition(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
312     CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
313     CBasePlayer::ResetObserverMode()&lt;br /&gt;
314     CDODPlayer::StartReplayMode(float, float, int)&lt;br /&gt;
315     CDODPlayer::StopReplayMode()&lt;br /&gt;
316     CBasePlayer::GetDelayTicks()&lt;br /&gt;
317     CBasePlayer::GetReplayEntity()&lt;br /&gt;
318     CBasePlayer::CreateCorpse()&lt;br /&gt;
319     CDODPlayer::EntSelectSpawnPoint()&lt;br /&gt;
320     CBasePlayer::GetInVehicle(IServerVehicle*, int)&lt;br /&gt;
321     CBasePlayer::LeaveVehicle(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
322     CBasePlayer::OnVehicleStart()&lt;br /&gt;
323     CBasePlayer::OnVehicleEnd(Vector&amp;amp;)&lt;br /&gt;
324     CDODPlayer::BumpWeapon(CBaseCombatWeapon*)&lt;br /&gt;
325     CBasePlayer::SelectLastItem()&lt;br /&gt;
326     CBasePlayer::SelectItem(char const*, int)&lt;br /&gt;
327     CBasePlayer::ItemPostFrame()&lt;br /&gt;
328     CDODPlayer::GiveNamedItem(char const*, int)&lt;br /&gt;
329     CDODPlayer::CheckTrainUpdate()&lt;br /&gt;
330     CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
331     CBasePlayer::CanBreatheUnderwater() const&lt;br /&gt;
332     CBasePlayer::PlayerUse()&lt;br /&gt;
333     CBasePlayer::PlayUseDenySound()&lt;br /&gt;
334     CDODPlayer::FindUseEntity()&lt;br /&gt;
335     CBasePlayer::IsUseableEntity(CBaseEntity*, unsigned int)&lt;br /&gt;
336     CBasePlayer::PickupObject(CBaseEntity*, bool)&lt;br /&gt;
337     CBasePlayer::ForceDropOfCarriedPhysObjects(CBaseEntity*)&lt;br /&gt;
338     CBasePlayer::GetHeldObjectMass(IPhysicsObject*)&lt;br /&gt;
339     CDODPlayer::UpdateGeigerCounter()&lt;br /&gt;
340     CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
341     CBasePlayer::GetAutoaimVector(float, float)&lt;br /&gt;
342     CBasePlayer::GetAutoaimVector(autoaim_params_t&amp;amp;)&lt;br /&gt;
343     CBasePlayer::ShouldAutoaim()&lt;br /&gt;
344     CBasePlayer::ForceClientDllUpdate()&lt;br /&gt;
345     CBasePlayer::ProcessUsercmds(CUserCmd*, int, int, int, bool)&lt;br /&gt;
346     CDODPlayer::PlayerRunCommand(CUserCmd*, IMoveHelper*)&lt;br /&gt;
347     CBasePlayer::CanSpeak()&lt;br /&gt;
348     CBasePlayer::CanHearChatFrom(CBasePlayer*)&lt;br /&gt;
349     CBasePlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
350     CDODPlayer::CheckChatText(char*, int)&lt;br /&gt;
351     CBasePlayer::IsFollowingPhysics()&lt;br /&gt;
352     CDODPlayer::InitVCollision()&lt;br /&gt;
353     CBasePlayer::UpdatePhysicsShadowToCurrentPosition()&lt;br /&gt;
354     CBasePlayer::EquipSuit(bool)&lt;br /&gt;
355     CBasePlayer::RemoveSuit()&lt;br /&gt;
356     CDODPlayer::CommitSuicide()&lt;br /&gt;
357     CBasePlayer::IsBot() const&lt;br /&gt;
358     CBasePlayer::SpawnArmorValue() const&lt;br /&gt;
359     CBasePlayer::NetworkStateChanged_m_ArmorValue()&lt;br /&gt;
360     CBasePlayer::NetworkStateChanged_m_ArmorValue(void*)&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CDODPlayer_Offset_List_(Day_of_Defeat:_Source)&amp;diff=3104</id>
		<title>CDODPlayer Offset List (Day of Defeat: Source)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CDODPlayer_Offset_List_(Day_of_Defeat:_Source)&amp;diff=3104"/>
		<updated>2006-06-29T15:42:35Z</updated>

		<summary type="html">&lt;p&gt;Showdax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Vfunc_offsets_%28SourceMM%29|VFunc offsets]].&lt;br /&gt;
&lt;br /&gt;
These are &amp;lt;strong&amp;gt;Linux offsets&amp;lt;/strong&amp;gt;. Windows offsets are one less. These should be good as of 2006/06/29.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;1       CDODPlayer::~CDODPlayer()&lt;br /&gt;
2       CBaseEntity::SetRefEHandle(CBaseHandle const&amp;amp;)&lt;br /&gt;
3       CBaseEntity::GetRefEHandle() const&lt;br /&gt;
4       CBaseEntity::GetCollideable()&lt;br /&gt;
5       CBaseEntity::GetNetworkable()&lt;br /&gt;
6       CBaseEntity::GetBaseEntity()&lt;br /&gt;
7       CBaseEntity::GetModelIndex() const&lt;br /&gt;
8       CBaseEntity::GetModelName() const&lt;br /&gt;
9       CBaseEntity::SetModelIndex(int)&lt;br /&gt;
10      CDODPlayer::_GetClassName()&lt;br /&gt;
11      CDODPlayer::GetServerClass()&lt;br /&gt;
12      CDODPlayer::GetClassName()&lt;br /&gt;
13      CDODPlayer::YouForgotToImplementOrDeclareServerClass()&lt;br /&gt;
14      CDODPlayer::GetDataDescMap()&lt;br /&gt;
15      CBaseAnimating::TestCollision(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
16      CBaseAnimating::TestHitboxes(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
17      CDODPlayer::ComputeWorldSpaceSurroundingBox(Vector*, Vector*)&lt;br /&gt;
18      CBaseEntity::ShouldCollide(int, int) const&lt;br /&gt;
19      CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
20      CBasePlayer::ShouldTransmit(CCheckTransmitInfo const*)&lt;br /&gt;
21      CBasePlayer::UpdateTransmitState()&lt;br /&gt;
22      CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo*, bool)&lt;br /&gt;
23      CBasePlayer::GetTracerType()&lt;br /&gt;
24      CDODPlayer::Spawn()&lt;br /&gt;
25      CDODPlayer::Precache()&lt;br /&gt;
26      CBaseFlex::SetModel(char const*)&lt;br /&gt;
27      CBaseEntity::PostConstructor(char const*)&lt;br /&gt;
28      CBaseEntity::PostClientActive()&lt;br /&gt;
29      CBaseEntity::ParseMapData(CEntityMapData*)&lt;br /&gt;
30      CBaseEntity::KeyValue(char const*, char const*)&lt;br /&gt;
31      CBaseEntity::KeyValue(char const*, float)&lt;br /&gt;
32      CBaseEntity::KeyValue(char const*, Vector)&lt;br /&gt;
33      CBasePlayer::Activate()&lt;br /&gt;
34      CBaseEntity::SetParent(CBaseEntity*, int)&lt;br /&gt;
35      CBasePlayer::ObjectCaps()&lt;br /&gt;
36      CBaseEntity::AcceptInput(char const*, CBaseEntity*, CBaseEntity*, variant_t, int)&lt;br /&gt;
37      CBaseAnimating::GetInputDispatchEffectPosition(char const*, Vector&amp;amp;, QAngle&amp;amp;)&lt;br /&gt;
38      CBasePlayer::DrawDebugGeometryOverlays()&lt;br /&gt;
39      CBaseAnimating::DrawDebugTextOverlays()&lt;br /&gt;
40      CBasePlayer::Save(ISave&amp;amp;)&lt;br /&gt;
41      CBasePlayer::Restore(IRestore&amp;amp;)&lt;br /&gt;
42      CBasePlayer::ShouldSavePhysics()&lt;br /&gt;
43      CBaseEntity::OnSave(IEntitySaveUtils*)&lt;br /&gt;
44      CBasePlayer::OnRestore()&lt;br /&gt;
45      CBasePlayer::RequiredEdictIndex()&lt;br /&gt;
46      CBaseEntity::MoveDone()&lt;br /&gt;
47      CBaseEntity::Think()&lt;br /&gt;
48      CBasePlayer::NetworkStateChanged_m_nNextThinkTick()&lt;br /&gt;
49      CBasePlayer::NetworkStateChanged_m_nNextThinkTick(void*)&lt;br /&gt;
50      CBaseAnimating::GetBaseAnimating()&lt;br /&gt;
51      CBaseEntity::GetResponseSystem()&lt;br /&gt;
52      CBaseEntity::DispatchResponse(char const*)&lt;br /&gt;
53      CBasePlayer::Classify()&lt;br /&gt;
54      CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
55      CBaseEntity::ShouldAttractAutoAim(CBaseEntity*)&lt;br /&gt;
56      CBaseEntity::GetAutoAimRadius()&lt;br /&gt;
57      CBaseEntity::GetAutoAimCenter()&lt;br /&gt;
58      CBaseEntity::PassesDamageFilter(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
59      CDODPlayer::TraceAttack(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;, CGameTrace*)&lt;br /&gt;
60      CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
61      CDODPlayer::OnTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
62      CBasePlayer::TakeHealth(float, int)&lt;br /&gt;
63      CDODPlayer::Event_Killed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
64      CBaseEntity::Event_KilledOther(CBaseEntity*, CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
65      CBaseCombatCharacter::BloodColor()&lt;br /&gt;
66      CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
67      CBaseEntity::IsNPC() const&lt;br /&gt;
68      CBaseCombatCharacter::MyCombatCharacterPointer()&lt;br /&gt;
69      CBaseEntity::GetDelay()&lt;br /&gt;
70      CBaseEntity::IsMoving()&lt;br /&gt;
71      CBaseEntity::DamageDecal(int, int)&lt;br /&gt;
72      CBaseEntity::DecalTrace(CGameTrace*, char const*)&lt;br /&gt;
73      CBaseEntity::ImpactTrace(CGameTrace*, int, char*)&lt;br /&gt;
74      CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
75      CBaseEntity::HasTarget(string_t)&lt;br /&gt;
76      CBasePlayer::IsPlayer() const&lt;br /&gt;
77      CBasePlayer::IsNetClient() const&lt;br /&gt;
78      CBaseEntity::IsTemplate()&lt;br /&gt;
79      CBaseEntity::IsBaseObject() const&lt;br /&gt;
80      CBaseEntity::GetServerVehicle()&lt;br /&gt;
81      CBaseEntity::IsViewable()&lt;br /&gt;
82      CDODPlayer::ChangeTeam(int)&lt;br /&gt;
83      CBaseEntity::OnEntityEvent(EntityEvent_t, void*)&lt;br /&gt;
84      CBaseEntity::CanStandOn(CBaseEntity*) const&lt;br /&gt;
85      CBaseEntity::CanStandOn(edict_t*) const&lt;br /&gt;
86      CBaseEntity::GetEnemy()&lt;br /&gt;
87      CBaseEntity::GetEnemy() const&lt;br /&gt;
88      CBaseEntity::Use(CBaseEntity*, CBaseEntity*, USE_TYPE, float)&lt;br /&gt;
89      CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
90      CBasePlayer::Touch(CBaseEntity*)&lt;br /&gt;
91      CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
92      CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
93      CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
94      CBaseEntity::EndBlocked()&lt;br /&gt;
95      CBasePlayer::PhysicsSimulate()&lt;br /&gt;
96      CBasePlayer::UpdateOnRemove()&lt;br /&gt;
97      CBaseEntity::StopLoopingSounds()&lt;br /&gt;
98      CBaseEntity::SUB_AllowedToFade()&lt;br /&gt;
99      CBaseAnimating::Teleport(Vector const*, QAngle const*, Vector const*)&lt;br /&gt;
100     CBaseEntity::NotifySystemEvent(CBaseEntity*, notify_system_event_t, notify_system_event_params_t const&amp;amp;)&lt;br /&gt;
101     CBasePlayer::MakeTracer(Vector const&amp;amp;, CGameTrace const&amp;amp;, int)&lt;br /&gt;
102     CDODPlayer::FireBullets(FireBulletsInfo_t const&amp;amp;)&lt;br /&gt;
103     CBasePlayer::DoImpactEffect(CGameTrace&amp;amp;, int)&lt;br /&gt;
104     CBaseEntity::Respawn()&lt;br /&gt;
105     CBaseEntity::IsLockedByMaster()&lt;br /&gt;
106     CBaseAnimating::ModifyOrAppendCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
107     CBaseEntity::NetworkStateChanged_m_iMaxHealth()&lt;br /&gt;
108     CBaseEntity::NetworkStateChanged_m_iMaxHealth(void*)&lt;br /&gt;
109     CBasePlayer::NetworkStateChanged_m_iHealth()&lt;br /&gt;
110     CBasePlayer::NetworkStateChanged_m_iHealth(void*)&lt;br /&gt;
111     CBasePlayer::NetworkStateChanged_m_lifeState()&lt;br /&gt;
112     CBasePlayer::NetworkStateChanged_m_lifeState(void*)&lt;br /&gt;
113     CBaseEntity::NetworkStateChanged_m_takedamage()&lt;br /&gt;
114     CBaseEntity::NetworkStateChanged_m_takedamage(void*)&lt;br /&gt;
115     CBaseEntity::GetDamageType() const&lt;br /&gt;
116     CBaseEntity::GetDamage()&lt;br /&gt;
117     CBaseEntity::SetDamage(float)&lt;br /&gt;
118     CBasePlayer::EyePosition()&lt;br /&gt;
119     CBasePlayer::EyeAngles()&lt;br /&gt;
120     CBasePlayer::LocalEyeAngles()&lt;br /&gt;
121     CBaseEntity::EarPosition()&lt;br /&gt;
122     CBasePlayer::BodyTarget(Vector const&amp;amp;, bool)&lt;br /&gt;
123     CBaseEntity::HeadTarget(Vector const&amp;amp;)&lt;br /&gt;
124     CBaseEntity::GetVectors(Vector*, Vector*, Vector*) const&lt;br /&gt;
125     CBaseEntity::GetViewOffset()&lt;br /&gt;
126     CBasePlayer::GetSmoothedVelocity()&lt;br /&gt;
127     CBaseAnimating::GetVelocity(Vector*, Vector*)&lt;br /&gt;
128     CBaseCombatCharacter::FVisible(CBaseEntity*, int, CBaseEntity**)&lt;br /&gt;
129     CBaseCombatCharacter::FVisible(Vector const&amp;amp;, int, CBaseEntity**)&lt;br /&gt;
130     CBaseEntity::CanBeSeenBy(CAI_BaseNPC*)&lt;br /&gt;
131     CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
132     CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
133     CBaseEntity::CanBePoweredUp()&lt;br /&gt;
134     CBaseEntity::AttemptToPowerup(int, float, float, CBaseEntity*, CDamageModifier*)&lt;br /&gt;
135     CBaseEntity::GetGroundVelocityToApply(Vector&amp;amp;)&lt;br /&gt;
136     CBaseEntity::PhysicsSplash(Vector const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
137     CBaseEntity::Splash()&lt;br /&gt;
138     CBaseEntity::WorldSpaceCenter() const&lt;br /&gt;
139     CBaseEntity::GetSoundEmissionOrigin() const&lt;br /&gt;
140     CBaseEntity::CreateVPhysics()&lt;br /&gt;
141     CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
142     CBasePlayer::VPhysicsDestroyObject()&lt;br /&gt;
143     CBasePlayer::VPhysicsUpdate(IPhysicsObject*)&lt;br /&gt;
144     CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
145     CBaseCombatCharacter::VPhysicsShadowCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
146     CDODPlayer::VPhysicsShadowUpdate(IPhysicsObject*)&lt;br /&gt;
147     CBasePlayer::VPhysicsCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
148     CBaseEntity::VPhysicsFriction(IPhysicsObject*, float, int, int)&lt;br /&gt;
149     CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
150     CBaseEntity::VPhysicsGetObjectList(IPhysicsObject**, int)&lt;br /&gt;
151     CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
152     CBasePlayer::PhysicsSolidMaskForEntity() const&lt;br /&gt;
153     CBaseEntity::ResolveFlyCollisionCustom(CGameTrace&amp;amp;, Vector&amp;amp;)&lt;br /&gt;
154     CBaseEntity::PerformCustomPhysics(Vector*, Vector*, QAngle*, QAngle*)&lt;br /&gt;
155     CBaseAnimating::GetStepOrigin() const&lt;br /&gt;
156     CBaseAnimating::GetStepAngles() const&lt;br /&gt;
157     CBaseEntity::ShouldDrawWaterImpacts()&lt;br /&gt;
158     CBaseEntity::NetworkStateChanged_m_fFlags()&lt;br /&gt;
159     CBaseEntity::NetworkStateChanged_m_fFlags(void*)&lt;br /&gt;
160     CBasePlayer::NetworkStateChanged_m_nWaterLevel()&lt;br /&gt;
161     CBasePlayer::NetworkStateChanged_m_nWaterLevel(void*)&lt;br /&gt;
162     CBasePlayer::NetworkStateChanged_m_hGroundEntity()&lt;br /&gt;
163     CBasePlayer::NetworkStateChanged_m_hGroundEntity(void*)&lt;br /&gt;
164     CBasePlayer::NetworkStateChanged_m_vecBaseVelocity()&lt;br /&gt;
165     CBasePlayer::NetworkStateChanged_m_vecBaseVelocity(void*)&lt;br /&gt;
166     CBasePlayer::NetworkStateChanged_m_flFriction()&lt;br /&gt;
167     CBasePlayer::NetworkStateChanged_m_flFriction(void*)&lt;br /&gt;
168     CBasePlayer::NetworkStateChanged_m_vecVelocity()&lt;br /&gt;
169     CBasePlayer::NetworkStateChanged_m_vecVelocity(void*)&lt;br /&gt;
170     CBasePlayer::NetworkStateChanged_m_vecViewOffset()&lt;br /&gt;
171     CBasePlayer::NetworkStateChanged_m_vecViewOffset(void*)&lt;br /&gt;
172     CBaseAnimating::GetIdealSpeed() const&lt;br /&gt;
173     CBaseAnimating::GetIdealAccel() const&lt;br /&gt;
174     CBaseAnimatingOverlay::StudioFrameAdvance()&lt;br /&gt;
175     CBaseAnimating::IsActivityFinished()&lt;br /&gt;
176     CBaseAnimating::ClampRagdollForce(Vector const&amp;amp;, Vector*)&lt;br /&gt;
177     CBaseAnimating::BecomeRagdollOnClient(Vector const&amp;amp;)&lt;br /&gt;
178     CBaseAnimating::IsRagdoll()&lt;br /&gt;
179     CBaseAnimating::CanBecomeRagdoll()&lt;br /&gt;
180     CBaseAnimatingOverlay::GetSkeleton(CStudioHdr*, Vector*, Quaternion*, int)&lt;br /&gt;
181     CBaseAnimating::GetBoneTransform(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
182     CDODPlayer::SetupBones(matrix3x4_t*, int)&lt;br /&gt;
183     CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
184     CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating*)&lt;br /&gt;
185     CBaseAnimating::HandleAnimEvent(animevent_t*)&lt;br /&gt;
186     CBaseAnimating::GetAttachment(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
187     CBaseAnimating::InitBoneControllers()&lt;br /&gt;
188     CBaseAnimating::GetGroundSpeedVelocity()&lt;br /&gt;
189     CBaseAnimating::Ignite(float, bool, float, bool)&lt;br /&gt;
190     CBaseAnimating::Extinguish()&lt;br /&gt;
191     CBaseCombatCharacter::SetLightingOriginRelative(CBaseEntity*)&lt;br /&gt;
192     CBaseAnimating::SetLightingOrigin(CBaseEntity*)&lt;br /&gt;
193     CBaseFlex::SetViewtarget(Vector const&amp;amp;)&lt;br /&gt;
194     CBaseFlex::StartSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*, CChoreoActor*, CBaseEntity*)&lt;br /&gt;
195     CBaseFlex::ProcessSceneEvents()&lt;br /&gt;
196     CBaseFlex::ProcessSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
197     CBaseFlex::ClearSceneEvent(CSceneEventInfo*, bool, bool)&lt;br /&gt;
198     CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo*, float, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
199     CBaseCombatCharacter::GetPhysicsImpactDamageTable()&lt;br /&gt;
200     CBaseCombatCharacter::FInViewCone(CBaseEntity*)&lt;br /&gt;
201     CBaseCombatCharacter::FInViewCone(Vector const&amp;amp;)&lt;br /&gt;
202     CBaseCombatCharacter::FInAimCone(CBaseEntity*)&lt;br /&gt;
203     CBaseCombatCharacter::FInAimCone(Vector const&amp;amp;)&lt;br /&gt;
204     CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
205     CBaseCombatCharacter::FindMissTarget()&lt;br /&gt;
206     CBaseCombatCharacter::HandleInteraction(int, void*, CBaseCombatCharacter*)&lt;br /&gt;
207     CBasePlayer::BodyAngles()&lt;br /&gt;
208     CBaseCombatCharacter::BodyDirection2D()&lt;br /&gt;
209     CBaseCombatCharacter::BodyDirection3D()&lt;br /&gt;
210     CBaseCombatCharacter::HeadDirection2D()&lt;br /&gt;
211     CBaseCombatCharacter::HeadDirection3D()&lt;br /&gt;
212     CBaseCombatCharacter::EyeDirection2D()&lt;br /&gt;
213     CBaseCombatCharacter::EyeDirection3D()&lt;br /&gt;
214     CBaseCombatCharacter::GiveAmmo(int, int, bool)&lt;br /&gt;
215     CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
216     CBaseCombatCharacter::Weapon_TranslateActivity(Activity, bool*)&lt;br /&gt;
217     CBasePlayer::Weapon_CanUse(CBaseCombatWeapon*)&lt;br /&gt;
218     CBasePlayer::Weapon_Equip(CBaseCombatWeapon*)&lt;br /&gt;
219     CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon*)&lt;br /&gt;
220     CBasePlayer::Weapon_Drop(CBaseCombatWeapon*, Vector const*, Vector const*)&lt;br /&gt;
221     CBasePlayer::Weapon_Switch(CBaseCombatWeapon*, int)&lt;br /&gt;
222     CBasePlayer::Weapon_ShootPosition()&lt;br /&gt;
223     CDODPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon*)&lt;br /&gt;
224     CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon*)&lt;br /&gt;
225     CBaseCombatCharacter::Weapon_GetSlot(int) const&lt;br /&gt;
226     CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
227     CBasePlayer::RemovePlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
228     CBaseCombatCharacter::CanBecomeServerRagdoll()&lt;br /&gt;
229     CDODPlayer::OnTakeDamage_Alive(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
230     CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
231     CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
232     CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*, CBaseEntity*)&lt;br /&gt;
233     CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity*)&lt;br /&gt;
234     CBaseCombatCharacter::GetDeathActivity()&lt;br /&gt;
235     CBaseCombatCharacter::CorpseGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
236     CBaseCombatCharacter::CorpseFade()&lt;br /&gt;
237     CBaseCombatCharacter::HasHumanGibs()&lt;br /&gt;
238     CBaseCombatCharacter::HasAlienGibs()&lt;br /&gt;
239     CBaseCombatCharacter::ShouldGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
240     CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
241     CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
242     CBasePlayer::Event_Dying()&lt;br /&gt;
243     CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
244     CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity*)&lt;br /&gt;
245     CBaseCombatCharacter::BecomeRagdollBoogie(CBaseEntity*, Vector const&amp;amp;, float, int)&lt;br /&gt;
246     CBaseCombatCharacter::CheckTraceHullAttack(float, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
247     CBaseCombatCharacter::CheckTraceHullAttack(Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
248     CBaseCombatCharacter::PushawayTouch(CBaseEntity*)&lt;br /&gt;
249     CBaseCombatCharacter::IRelationType(CBaseEntity*)&lt;br /&gt;
250     CBaseCombatCharacter::IRelationPriority(CBaseEntity*)&lt;br /&gt;
251     CBaseCombatCharacter::IsInAVehicle()&lt;br /&gt;
252     CBasePlayer::GetVehicle()&lt;br /&gt;
253     CBasePlayer::GetVehicleEntity()&lt;br /&gt;
254     CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon*)&lt;br /&gt;
255     CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
256     CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
257     CBasePlayer::DoMuzzleFlash()&lt;br /&gt;
258     CBaseCombatCharacter::AddEntityRelationship(CBaseEntity*, Disposition_t, int)&lt;br /&gt;
259     CBaseCombatCharacter::RemoveEntityRelationship(CBaseEntity*)&lt;br /&gt;
260     CBaseCombatCharacter::AddClassRelationship(Class_T, Disposition_t, int)&lt;br /&gt;
261     CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
262     CBasePlayer::NetworkStateChanged_m_iAmmo()&lt;br /&gt;
263     CBasePlayer::NetworkStateChanged_m_iAmmo(void*)&lt;br /&gt;
264     CDODPlayer::CreateViewModel(int)&lt;br /&gt;
265     CDODPlayer::SetupVisibility(CBaseEntity*, unsigned char*, int)&lt;br /&gt;
266     CDODPlayer::WantsLagCompensationOnEntity(CBasePlayer const*, CUserCmd const*, CBitVec&amp;lt;2048&amp;gt; const*) const&lt;br /&gt;
267     CDODPlayer::SharedSpawn()&lt;br /&gt;
268     CDODPlayer::InitialSpawn()&lt;br /&gt;
269     CBasePlayer::InitHUD()&lt;br /&gt;
270     CBasePlayer::ShowViewPortPanel(char const*, bool, KeyValues*)&lt;br /&gt;
271     CDODPlayer::PlayerDeathThink()&lt;br /&gt;
272     CBasePlayer::Jump()&lt;br /&gt;
273     CBasePlayer::Duck()&lt;br /&gt;
274     CDODPlayer::PreThink()&lt;br /&gt;
275     CDODPlayer::PostThink()&lt;br /&gt;
276     CBasePlayer::DamageEffect(float, int)&lt;br /&gt;
277     CDODPlayer::OnDamagedByExplosion(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
278     CBasePlayer::ShouldFadeOnDeath()&lt;br /&gt;
279     CBasePlayer::IsFakeClient() const&lt;br /&gt;
280     CDODPlayer::GetPlayerMins() const&lt;br /&gt;
281     CDODPlayer::GetPlayerMaxs() const&lt;br /&gt;
282     CBasePlayer::CalcRoll(QAngle const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
283     CBasePlayer::PackDeadPlayerItems()&lt;br /&gt;
284     CBasePlayer::RemoveAllItems(bool)&lt;br /&gt;
285     CBasePlayer::Weapon_SetLast(CBaseCombatWeapon*)&lt;br /&gt;
286     CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
287     CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon*)&lt;br /&gt;
288     CBasePlayer::UpdateClientData()&lt;br /&gt;
289     CBasePlayer::ExitLadder()&lt;br /&gt;
290     CDODPlayer::FlashlightIsOn()&lt;br /&gt;
291     CDODPlayer::FlashlightTurnOn()&lt;br /&gt;
292     CDODPlayer::FlashlightTurnOff()&lt;br /&gt;
293     CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity*, float*)&lt;br /&gt;
294     CDODPlayer::UpdateStepSound(surfacedata_t*, Vector const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
295     CDODPlayer::PlayStepSound(Vector&amp;amp;, surfacedata_t*, float, bool)&lt;br /&gt;
296     CDODPlayer::DeathSound(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
297     CDODPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
298     CBasePlayer::ImpulseCommands()&lt;br /&gt;
299     CDODPlayer::CheatImpulseCommands(int)&lt;br /&gt;
300     CDODPlayer::ClientCommand(char const*)&lt;br /&gt;
301     CBasePlayer::StartObserverMode(int)&lt;br /&gt;
302     CBasePlayer::StopObserverMode()&lt;br /&gt;
303     CDODPlayer::SetObserverMode(int)&lt;br /&gt;
304     CBasePlayer::GetObserverMode()&lt;br /&gt;
305     CBasePlayer::SetObserverTarget(CBaseEntity*)&lt;br /&gt;
306     CBasePlayer::ObserverUse(bool)&lt;br /&gt;
307     CBasePlayer::GetObserverTarget()&lt;br /&gt;
308     CBasePlayer::FindNextObserverTarget(bool)&lt;br /&gt;
309     CBasePlayer::IsValidObserverTarget(CBaseEntity*)&lt;br /&gt;
310     CBasePlayer::CheckObserverSettings()&lt;br /&gt;
311     CBasePlayer::JumptoPosition(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
312     CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
313     CBasePlayer::ResetObserverMode()&lt;br /&gt;
314     CDODPlayer::StartReplayMode(float, float, int)&lt;br /&gt;
315     CDODPlayer::StopReplayMode()&lt;br /&gt;
316     CBasePlayer::GetDelayTicks()&lt;br /&gt;
317     CBasePlayer::GetReplayEntity()&lt;br /&gt;
318     CBasePlayer::CreateCorpse()&lt;br /&gt;
319     CDODPlayer::EntSelectSpawnPoint()&lt;br /&gt;
320     CBasePlayer::GetInVehicle(IServerVehicle*, int)&lt;br /&gt;
321     CBasePlayer::LeaveVehicle(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
322     CBasePlayer::OnVehicleStart()&lt;br /&gt;
323     CBasePlayer::OnVehicleEnd(Vector&amp;amp;)&lt;br /&gt;
324     CDODPlayer::BumpWeapon(CBaseCombatWeapon*)&lt;br /&gt;
325     CBasePlayer::SelectLastItem()&lt;br /&gt;
326     CBasePlayer::SelectItem(char const*, int)&lt;br /&gt;
327     CBasePlayer::ItemPostFrame()&lt;br /&gt;
328     CDODPlayer::GiveNamedItem(char const*, int)&lt;br /&gt;
329     CDODPlayer::CheckTrainUpdate()&lt;br /&gt;
330     CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
331     CBasePlayer::CanBreatheUnderwater() const&lt;br /&gt;
332     CBasePlayer::PlayerUse()&lt;br /&gt;
333     CBasePlayer::PlayUseDenySound()&lt;br /&gt;
334     CDODPlayer::FindUseEntity()&lt;br /&gt;
335     CBasePlayer::IsUseableEntity(CBaseEntity*, unsigned int)&lt;br /&gt;
336     CBasePlayer::PickupObject(CBaseEntity*, bool)&lt;br /&gt;
337     CBasePlayer::ForceDropOfCarriedPhysObjects(CBaseEntity*)&lt;br /&gt;
338     CBasePlayer::GetHeldObjectMass(IPhysicsObject*)&lt;br /&gt;
339     CDODPlayer::UpdateGeigerCounter()&lt;br /&gt;
340     CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
341     CBasePlayer::GetAutoaimVector(float, float)&lt;br /&gt;
342     CBasePlayer::GetAutoaimVector(autoaim_params_t&amp;amp;)&lt;br /&gt;
343     CBasePlayer::ShouldAutoaim()&lt;br /&gt;
344     CBasePlayer::ForceClientDllUpdate()&lt;br /&gt;
345     CBasePlayer::ProcessUsercmds(CUserCmd*, int, int, int, bool)&lt;br /&gt;
346     CDODPlayer::PlayerRunCommand(CUserCmd*, IMoveHelper*)&lt;br /&gt;
347     CBasePlayer::CanSpeak()&lt;br /&gt;
348     ghostchat_mm::__SourceHook_MFHCls_CBasePlayer_CanHearChatFrom::Func(CBasePlayer*)&lt;br /&gt;
349     CBasePlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
350     CDODPlayer::CheckChatText(char*, int)&lt;br /&gt;
351     CBasePlayer::IsFollowingPhysics()&lt;br /&gt;
352     CDODPlayer::InitVCollision()&lt;br /&gt;
353     CBasePlayer::UpdatePhysicsShadowToCurrentPosition()&lt;br /&gt;
354     CBasePlayer::EquipSuit(bool)&lt;br /&gt;
355     CBasePlayer::RemoveSuit()&lt;br /&gt;
356     CDODPlayer::CommitSuicide()&lt;br /&gt;
357     CBasePlayer::IsBot() const&lt;br /&gt;
358     CBasePlayer::SpawnArmorValue() const&lt;br /&gt;
359     CBasePlayer::NetworkStateChanged_m_ArmorValue()&lt;br /&gt;
360     CBasePlayer::NetworkStateChanged_m_ArmorValue(void*)&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CHL2MP_Player_Offset_List_(Half-Life_2:_Deathmatch)&amp;diff=2941</id>
		<title>CHL2MP Player Offset List (Half-Life 2: Deathmatch)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CHL2MP_Player_Offset_List_(Half-Life_2:_Deathmatch)&amp;diff=2941"/>
		<updated>2006-05-19T00:57:12Z</updated>

		<summary type="html">&lt;p&gt;Showdax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Vfunc_offsets_%28SourceMM%29|VFunc offsets]].&lt;br /&gt;
&lt;br /&gt;
These are &amp;lt;strong&amp;gt;Linux offsets&amp;lt;/strong&amp;gt;. Windows offsets are one less. These should be good as of 2006/05/18.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;1       CHL2MP_Player::~CHL2MP_Player()&lt;br /&gt;
2       CBaseEntity::SetRefEHandle(CBaseHandle const&amp;amp;)&lt;br /&gt;
3       CBaseEntity::GetRefEHandle() const&lt;br /&gt;
4       CBaseEntity::GetCollideable()&lt;br /&gt;
5       CBaseEntity::GetNetworkable()&lt;br /&gt;
6       CBaseEntity::GetBaseEntity()&lt;br /&gt;
7       CBaseEntity::GetModelIndex() const&lt;br /&gt;
8       CBaseEntity::GetModelName() const&lt;br /&gt;
9       CBaseEntity::SetModelIndex(int)&lt;br /&gt;
10      CBasePlayer::GetPredDescMap()&lt;br /&gt;
11      CHL2MP_Player::GetServerClass()&lt;br /&gt;
12      CHL2MP_Player::GetClassName()&lt;br /&gt;
13      CHL2MP_Player::YouForgotToImplementOrDeclareServerClass()&lt;br /&gt;
14      CHL2MP_Player::GetDataDescMap()&lt;br /&gt;
15      CBaseAnimating::TestCollision(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
16      CHL2_Player::TestHitboxes(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
17      CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector*, Vector*)&lt;br /&gt;
18      CBaseEntity::ShouldCollide(int, int) const&lt;br /&gt;
19      CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
20      CBasePlayer::ShouldTransmit(CCheckTransmitInfo const*)&lt;br /&gt;
21      CBasePlayer::UpdateTransmitState()&lt;br /&gt;
22      CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo*, bool)&lt;br /&gt;
23      CBasePlayer::GetTracerType()&lt;br /&gt;
24      CHL2MP_Player::Spawn()&lt;br /&gt;
25      CHL2MP_Player::Precache()&lt;br /&gt;
26      CBaseFlex::SetModel(char const*)&lt;br /&gt;
27      CBaseEntity::PostConstructor(char const*)&lt;br /&gt;
28      CBaseEntity::ParseMapData(CEntityMapData*)&lt;br /&gt;
29      CBaseEntity::KeyValue(char const*, char const*)&lt;br /&gt;
30      CBaseEntity::KeyValue(char const*, float)&lt;br /&gt;
31      CBaseEntity::KeyValue(char const*, Vector)&lt;br /&gt;
32      CBaseEntity::ValidateEntityConnections()&lt;br /&gt;
33      CBasePlayer::Activate()&lt;br /&gt;
34      CBasePlayer::ObjectCaps()&lt;br /&gt;
35      CBaseEntity::AcceptInput(char const*, CBaseEntity*, CBaseEntity*, variant_t, int)&lt;br /&gt;
36      CBaseAnimating::GetInputDispatchEffectPosition(char const*, Vector&amp;amp;, QAngle&amp;amp;)&lt;br /&gt;
37      CHL2_Player::DrawDebugGeometryOverlays()&lt;br /&gt;
38      CBaseAnimating::DrawDebugTextOverlays()&lt;br /&gt;
39      CBasePlayer::Save(ISave&amp;amp;)&lt;br /&gt;
40      CBasePlayer::Restore(IRestore&amp;amp;)&lt;br /&gt;
41      CBasePlayer::ShouldSavePhysics()&lt;br /&gt;
42      CBaseEntity::OnSave(IEntitySaveUtils*)&lt;br /&gt;
43      CHL2_Player::OnRestore()&lt;br /&gt;
44      CBasePlayer::RequiredEdictIndex()&lt;br /&gt;
45      CBaseEntity::MoveDone()&lt;br /&gt;
46      CBaseEntity::Think()&lt;br /&gt;
47      CBaseEntity::NetworkStateChanged_m_nNextThinkTick()&lt;br /&gt;
48      CBaseAnimating::GetBaseAnimating()&lt;br /&gt;
49      CBaseEntity::GetResponseSystem()&lt;br /&gt;
50      CBaseEntity::DispatchResponse(char const*)&lt;br /&gt;
51      CHL2_Player::Classify()&lt;br /&gt;
52      CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
53      CHL2_Player::PassesDamageFilter(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
54      CBasePlayer::TraceAttack(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;, CGameTrace*)&lt;br /&gt;
55      CHL2MP_Player::OnTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
56      CBasePlayer::TakeHealth(float, int)&lt;br /&gt;
57      CHL2MP_Player::Event_Killed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
58      CBaseCombatCharacter::BloodColor()&lt;br /&gt;
59      CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
60      CBaseEntity::IsNPC() const&lt;br /&gt;
61      CBaseCombatCharacter::MyCombatCharacterPointer()&lt;br /&gt;
62      CBaseEntity::GetDelay()&lt;br /&gt;
63      CBaseEntity::IsMoving()&lt;br /&gt;
64      CBaseEntity::DamageDecal(int, int)&lt;br /&gt;
65      CBaseEntity::DecalTrace(CGameTrace*, char const*)&lt;br /&gt;
66      CBaseEntity::ImpactTrace(CGameTrace*, int, char*)&lt;br /&gt;
67      CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
68      CBaseEntity::HasTarget(string_t)&lt;br /&gt;
69      CBasePlayer::IsPlayer() const&lt;br /&gt;
70      CBasePlayer::IsNetClient()&lt;br /&gt;
71      CBaseEntity::IsTemplate()&lt;br /&gt;
72      CBaseEntity::IsBaseObject() const&lt;br /&gt;
73      CBaseEntity::GetServerVehicle()&lt;br /&gt;
74      CBaseEntity::IsViewable()&lt;br /&gt;
75      CHL2MP_Player::ChangeTeam(int)&lt;br /&gt;
76      CBaseEntity::OnEntityEvent(EntityEvent_t, void*)&lt;br /&gt;
77      CBaseEntity::CanStandOn(CBaseEntity*) const&lt;br /&gt;
78      CBaseEntity::CanStandOn(edict_t*) const&lt;br /&gt;
79      CBaseEntity::GetEnemy()&lt;br /&gt;
80      CBaseEntity::GetEnemy() const&lt;br /&gt;
81      CBaseEntity::Use(CBaseEntity*, CBaseEntity*, USE_TYPE, float)&lt;br /&gt;
82      CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
83      CBasePlayer::Touch(CBaseEntity*)&lt;br /&gt;
84      CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
85      CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
86      CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
87      CBaseEntity::EndBlocked()&lt;br /&gt;
88      CBasePlayer::PhysicsSimulate()&lt;br /&gt;
89      CHL2MP_Player::UpdateOnRemove()&lt;br /&gt;
90      CHL2_Player::StopLoopingSounds()&lt;br /&gt;
91      CBaseAnimating::Teleport(Vector const*, QAngle const*, Vector const*)&lt;br /&gt;
92      CBaseEntity::NotifySystemEvent(CBaseEntity*, notify_system_event_t, notify_system_event_params_t const&amp;amp;)&lt;br /&gt;
93      CBasePlayer::MakeTracer(Vector const&amp;amp;, CGameTrace const&amp;amp;, int)&lt;br /&gt;
94      CHL2MP_Player::FireBullets(FireBulletsInfo_t const&amp;amp;)&lt;br /&gt;
95      CBasePlayer::DoImpactEffect(CGameTrace&amp;amp;, int)&lt;br /&gt;
96      CBaseEntity::Respawn()&lt;br /&gt;
97      CBaseEntity::IsLockedByMaster()&lt;br /&gt;
98      CBaseAnimating::ModifyOrAppendCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
99      CBasePlayer::NetworkStateChanged_m_lifeState()&lt;br /&gt;
100     CBaseEntity::NetworkStateChanged_m_takedamage()&lt;br /&gt;
101     CBaseEntity::NetworkStateChanged_m_iMaxHealth()&lt;br /&gt;
102     CBaseEntity::NetworkStateChanged_m_iHealth()&lt;br /&gt;
103     CBaseEntity::GetDamageType() const&lt;br /&gt;
104     CBaseEntity::GetDamage()&lt;br /&gt;
105     CBaseEntity::SetDamage(float)&lt;br /&gt;
106     CBasePlayer::EyePosition()&lt;br /&gt;
107     CBasePlayer::EyeAngles()&lt;br /&gt;
108     CBasePlayer::LocalEyeAngles()&lt;br /&gt;
109     CBaseEntity::EarPosition()&lt;br /&gt;
110     CBasePlayer::BodyTarget(Vector const&amp;amp;, bool)&lt;br /&gt;
111     CBaseEntity::HeadTarget(Vector const&amp;amp;)&lt;br /&gt;
112     CBaseEntity::GetVectors(Vector*, Vector*, Vector*) const&lt;br /&gt;
113     CBaseEntity::GetViewOffset()&lt;br /&gt;
114     CBasePlayer::GetSmoothedVelocity()&lt;br /&gt;
115     CBaseAnimating::GetVelocity(Vector*, Vector*)&lt;br /&gt;
116     CBaseEntity::FVisible(CBaseEntity*, int, CBaseEntity**)&lt;br /&gt;
117     CBaseEntity::FVisible(Vector const&amp;amp;, int, CBaseEntity**)&lt;br /&gt;
118     CBaseEntity::CanBeSeen()&lt;br /&gt;
119     CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
120     CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
121     CBaseEntity::CanBePoweredUp()&lt;br /&gt;
122     CBaseEntity::AttemptToPowerup(int, float, float, CBaseEntity*, CDamageModifier*)&lt;br /&gt;
123     CBaseEntity::GetGroundVelocityToApply(Vector&amp;amp;)&lt;br /&gt;
124     CBaseEntity::PhysicsSplash(Vector const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
125     CBaseEntity::Splash()&lt;br /&gt;
126     CBaseEntity::WorldSpaceCenter() const&lt;br /&gt;
127     CBaseEntity::GetSoundEmissionOrigin() const&lt;br /&gt;
128     CBaseEntity::CreateVPhysics()&lt;br /&gt;
129     CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
130     CBasePlayer::VPhysicsDestroyObject()&lt;br /&gt;
131     CBasePlayer::VPhysicsUpdate(IPhysicsObject*)&lt;br /&gt;
132     CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
133     CBaseCombatCharacter::VPhysicsShadowCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
134     CBasePlayer::VPhysicsShadowUpdate(IPhysicsObject*)&lt;br /&gt;
135     CBasePlayer::VPhysicsCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
136     CBaseEntity::VPhysicsFriction(IPhysicsObject*, float, int, int)&lt;br /&gt;
137     CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
138     CBaseEntity::VPhysicsGetObjectList(IPhysicsObject**, int)&lt;br /&gt;
139     CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
140     CBasePlayer::PhysicsSolidMaskForEntity() const&lt;br /&gt;
141     CBaseEntity::ResolveFlyCollisionCustom(CGameTrace&amp;amp;, Vector&amp;amp;)&lt;br /&gt;
142     CBaseEntity::PerformCustomPhysics(Vector*, Vector*, QAngle*, QAngle*)&lt;br /&gt;
143     CBaseAnimating::GetStepOrigin() const&lt;br /&gt;
144     CBaseAnimating::GetStepAngles() const&lt;br /&gt;
145     CBaseEntity::ShouldDrawWaterImpacts()&lt;br /&gt;
146     CBaseEntity::NetworkStateChanged_m_fFlags()&lt;br /&gt;
147     CBasePlayer::NetworkStateChanged_m_hGroundEntity()&lt;br /&gt;
148     CBasePlayer::NetworkStateChanged_m_vecBaseVelocity()&lt;br /&gt;
149     CBaseEntity::NetworkStateChanged_m_nWaterLevel()&lt;br /&gt;
150     CBasePlayer::NetworkStateChanged_m_flFriction()&lt;br /&gt;
151     CBaseEntity::NetworkStateChanged_m_vecVelocity()&lt;br /&gt;
152     CBasePlayer::NetworkStateChanged_m_vecViewOffset()&lt;br /&gt;
153     CBaseAnimating::GetIdealSpeed() const&lt;br /&gt;
154     CBaseAnimating::GetIdealAccel() const&lt;br /&gt;
155     CBaseAnimatingOverlay::StudioFrameAdvance()&lt;br /&gt;
156     CBaseAnimating::IsActivityFinished()&lt;br /&gt;
157     CBaseAnimating::ClampRagdollForce(Vector const&amp;amp;, Vector*)&lt;br /&gt;
158     CHL2MP_Player::BecomeRagdollOnClient(Vector const&amp;amp;)&lt;br /&gt;
159     CBaseAnimating::IsRagdoll()&lt;br /&gt;
160     CBaseAnimating::CanBecomeRagdoll()&lt;br /&gt;
161     CBaseAnimatingOverlay::GetSkeleton(Vector*, Quaternion*, int)&lt;br /&gt;
162     CBaseAnimating::GetBoneTransform(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
163     CBaseAnimating::SetupBones(matrix3x4_t*, int)&lt;br /&gt;
164     CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
165     CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating*)&lt;br /&gt;
166     CBaseAnimating::HandleAnimEvent(animevent_t*)&lt;br /&gt;
167     CBaseAnimating::GetAttachment(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
168     CBaseAnimating::InitBoneControllers()&lt;br /&gt;
169     CBaseAnimating::GetGroundSpeedVelocity()&lt;br /&gt;
170     CBaseAnimating::DrawServerHitboxes(float, bool)&lt;br /&gt;
171     CBaseAnimating::Ignite(float, bool, float, bool)&lt;br /&gt;
172     CBaseAnimating::Extinguish()&lt;br /&gt;
173     CBaseCombatCharacter::SetLightingOrigin(CBaseEntity*)&lt;br /&gt;
174     CBaseFlex::SetViewtarget(Vector const&amp;amp;)&lt;br /&gt;
175     CBaseFlex::StartSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*, CChoreoActor*, CBaseEntity*)&lt;br /&gt;
176     CBaseFlex::ProcessSceneEvents()&lt;br /&gt;
177     CBaseFlex::ProcessSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
178     CBaseFlex::ClearSceneEvent(CSceneEventInfo*, bool, bool)&lt;br /&gt;
179     CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo*, float, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
180     CBaseCombatCharacter::GetPhysicsImpactDamageTable()&lt;br /&gt;
181     CBaseCombatCharacter::FInViewCone(CBaseEntity*)&lt;br /&gt;
182     CBaseCombatCharacter::FInViewCone(Vector const&amp;amp;)&lt;br /&gt;
183     CBaseCombatCharacter::FInAimCone(CBaseEntity*)&lt;br /&gt;
184     CBaseCombatCharacter::FInAimCone(Vector const&amp;amp;)&lt;br /&gt;
185     CHL2_Player::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
186     CBaseCombatCharacter::FindMissTarget()&lt;br /&gt;
187     CHL2_Player::HandleInteraction(int, void*, CBaseCombatCharacter*)&lt;br /&gt;
188     CBasePlayer::BodyAngles()&lt;br /&gt;
189     CBaseCombatCharacter::BodyDirection2D()&lt;br /&gt;
190     CBaseCombatCharacter::BodyDirection3D()&lt;br /&gt;
191     CBaseCombatCharacter::HeadDirection2D()&lt;br /&gt;
192     CBaseCombatCharacter::HeadDirection3D()&lt;br /&gt;
193     CHL2_Player::EyeDirection2D()&lt;br /&gt;
194     CHL2_Player::EyeDirection3D()&lt;br /&gt;
195     CHL2_Player::GiveAmmo(int, int, bool)&lt;br /&gt;
196     CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
197     CBaseCombatCharacter::Weapon_TranslateActivity(Activity, bool*)&lt;br /&gt;
198     CHL2_Player::Weapon_CanUse(CBaseCombatWeapon*)&lt;br /&gt;
199     CHL2_Player::Weapon_Equip(CBaseCombatWeapon*)&lt;br /&gt;
200     CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon*)&lt;br /&gt;
201     CHL2MP_Player::Weapon_Drop(CBaseCombatWeapon*, Vector const*, Vector const*)&lt;br /&gt;
202     CHL2MP_Player::Weapon_Switch(CBaseCombatWeapon*, int)&lt;br /&gt;
203     CBasePlayer::Weapon_ShootPosition()&lt;br /&gt;
204     CBaseCombatCharacter::Weapon_CanSwitchTo(CBaseCombatWeapon*)&lt;br /&gt;
205     CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon*)&lt;br /&gt;
206     CBaseCombatCharacter::Weapon_GetSlot(int) const&lt;br /&gt;
207     CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
208     CBasePlayer::RemovePlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
209     CBasePlayer::OnTakeDamage_Alive(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
210     CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
211     CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
212     CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*, CBaseEntity*)&lt;br /&gt;
213     CHL2_Player::NotifyFriendsOfDamage(CBaseEntity*)&lt;br /&gt;
214     CBaseCombatCharacter::GetDeathActivity()&lt;br /&gt;
215     CBaseCombatCharacter::CorpseGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
216     CBaseCombatCharacter::CorpseFade()&lt;br /&gt;
217     CBaseCombatCharacter::HasHumanGibs()&lt;br /&gt;
218     CBaseCombatCharacter::HasAlienGibs()&lt;br /&gt;
219     CBaseCombatCharacter::ShouldGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
220     CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
221     CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
222     CBasePlayer::Event_Dying()&lt;br /&gt;
223     CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
224     CBaseCombatCharacter::CheckTraceHullAttack(float, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
225     CBaseCombatCharacter::CheckTraceHullAttack(Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
226     CBaseCombatCharacter::IRelationType(CBaseEntity*)&lt;br /&gt;
227     CBaseCombatCharacter::IRelationPriority(CBaseEntity*)&lt;br /&gt;
228     CHL2_Player::CalcWeaponProficiency(CBaseCombatWeapon*)&lt;br /&gt;
229     CHL2MP_Player::GetAttackSpread(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
230     CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
231     CBasePlayer::DoMuzzleFlash()&lt;br /&gt;
232     CBaseCombatCharacter::AddEntityRelationship(CBaseEntity*, Disposition_t, int)&lt;br /&gt;
233     CBaseCombatCharacter::AddClassRelationship(Class_T, Disposition_t, int)&lt;br /&gt;
234     CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
235     CBasePlayer::NetworkStateChanged_m_iAmmo()&lt;br /&gt;
236     CHL2MP_Player::CreateViewModel(int)&lt;br /&gt;
237     CHL2_Player::SetupVisibility(CBaseEntity*, unsigned char*, int)&lt;br /&gt;
238     CHL2MP_Player::WantsLagCompensationOnEntity(CBasePlayer const*, CUserCmd const*, CBitVec&amp;lt;2048&amp;gt; const*) const&lt;br /&gt;
239     CBasePlayer::SharedSpawn()&lt;br /&gt;
240     CBasePlayer::InitialSpawn()&lt;br /&gt;
241     CBasePlayer::InitHUD()&lt;br /&gt;
242     CBasePlayer::ShowViewPortPanel(char const*, bool, KeyValues*)&lt;br /&gt;
243     CBasePlayer::PlayerDeathThink()&lt;br /&gt;
244     CBasePlayer::Jump()&lt;br /&gt;
245     CBasePlayer::Duck()&lt;br /&gt;
246     CHL2MP_Player::PreThink()&lt;br /&gt;
247     CHL2MP_Player::PostThink()&lt;br /&gt;
248     CBasePlayer::DamageEffect(float, int)&lt;br /&gt;
249     CHL2_Player::OnDamagedByExplosion(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
250     CBasePlayer::ShouldFadeOnDeath()&lt;br /&gt;
251     CBasePlayer::IsFakeClient()&lt;br /&gt;
252     CBasePlayer::GetPlayerMins() const&lt;br /&gt;
253     CBasePlayer::GetPlayerMaxs() const&lt;br /&gt;
254     CBasePlayer::CalcRoll(QAngle const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
255     CBasePlayer::PackDeadPlayerItems()&lt;br /&gt;
256     CBasePlayer::RemoveAllItems(bool)&lt;br /&gt;
257     CBasePlayer::Weapon_SetLast(CBaseCombatWeapon*)&lt;br /&gt;
258     CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
259     CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon*)&lt;br /&gt;
260     CHL2_Player::UpdateClientData()&lt;br /&gt;
261     CHL2_Player::ExitLadder()&lt;br /&gt;
262     CHL2MP_Player::FlashlightIsOn()&lt;br /&gt;
263     CHL2MP_Player::FlashlightTurnOn()&lt;br /&gt;
264     CHL2MP_Player::FlashlightTurnOff()&lt;br /&gt;
265     CBasePlayer::UpdateStepSound(surfacedata_t*, Vector const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
266     CHL2MP_Player::PlayStepSound(Vector&amp;amp;, surfacedata_t*, float, bool)&lt;br /&gt;
267     CHL2MP_Player::DeathSound()&lt;br /&gt;
268     CHL2MP_Player::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
269     CBasePlayer::ImpulseCommands()&lt;br /&gt;
270     CHL2MP_Player::CheatImpulseCommands(int)&lt;br /&gt;
271     CHL2MP_Player::ClientCommand(char const*)&lt;br /&gt;
272     CHL2MP_Player::StartObserverMode(int)&lt;br /&gt;
273     CBasePlayer::StopObserverMode()&lt;br /&gt;
274     CBasePlayer::SetObserverMode(int)&lt;br /&gt;
275     CBasePlayer::GetObserverMode()&lt;br /&gt;
276     CBasePlayer::SetObserverTarget(CBaseEntity*)&lt;br /&gt;
277     CBasePlayer::ObserverUse(bool)&lt;br /&gt;
278     CBasePlayer::GetObserverTarget()&lt;br /&gt;
279     CBasePlayer::FindNextObserverTarget(bool)&lt;br /&gt;
280     CBasePlayer::IsValidObserverTarget(CBaseEntity*)&lt;br /&gt;
281     CBasePlayer::CheckObserverSettings()&lt;br /&gt;
282     CBasePlayer::JumptoPosition(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
283     CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
284     CBasePlayer::ResetObserverMode()&lt;br /&gt;
285     CHL2_Player::CreateCorpse()&lt;br /&gt;
286     CHL2MP_Player::EntSelectSpawnPoint()&lt;br /&gt;
287     CHL2_Player::GetInVehicle(IServerVehicle*, int)&lt;br /&gt;
288     CBasePlayer::LeaveVehicle(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
289     CBasePlayer::OnVehicleStart()&lt;br /&gt;
290     CBasePlayer::OnVehicleEnd(Vector&amp;amp;)&lt;br /&gt;
291     CHL2MP_Player::BumpWeapon(CBaseCombatWeapon*)&lt;br /&gt;
292     CBasePlayer::SelectLastItem()&lt;br /&gt;
293     CBasePlayer::SelectItem(char const*, int)&lt;br /&gt;
294     CHL2_Player::ItemPostFrame()&lt;br /&gt;
295     CBasePlayer::GiveNamedItem(char const*, int)&lt;br /&gt;
296     CBasePlayer::CheckTrainUpdate()&lt;br /&gt;
297     CHL2_Player::SetPlayerUnderwater(bool)&lt;br /&gt;
298     CHL2_Player::CanBreatheUnderwater() const&lt;br /&gt;
299     CHL2_Player::PlayerUse()&lt;br /&gt;
300     CHL2_Player::PlayUseDenySound()&lt;br /&gt;
301     CBasePlayer::FindUseEntity()&lt;br /&gt;
302     CBasePlayer::IsUseableEntity(CBaseEntity*, unsigned int)&lt;br /&gt;
303     CHL2MP_Player::PickupObject(CBaseEntity*, bool)&lt;br /&gt;
304     CHL2_Player::ForceDropOfCarriedPhysObjects(CBaseEntity*)&lt;br /&gt;
305     CHL2_Player::GetHeldObjectMass(IPhysicsObject*)&lt;br /&gt;
306     CBasePlayer::UpdateGeigerCounter()&lt;br /&gt;
307     CHL2_Player::GetAutoaimVector(float)&lt;br /&gt;
308     CBasePlayer::ShouldAutoaim()&lt;br /&gt;
309     CBasePlayer::ForceClientDllUpdate()&lt;br /&gt;
310     CBasePlayer::ProcessUsercmds(CUserCmd*, int, int, int, bool)&lt;br /&gt;
311     CHL2_Player::PlayerRunCommand(CUserCmd*, IMoveHelper*)&lt;br /&gt;
312     CBasePlayer::CanSpeak()&lt;br /&gt;
313     CBasePlayer::CanHearChatFrom(CBasePlayer*)&lt;br /&gt;
314     CHL2_Player::ModifyOrAppendPlayerCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
315     CBasePlayer::CheckChatText(char*, int)&lt;br /&gt;
316     CHL2_Player::IsFollowingPhysics()&lt;br /&gt;
317     CHL2_Player::InitVCollision()&lt;br /&gt;
318     CBasePlayer::UpdatePhysicsShadowToCurrentPosition()&lt;br /&gt;
319     CHL2_Player::EquipSuit()&lt;br /&gt;
320     CBasePlayer::IsBot()&lt;br /&gt;
321     CBasePlayer::NetworkStateChanged_m_ArmorValue()&lt;br /&gt;
322     CHL2_Player::CommanderMode()&lt;br /&gt;
323     CHL2_Player::GetIdleTime() const&lt;br /&gt;
324     CHL2_Player::GetMoveTime() const&lt;br /&gt;
325     CHL2_Player::GetLastDamageTime() const&lt;br /&gt;
326     CHL2_Player::IsDucking() const&lt;br /&gt;
327     CHL2_Player::Weapon_Lower()&lt;br /&gt;
328     CHL2_Player::Weapon_Ready()&lt;br /&gt;
329     CHL2_Player::IsHoldingEntity(CBaseEntity*)&lt;br /&gt;
330     CHL2_Player::UpdateWeaponPosture()&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=2940</id>
		<title>Virtual Offsets (Source Mods)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=2940"/>
		<updated>2006-05-19T00:56:06Z</updated>

		<summary type="html">&lt;p&gt;Showdax: /* HL2:DM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Documentation (SourceMM)]]&lt;br /&gt;
== Calling virtual functions ==&lt;br /&gt;
I got this method from [[User:Mani|Mani]], who I believe got it from [[User:PM|Pavol Marko]]. Thank you!&lt;br /&gt;
&lt;br /&gt;
I hope to expand on an actual explantaion when I have the time (and understand it better). Hopefully, someone can expand on this, but for now I'll just post the examples and a list of the CCSPlayer virtual function table offsets.&lt;br /&gt;
&lt;br /&gt;
== Offset Lists ==&lt;br /&gt;
==== CS:S ====&lt;br /&gt;
* [[CCSPlayer_offset_list_(SourceMM)|CCSPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== DOD:S ====&lt;br /&gt;
* [[CDODPlayer_offset_list_(SourceMM)|CDODPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== HL2:DM ====&lt;br /&gt;
* [[CHL2MP_Player_offset_list_(SourceMM)|CHL2MP_Player]]&lt;br /&gt;
&lt;br /&gt;
== How to use the examples ==&lt;br /&gt;
&lt;br /&gt;
Basically, this lets you call any [[virtual function]] by knowing it's offset. A table is created for each class that lists the address of the function for each virtual function. This method takes advantage of that to call those addresses.&lt;br /&gt;
&lt;br /&gt;
Look at the examples below and edit to match the function you want to call:&lt;br /&gt;
Use the offset for the function you want to call in this line. ([[CCSPlayer_offset_list_(SourceMM)]])&lt;br /&gt;
&amp;lt;cpp&amp;gt;void *func = vtable[m_Off_GiveNamedItem];&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Change this line to match your return type and parameters:&lt;br /&gt;
&amp;lt;cpp&amp;gt;union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Call the original function with your parameters (change the return type to match the function you're calling):&lt;br /&gt;
&amp;lt;cpp&amp;gt;return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll need to add an empty class for the union. Something like this:&lt;br /&gt;
&amp;lt;cpp&amp;gt;class VfuncEmptyClass {};&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;datamap_t *VFuncs::GetDataDescMap(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GetDataDescMap]; &lt;br /&gt;
&lt;br /&gt;
	union {datamap_t *(VfuncEmptyClass::*mfpnew)();&lt;br /&gt;
#ifndef __linux__&lt;br /&gt;
        void *addr;	} u; 	u.addr = func;&lt;br /&gt;
#else /* GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 */&lt;br /&gt;
			struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	return (datamap_t *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::SetModel(CBaseEntity *pThisPtr, const char *ModelName)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_SetModel]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const char *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ModelName);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Teleport(CBaseEntity *pThisPtr, const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Teleport]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const Vector *, const QAngle *, const Vector *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(newPosition, newAngles, newVelocity);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Vector VFuncs::EyePosition( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyePosition]; &lt;br /&gt;
&lt;br /&gt;
	union {Vector (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (Vector) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
QAngle &amp;amp;VFuncs::EyeAngles( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyeAngles]; &lt;br /&gt;
&lt;br /&gt;
	union {QAngle&amp;amp; (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (QAngle&amp;amp;) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Ignite(CBaseEntity *pThisPtr, float flFlameLifetime, bool bNPCOnly, float flSize, bool bCalledByLevelDesigner)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Ignite]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(float , bool , float , bool );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(flFlameLifetime, bNPCOnly, flSize, bCalledByLevelDesigner);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CBaseEntity *VFuncs::GiveNamedItem(CBaseEntity *pThisPtr, const char *ItemName, int iSubType)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GiveNamedItem]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::CommitSuicide(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_CommitSuicide]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=2939</id>
		<title>Virtual Offsets (Source Mods)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=2939"/>
		<updated>2006-05-19T00:55:34Z</updated>

		<summary type="html">&lt;p&gt;Showdax: /* Offset Lists */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Documentation (SourceMM)]]&lt;br /&gt;
== Calling virtual functions ==&lt;br /&gt;
I got this method from [[User:Mani|Mani]], who I believe got it from [[User:PM|Pavol Marko]]. Thank you!&lt;br /&gt;
&lt;br /&gt;
I hope to expand on an actual explantaion when I have the time (and understand it better). Hopefully, someone can expand on this, but for now I'll just post the examples and a list of the CCSPlayer virtual function table offsets.&lt;br /&gt;
&lt;br /&gt;
== Offset Lists ==&lt;br /&gt;
==== CS:S ====&lt;br /&gt;
* [[CCSPlayer_offset_list_(SourceMM)|CCSPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== DOD:S ====&lt;br /&gt;
* [[CDODPlayer_offset_list_(SourceMM)|CDODPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== HL2:DM ====&lt;br /&gt;
* [[CHL2_Player_offset_list_(SourceMM)|CHL2_Player]]&lt;br /&gt;
&lt;br /&gt;
== How to use the examples ==&lt;br /&gt;
&lt;br /&gt;
Basically, this lets you call any [[virtual function]] by knowing it's offset. A table is created for each class that lists the address of the function for each virtual function. This method takes advantage of that to call those addresses.&lt;br /&gt;
&lt;br /&gt;
Look at the examples below and edit to match the function you want to call:&lt;br /&gt;
Use the offset for the function you want to call in this line. ([[CCSPlayer_offset_list_(SourceMM)]])&lt;br /&gt;
&amp;lt;cpp&amp;gt;void *func = vtable[m_Off_GiveNamedItem];&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Change this line to match your return type and parameters:&lt;br /&gt;
&amp;lt;cpp&amp;gt;union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Call the original function with your parameters (change the return type to match the function you're calling):&lt;br /&gt;
&amp;lt;cpp&amp;gt;return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll need to add an empty class for the union. Something like this:&lt;br /&gt;
&amp;lt;cpp&amp;gt;class VfuncEmptyClass {};&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;datamap_t *VFuncs::GetDataDescMap(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GetDataDescMap]; &lt;br /&gt;
&lt;br /&gt;
	union {datamap_t *(VfuncEmptyClass::*mfpnew)();&lt;br /&gt;
#ifndef __linux__&lt;br /&gt;
        void *addr;	} u; 	u.addr = func;&lt;br /&gt;
#else /* GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 */&lt;br /&gt;
			struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	return (datamap_t *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::SetModel(CBaseEntity *pThisPtr, const char *ModelName)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_SetModel]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const char *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ModelName);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Teleport(CBaseEntity *pThisPtr, const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Teleport]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const Vector *, const QAngle *, const Vector *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(newPosition, newAngles, newVelocity);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Vector VFuncs::EyePosition( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyePosition]; &lt;br /&gt;
&lt;br /&gt;
	union {Vector (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (Vector) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
QAngle &amp;amp;VFuncs::EyeAngles( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyeAngles]; &lt;br /&gt;
&lt;br /&gt;
	union {QAngle&amp;amp; (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (QAngle&amp;amp;) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Ignite(CBaseEntity *pThisPtr, float flFlameLifetime, bool bNPCOnly, float flSize, bool bCalledByLevelDesigner)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Ignite]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(float , bool , float , bool );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(flFlameLifetime, bNPCOnly, flSize, bCalledByLevelDesigner);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CBaseEntity *VFuncs::GiveNamedItem(CBaseEntity *pThisPtr, const char *ItemName, int iSubType)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GiveNamedItem]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::CommitSuicide(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_CommitSuicide]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=2938</id>
		<title>Virtual Offsets (Source Mods)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Virtual_Offsets_(Source_Mods)&amp;diff=2938"/>
		<updated>2006-05-19T00:35:43Z</updated>

		<summary type="html">&lt;p&gt;Showdax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Documentation (SourceMM)]]&lt;br /&gt;
== Calling virtual functions ==&lt;br /&gt;
I got this method from [[User:Mani|Mani]], who I believe got it from [[User:PM|Pavol Marko]]. Thank you!&lt;br /&gt;
&lt;br /&gt;
I hope to expand on an actual explantaion when I have the time (and understand it better). Hopefully, someone can expand on this, but for now I'll just post the examples and a list of the CCSPlayer virtual function table offsets.&lt;br /&gt;
&lt;br /&gt;
== Offset Lists ==&lt;br /&gt;
==== CS:S ====&lt;br /&gt;
* [[CCSPlayer_offset_list_(SourceMM)|CCSPlayer]]&lt;br /&gt;
&lt;br /&gt;
==== DOD:S ====&lt;br /&gt;
* [[CDODPlayer_offset_list_(SourceMM)|CDODPlayer]]&lt;br /&gt;
&lt;br /&gt;
== How to use the examples ==&lt;br /&gt;
&lt;br /&gt;
Basically, this lets you call any [[virtual function]] by knowing it's offset. A table is created for each class that lists the address of the function for each virtual function. This method takes advantage of that to call those addresses.&lt;br /&gt;
&lt;br /&gt;
Look at the examples below and edit to match the function you want to call:&lt;br /&gt;
Use the offset for the function you want to call in this line. ([[CCSPlayer_offset_list_(SourceMM)]])&lt;br /&gt;
&amp;lt;cpp&amp;gt;void *func = vtable[m_Off_GiveNamedItem];&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Change this line to match your return type and parameters:&lt;br /&gt;
&amp;lt;cpp&amp;gt;union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Call the original function with your parameters (change the return type to match the function you're calling):&lt;br /&gt;
&amp;lt;cpp&amp;gt;return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You'll need to add an empty class for the union. Something like this:&lt;br /&gt;
&amp;lt;cpp&amp;gt;class VfuncEmptyClass {};&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;datamap_t *VFuncs::GetDataDescMap(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GetDataDescMap]; &lt;br /&gt;
&lt;br /&gt;
	union {datamap_t *(VfuncEmptyClass::*mfpnew)();&lt;br /&gt;
#ifndef __linux__&lt;br /&gt;
        void *addr;	} u; 	u.addr = func;&lt;br /&gt;
#else /* GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 */&lt;br /&gt;
			struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
	return (datamap_t *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::SetModel(CBaseEntity *pThisPtr, const char *ModelName)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_SetModel]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const char *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ModelName);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Teleport(CBaseEntity *pThisPtr, const Vector *newPosition, const QAngle *newAngles, const Vector *newVelocity)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Teleport]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(const Vector *, const QAngle *, const Vector *);&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(newPosition, newAngles, newVelocity);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Vector VFuncs::EyePosition( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyePosition]; &lt;br /&gt;
&lt;br /&gt;
	union {Vector (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (Vector) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
QAngle &amp;amp;VFuncs::EyeAngles( CBaseEntity *pThisPtr )&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_EyeAngles]; &lt;br /&gt;
&lt;br /&gt;
	union {QAngle&amp;amp; (VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (QAngle&amp;amp;) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)( );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void VFuncs::Ignite(CBaseEntity *pThisPtr, float flFlameLifetime, bool bNPCOnly, float flSize, bool bCalledByLevelDesigner)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_Ignite]; &lt;br /&gt;
&lt;br /&gt;
	union {void (VfuncEmptyClass::*mfpnew)(float , bool , float , bool );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(void) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(flFlameLifetime, bNPCOnly, flSize, bCalledByLevelDesigner);&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
CBaseEntity *VFuncs::GiveNamedItem(CBaseEntity *pThisPtr, const char *ItemName, int iSubType)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_GiveNamedItem]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)(const char *, int );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	return (CBaseEntity *) (reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)(ItemName, iSubType);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void VFuncs::CommitSuicide(CBaseEntity *pThisPtr)&lt;br /&gt;
{&lt;br /&gt;
	void **this_ptr = *(void ***)&amp;amp;pThisPtr;&lt;br /&gt;
	void **vtable = *(void ***)pThisPtr;&lt;br /&gt;
	void *func = vtable[m_Off_CommitSuicide]; &lt;br /&gt;
&lt;br /&gt;
	union {CBaseEntity *(VfuncEmptyClass::*mfpnew)( void );&lt;br /&gt;
	#ifndef __linux__&lt;br /&gt;
			void *addr;	} u; 	u.addr = func;&lt;br /&gt;
	#else // GCC's member function pointers all contain a this pointer adjustor. You'd probably set it to 0 &lt;br /&gt;
				struct {void *addr; intptr_t adjustor;} s; } u; u.s.addr = func; u.s.adjustor = 0;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	(reinterpret_cast&amp;lt;VfuncEmptyClass*&amp;gt;(this_ptr)-&amp;gt;*u.mfpnew)();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=CDODPlayer_Offset_List_(Day_of_Defeat:_Source)&amp;diff=2937</id>
		<title>CDODPlayer Offset List (Day of Defeat: Source)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=CDODPlayer_Offset_List_(Day_of_Defeat:_Source)&amp;diff=2937"/>
		<updated>2006-05-19T00:35:12Z</updated>

		<summary type="html">&lt;p&gt;Showdax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Also for use when using [[Vfunc_offsets_%28SourceMM%29|VFunc offsets]].&lt;br /&gt;
&lt;br /&gt;
These are &amp;lt;strong&amp;gt;Linux offsets&amp;lt;/strong&amp;gt;. Windows offsets are one less. These should be good as of 2006/05/18.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;1       CDODPlayer::~CDODPlayer()&lt;br /&gt;
2       CBaseEntity::SetRefEHandle(CBaseHandle const&amp;amp;)&lt;br /&gt;
3       CBaseEntity::GetRefEHandle() const&lt;br /&gt;
4       CBaseEntity::GetCollideable()&lt;br /&gt;
5       CBaseEntity::GetNetworkable()&lt;br /&gt;
6       CBaseEntity::GetBaseEntity()&lt;br /&gt;
7       CBaseEntity::GetModelIndex() const&lt;br /&gt;
8       CBaseEntity::GetModelName() const&lt;br /&gt;
9       CBaseEntity::SetModelIndex(int)&lt;br /&gt;
10      CDODPlayer::GetServerClass()&lt;br /&gt;
11      CDODPlayer::GetClassName()&lt;br /&gt;
12      CDODPlayer::YouForgotToImplementOrDeclareServerClass()&lt;br /&gt;
13      CDODPlayer::GetDataDescMap()&lt;br /&gt;
14      CBaseAnimating::TestCollision(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
15      CBaseAnimating::TestHitboxes(Ray_t const&amp;amp;, unsigned int, CGameTrace&amp;amp;)&lt;br /&gt;
16      CBaseEntity::ComputeWorldSpaceSurroundingBox(Vector*, Vector*)&lt;br /&gt;
17      CBaseEntity::ShouldCollide(int, int) const&lt;br /&gt;
18      CBaseEntity::SetOwnerEntity(CBaseEntity*)&lt;br /&gt;
19      CBasePlayer::ShouldTransmit(CCheckTransmitInfo const*)&lt;br /&gt;
20      CBasePlayer::UpdateTransmitState()&lt;br /&gt;
21      CBaseCombatCharacter::SetTransmit(CCheckTransmitInfo*, bool)&lt;br /&gt;
22      CBasePlayer::GetTracerType()&lt;br /&gt;
23      CDODPlayer::Spawn()&lt;br /&gt;
24      CDODPlayer::Precache()&lt;br /&gt;
25      CBaseFlex::SetModel(char const*)&lt;br /&gt;
26      CBaseEntity::PostConstructor(char const*)&lt;br /&gt;
27      CBaseEntity::ParseMapData(CEntityMapData*)&lt;br /&gt;
28      CBaseEntity::KeyValue(char const*, char const*)&lt;br /&gt;
29      CBaseEntity::KeyValue(char const*, float)&lt;br /&gt;
30      CBaseEntity::KeyValue(char const*, Vector)&lt;br /&gt;
31      CBaseEntity::ValidateEntityConnections()&lt;br /&gt;
32      CBasePlayer::Activate()&lt;br /&gt;
33      CBasePlayer::ObjectCaps()&lt;br /&gt;
34      CBaseEntity::AcceptInput(char const*, CBaseEntity*, CBaseEntity*, variant_t, int)&lt;br /&gt;
35      CBaseAnimating::GetInputDispatchEffectPosition(char const*, Vector&amp;amp;, QAngle&amp;amp;)&lt;br /&gt;
36      CBasePlayer::DrawDebugGeometryOverlays()&lt;br /&gt;
37      CBaseAnimating::DrawDebugTextOverlays()&lt;br /&gt;
38      CBasePlayer::Save(ISave&amp;amp;)&lt;br /&gt;
39      CBasePlayer::Restore(IRestore&amp;amp;)&lt;br /&gt;
40      CBasePlayer::ShouldSavePhysics()&lt;br /&gt;
41      CBaseEntity::OnSave(IEntitySaveUtils*)&lt;br /&gt;
42      CBasePlayer::OnRestore()&lt;br /&gt;
43      CBasePlayer::RequiredEdictIndex()&lt;br /&gt;
44      CBaseEntity::MoveDone()&lt;br /&gt;
45      CBaseEntity::Think()&lt;br /&gt;
46      CBaseEntity::NetworkStateChanged_m_nNextThinkTick()&lt;br /&gt;
47      CBaseAnimating::GetBaseAnimating()&lt;br /&gt;
48      CBaseEntity::GetResponseSystem()&lt;br /&gt;
49      CBaseEntity::DispatchResponse(char const*)&lt;br /&gt;
50      CBasePlayer::Classify()&lt;br /&gt;
51      CBaseEntity::DeathNotice(CBaseEntity*)&lt;br /&gt;
52      CBaseEntity::PassesDamageFilter(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
53      CDODPlayer::TraceAttack(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;, CGameTrace*)&lt;br /&gt;
54      CBaseEntity::CanBeHitByMeleeAttack(CBaseEntity*)&lt;br /&gt;
55      CDODPlayer::OnTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
56      CBasePlayer::TakeHealth(float, int)&lt;br /&gt;
57      CDODPlayer::Event_Killed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
58      CBaseEntity::Event_KilledOther(CBaseEntity*)&lt;br /&gt;
59      CBaseCombatCharacter::BloodColor()&lt;br /&gt;
60      CBaseEntity::IsTriggered(CBaseEntity*)&lt;br /&gt;
61      CBaseEntity::IsNPC() const&lt;br /&gt;
62      CBaseCombatCharacter::MyCombatCharacterPointer()&lt;br /&gt;
63      CBaseEntity::GetDelay()&lt;br /&gt;
64      CBaseEntity::IsMoving()&lt;br /&gt;
65      CBaseEntity::DamageDecal(int, int)&lt;br /&gt;
66      CBaseEntity::DecalTrace(CGameTrace*, char const*)&lt;br /&gt;
67      CBaseEntity::ImpactTrace(CGameTrace*, int, char*)&lt;br /&gt;
68      CBaseEntity::OnControls(CBaseEntity*)&lt;br /&gt;
69      CBaseEntity::HasTarget(string_t)&lt;br /&gt;
70      CBasePlayer::IsPlayer() const&lt;br /&gt;
71      CBasePlayer::IsNetClient() const&lt;br /&gt;
72      CBaseEntity::IsTemplate()&lt;br /&gt;
73      CBaseEntity::IsBaseObject() const&lt;br /&gt;
74      CBaseEntity::GetServerVehicle()&lt;br /&gt;
75      CBaseEntity::IsViewable()&lt;br /&gt;
76      CDODPlayer::ChangeTeam(int)&lt;br /&gt;
77      CBaseEntity::OnEntityEvent(EntityEvent_t, void*)&lt;br /&gt;
78      CBaseEntity::CanStandOn(CBaseEntity*) const&lt;br /&gt;
79      CBaseEntity::CanStandOn(edict_t*) const&lt;br /&gt;
80      CBaseEntity::GetEnemy()&lt;br /&gt;
81      CBaseEntity::GetEnemy() const&lt;br /&gt;
82      CBaseEntity::Use(CBaseEntity*, CBaseEntity*, USE_TYPE, float)&lt;br /&gt;
83      CBaseEntity::StartTouch(CBaseEntity*)&lt;br /&gt;
84      CBasePlayer::Touch(CBaseEntity*)&lt;br /&gt;
85      CBaseEntity::EndTouch(CBaseEntity*)&lt;br /&gt;
86      CBaseEntity::StartBlocked(CBaseEntity*)&lt;br /&gt;
87      CBaseEntity::Blocked(CBaseEntity*)&lt;br /&gt;
88      CBaseEntity::EndBlocked()&lt;br /&gt;
89      CBasePlayer::PhysicsSimulate()&lt;br /&gt;
90      CBasePlayer::UpdateOnRemove()&lt;br /&gt;
91      CBaseEntity::StopLoopingSounds()&lt;br /&gt;
92      CBaseEntity::SUB_AllowedToFade()&lt;br /&gt;
93      CBaseAnimating::Teleport(Vector const*, QAngle const*, Vector const*)&lt;br /&gt;
94      CBaseEntity::NotifySystemEvent(CBaseEntity*, notify_system_event_t, notify_system_event_params_t const&amp;amp;)&lt;br /&gt;
95      CBasePlayer::MakeTracer(Vector const&amp;amp;, CGameTrace const&amp;amp;, int)&lt;br /&gt;
96      CDODPlayer::FireBullets(FireBulletsInfo_t const&amp;amp;)&lt;br /&gt;
97      CBasePlayer::DoImpactEffect(CGameTrace&amp;amp;, int)&lt;br /&gt;
98      CBaseEntity::Respawn()&lt;br /&gt;
99      CBaseEntity::IsLockedByMaster()&lt;br /&gt;
100     CBaseAnimating::ModifyOrAppendCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
101     CBasePlayer::NetworkStateChanged_m_lifeState()&lt;br /&gt;
102     CBaseEntity::NetworkStateChanged_m_takedamage()&lt;br /&gt;
103     CBaseEntity::NetworkStateChanged_m_iMaxHealth()&lt;br /&gt;
104     CBaseEntity::NetworkStateChanged_m_iHealth()&lt;br /&gt;
105     CBaseEntity::GetDamageType() const&lt;br /&gt;
106     CBaseEntity::GetDamage()&lt;br /&gt;
107     CBaseEntity::SetDamage(float)&lt;br /&gt;
108     CBasePlayer::EyePosition()&lt;br /&gt;
109     CBasePlayer::EyeAngles()&lt;br /&gt;
110     CBasePlayer::LocalEyeAngles()&lt;br /&gt;
111     CBaseEntity::EarPosition()&lt;br /&gt;
112     CBasePlayer::BodyTarget(Vector const&amp;amp;, bool)&lt;br /&gt;
113     CBaseEntity::HeadTarget(Vector const&amp;amp;)&lt;br /&gt;
114     CBaseEntity::GetVectors(Vector*, Vector*, Vector*) const&lt;br /&gt;
115     CBaseEntity::GetViewOffset()&lt;br /&gt;
116     CBasePlayer::GetSmoothedVelocity()&lt;br /&gt;
117     CBaseAnimating::GetVelocity(Vector*, Vector*)&lt;br /&gt;
118     CBaseEntity::FVisible(CBaseEntity*, int, CBaseEntity**)&lt;br /&gt;
119     CBaseEntity::FVisible(Vector const&amp;amp;, int, CBaseEntity**)&lt;br /&gt;
120     CBaseEntity::CanBeSeen()&lt;br /&gt;
121     CBaseEntity::GetAttackDamageScale(CBaseEntity*)&lt;br /&gt;
122     CBaseEntity::GetReceivedDamageScale(CBaseEntity*)&lt;br /&gt;
123     CBaseEntity::CanBePoweredUp()&lt;br /&gt;
124     CBaseEntity::AttemptToPowerup(int, float, float, CBaseEntity*, CDamageModifier*)&lt;br /&gt;
125     CBaseEntity::GetGroundVelocityToApply(Vector&amp;amp;)&lt;br /&gt;
126     CBaseEntity::PhysicsSplash(Vector const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
127     CBaseEntity::Splash()&lt;br /&gt;
128     CBaseEntity::WorldSpaceCenter() const&lt;br /&gt;
129     CBaseEntity::GetSoundEmissionOrigin() const&lt;br /&gt;
130     CBaseEntity::CreateVPhysics()&lt;br /&gt;
131     CBaseEntity::ForceVPhysicsCollide(CBaseEntity*)&lt;br /&gt;
132     CBasePlayer::VPhysicsDestroyObject()&lt;br /&gt;
133     CBasePlayer::VPhysicsUpdate(IPhysicsObject*)&lt;br /&gt;
134     CBaseEntity::VPhysicsTakeDamage(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
135     CBaseCombatCharacter::VPhysicsShadowCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
136     CDODPlayer::VPhysicsShadowUpdate(IPhysicsObject*)&lt;br /&gt;
137     CBasePlayer::VPhysicsCollision(int, gamevcollisionevent_t*)&lt;br /&gt;
138     CBaseEntity::VPhysicsFriction(IPhysicsObject*, float, int, int)&lt;br /&gt;
139     CBaseEntity::UpdatePhysicsShadowToCurrentPosition(float)&lt;br /&gt;
140     CBaseEntity::VPhysicsGetObjectList(IPhysicsObject**, int)&lt;br /&gt;
141     CBaseEntity::HasPhysicsAttacker(float)&lt;br /&gt;
142     CBasePlayer::PhysicsSolidMaskForEntity() const&lt;br /&gt;
143     CBaseEntity::ResolveFlyCollisionCustom(CGameTrace&amp;amp;, Vector&amp;amp;)&lt;br /&gt;
144     CBaseEntity::PerformCustomPhysics(Vector*, Vector*, QAngle*, QAngle*)&lt;br /&gt;
145     CBaseAnimating::GetStepOrigin() const&lt;br /&gt;
146     CBaseAnimating::GetStepAngles() const&lt;br /&gt;
147     CBaseEntity::ShouldDrawWaterImpacts()&lt;br /&gt;
148     CBaseEntity::NetworkStateChanged_m_fFlags()&lt;br /&gt;
149     CBasePlayer::NetworkStateChanged_m_hGroundEntity()&lt;br /&gt;
150     CBasePlayer::NetworkStateChanged_m_vecBaseVelocity()&lt;br /&gt;
151     CBaseEntity::NetworkStateChanged_m_nWaterLevel()&lt;br /&gt;
152     CBasePlayer::NetworkStateChanged_m_flFriction()&lt;br /&gt;
153     CBaseEntity::NetworkStateChanged_m_vecVelocity()&lt;br /&gt;
154     CBasePlayer::NetworkStateChanged_m_vecViewOffset()&lt;br /&gt;
155     CBaseAnimating::GetIdealSpeed() const&lt;br /&gt;
156     CBaseAnimating::GetIdealAccel() const&lt;br /&gt;
157     CBaseAnimatingOverlay::StudioFrameAdvance()&lt;br /&gt;
158     CBaseAnimating::IsActivityFinished()&lt;br /&gt;
159     CBaseAnimating::ClampRagdollForce(Vector const&amp;amp;, Vector*)&lt;br /&gt;
160     CBaseAnimating::BecomeRagdollOnClient(Vector const&amp;amp;)&lt;br /&gt;
161     CBaseAnimating::IsRagdoll()&lt;br /&gt;
162     CBaseAnimating::CanBecomeRagdoll()&lt;br /&gt;
163     CBaseAnimatingOverlay::GetSkeleton(CStudioHdr*, Vector*, Quaternion*, int)&lt;br /&gt;
164     CBaseAnimating::GetBoneTransform(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
165     CDODPlayer::SetupBones(matrix3x4_t*, int)&lt;br /&gt;
166     CBaseAnimating::CalculateIKLocks(float)&lt;br /&gt;
167     CBaseAnimatingOverlay::DispatchAnimEvents(CBaseAnimating*)&lt;br /&gt;
168     CBaseAnimating::HandleAnimEvent(animevent_t*)&lt;br /&gt;
169     CBaseAnimating::GetAttachment(int, matrix3x4_t&amp;amp;)&lt;br /&gt;
170     CBaseAnimating::InitBoneControllers()&lt;br /&gt;
171     CBaseAnimating::GetGroundSpeedVelocity()&lt;br /&gt;
172     CBaseAnimating::DrawServerHitboxes(float, bool)&lt;br /&gt;
173     CBaseAnimating::Ignite(float, bool, float, bool)&lt;br /&gt;
174     CBaseAnimating::Extinguish()&lt;br /&gt;
175     CBaseCombatCharacter::SetLightingOriginRelative(CBaseEntity*)&lt;br /&gt;
176     CBaseAnimating::SetLightingOrigin(CBaseEntity*)&lt;br /&gt;
177     CBaseFlex::SetViewtarget(Vector const&amp;amp;)&lt;br /&gt;
178     CBaseFlex::StartSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*, CChoreoActor*, CBaseEntity*)&lt;br /&gt;
179     CBaseFlex::ProcessSceneEvents()&lt;br /&gt;
180     CBaseFlex::ProcessSceneEvent(CSceneEventInfo*, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
181     CBaseFlex::ClearSceneEvent(CSceneEventInfo*, bool, bool)&lt;br /&gt;
182     CBaseFlex::CheckSceneEventCompletion(CSceneEventInfo*, float, CChoreoScene*, CChoreoEvent*)&lt;br /&gt;
183     CBaseCombatCharacter::GetPhysicsImpactDamageTable()&lt;br /&gt;
184     CBaseCombatCharacter::FInViewCone(CBaseEntity*)&lt;br /&gt;
185     CBaseCombatCharacter::FInViewCone(Vector const&amp;amp;)&lt;br /&gt;
186     CBaseCombatCharacter::FInAimCone(CBaseEntity*)&lt;br /&gt;
187     CBaseCombatCharacter::FInAimCone(Vector const&amp;amp;)&lt;br /&gt;
188     CBaseCombatCharacter::ShouldShootMissTarget(CBaseCombatCharacter*)&lt;br /&gt;
189     CBaseCombatCharacter::FindMissTarget()&lt;br /&gt;
190     CBaseCombatCharacter::HandleInteraction(int, void*, CBaseCombatCharacter*)&lt;br /&gt;
191     CBasePlayer::BodyAngles()&lt;br /&gt;
192     CBaseCombatCharacter::BodyDirection2D()&lt;br /&gt;
193     CBaseCombatCharacter::BodyDirection3D()&lt;br /&gt;
194     CBaseCombatCharacter::HeadDirection2D()&lt;br /&gt;
195     CBaseCombatCharacter::HeadDirection3D()&lt;br /&gt;
196     CBaseCombatCharacter::EyeDirection2D()&lt;br /&gt;
197     CBaseCombatCharacter::EyeDirection3D()&lt;br /&gt;
198     CBaseCombatCharacter::GiveAmmo(int, int, bool)&lt;br /&gt;
199     CBaseCombatCharacter::NPC_TranslateActivity(Activity)&lt;br /&gt;
200     CBaseCombatCharacter::Weapon_TranslateActivity(Activity, bool*)&lt;br /&gt;
201     CBasePlayer::Weapon_CanUse(CBaseCombatWeapon*)&lt;br /&gt;
202     CBasePlayer::Weapon_Equip(CBaseCombatWeapon*)&lt;br /&gt;
203     CBaseCombatCharacter::Weapon_EquipAmmoOnly(CBaseCombatWeapon*)&lt;br /&gt;
204     CBasePlayer::Weapon_Drop(CBaseCombatWeapon*, Vector const*, Vector const*)&lt;br /&gt;
205     CBasePlayer::Weapon_Switch(CBaseCombatWeapon*, int)&lt;br /&gt;
206     CBasePlayer::Weapon_ShootPosition()&lt;br /&gt;
207     CDODPlayer::Weapon_CanSwitchTo(CBaseCombatWeapon*)&lt;br /&gt;
208     CBaseCombatCharacter::Weapon_SlotOccupied(CBaseCombatWeapon*)&lt;br /&gt;
209     CBaseCombatCharacter::Weapon_GetSlot(int) const&lt;br /&gt;
210     CBaseCombatCharacter::AddPlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
211     CBasePlayer::RemovePlayerItem(CBaseCombatWeapon*)&lt;br /&gt;
212     CBaseCombatCharacter::CanBecomeServerRagdoll()&lt;br /&gt;
213     CDODPlayer::OnTakeDamage_Alive(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
214     CBaseCombatCharacter::OnTakeDamage_Dying(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
215     CBaseCombatCharacter::OnTakeDamage_Dead(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
216     CBaseCombatCharacter::OnFriendDamaged(CBaseCombatCharacter*, CBaseEntity*)&lt;br /&gt;
217     CBaseCombatCharacter::NotifyFriendsOfDamage(CBaseEntity*)&lt;br /&gt;
218     CBaseCombatCharacter::GetDeathActivity()&lt;br /&gt;
219     CBaseCombatCharacter::CorpseGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
220     CBaseCombatCharacter::CorpseFade()&lt;br /&gt;
221     CBaseCombatCharacter::HasHumanGibs()&lt;br /&gt;
222     CBaseCombatCharacter::HasAlienGibs()&lt;br /&gt;
223     CBaseCombatCharacter::ShouldGib(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
224     CBaseCombatCharacter::OnKilledNPC(CBaseCombatCharacter*)&lt;br /&gt;
225     CBaseCombatCharacter::Event_Gibbed(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
226     CBasePlayer::Event_Dying()&lt;br /&gt;
227     CBaseCombatCharacter::BecomeRagdoll(CTakeDamageInfo const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
228     CBaseCombatCharacter::FixupBurningServerRagdoll(CBaseEntity*)&lt;br /&gt;
229     CBaseCombatCharacter::CheckTraceHullAttack(float, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
230     CBaseCombatCharacter::CheckTraceHullAttack(Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, Vector const&amp;amp;, int, int, float, bool)&lt;br /&gt;
231     CBaseCombatCharacter::PushawayTouch(CBaseEntity*)&lt;br /&gt;
232     CBaseCombatCharacter::IRelationType(CBaseEntity*)&lt;br /&gt;
233     CBaseCombatCharacter::IRelationPriority(CBaseEntity*)&lt;br /&gt;
234     CBaseCombatCharacter::CalcWeaponProficiency(CBaseCombatWeapon*)&lt;br /&gt;
235     CBaseCombatCharacter::GetAttackSpread(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
236     CBaseCombatCharacter::GetSpreadBias(CBaseCombatWeapon*, CBaseEntity*)&lt;br /&gt;
237     CBasePlayer::DoMuzzleFlash()&lt;br /&gt;
238     CBaseCombatCharacter::AddEntityRelationship(CBaseEntity*, Disposition_t, int)&lt;br /&gt;
239     CBaseCombatCharacter::AddClassRelationship(Class_T, Disposition_t, int)&lt;br /&gt;
240     CBaseCombatCharacter::OnChangeActiveWeapon(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
241     CBasePlayer::NetworkStateChanged_m_iAmmo()&lt;br /&gt;
242     CDODPlayer::CreateViewModel(int)&lt;br /&gt;
243     CDODPlayer::SetupVisibility(CBaseEntity*, unsigned char*, int)&lt;br /&gt;
244     CDODPlayer::WantsLagCompensationOnEntity(CBasePlayer const*, CUserCmd const*, CBitVec&amp;lt;2048&amp;gt; const*) const&lt;br /&gt;
245     CDODPlayer::SharedSpawn()&lt;br /&gt;
246     CDODPlayer::InitialSpawn()&lt;br /&gt;
247     CBasePlayer::InitHUD()&lt;br /&gt;
248     CBasePlayer::ShowViewPortPanel(char const*, bool, KeyValues*)&lt;br /&gt;
249     CDODPlayer::PlayerDeathThink()&lt;br /&gt;
250     CBasePlayer::Jump()&lt;br /&gt;
251     CBasePlayer::Duck()&lt;br /&gt;
252     CDODPlayer::PreThink()&lt;br /&gt;
253     CDODPlayer::PostThink()&lt;br /&gt;
254     CBasePlayer::DamageEffect(float, int)&lt;br /&gt;
255     CDODPlayer::OnDamagedByExplosion(CTakeDamageInfo const&amp;amp;)&lt;br /&gt;
256     CBasePlayer::ShouldFadeOnDeath()&lt;br /&gt;
257     CBasePlayer::IsFakeClient() const&lt;br /&gt;
258     CDODPlayer::GetPlayerMins() const&lt;br /&gt;
259     CDODPlayer::GetPlayerMaxs() const&lt;br /&gt;
260     CBasePlayer::CalcRoll(QAngle const&amp;amp;, Vector const&amp;amp;, float, float)&lt;br /&gt;
261     CBasePlayer::PackDeadPlayerItems()&lt;br /&gt;
262     CBasePlayer::RemoveAllItems(bool)&lt;br /&gt;
263     CBasePlayer::Weapon_SetLast(CBaseCombatWeapon*)&lt;br /&gt;
264     CBasePlayer::Weapon_ShouldSetLast(CBaseCombatWeapon*, CBaseCombatWeapon*)&lt;br /&gt;
265     CBasePlayer::Weapon_ShouldSelectItem(CBaseCombatWeapon*)&lt;br /&gt;
266     CBasePlayer::UpdateClientData()&lt;br /&gt;
267     CBasePlayer::ExitLadder()&lt;br /&gt;
268     CDODPlayer::FlashlightIsOn()&lt;br /&gt;
269     CDODPlayer::FlashlightTurnOn()&lt;br /&gt;
270     CDODPlayer::FlashlightTurnOff()&lt;br /&gt;
271     CBasePlayer::IsIlluminatedByFlashlight(CBaseEntity*, float*)&lt;br /&gt;
272     CDODPlayer::UpdateStepSound(surfacedata_t*, Vector const&amp;amp;, Vector const&amp;amp;)&lt;br /&gt;
273     CDODPlayer::PlayStepSound(Vector&amp;amp;, surfacedata_t*, float, bool)&lt;br /&gt;
274     CDODPlayer::DeathSound()&lt;br /&gt;
275     CDODPlayer::SetAnimation(PLAYER_ANIM)&lt;br /&gt;
276     CBasePlayer::ImpulseCommands()&lt;br /&gt;
277     CDODPlayer::CheatImpulseCommands(int)&lt;br /&gt;
278     CDODPlayer::ClientCommand(char const*)&lt;br /&gt;
279     CBasePlayer::StartObserverMode(int)&lt;br /&gt;
280     CBasePlayer::StopObserverMode()&lt;br /&gt;
281     CDODPlayer::SetObserverMode(int)&lt;br /&gt;
282     CBasePlayer::GetObserverMode()&lt;br /&gt;
283     CBasePlayer::SetObserverTarget(CBaseEntity*)&lt;br /&gt;
284     CBasePlayer::ObserverUse(bool)&lt;br /&gt;
285     CBasePlayer::GetObserverTarget()&lt;br /&gt;
286     CBasePlayer::FindNextObserverTarget(bool)&lt;br /&gt;
287     CBasePlayer::IsValidObserverTarget(CBaseEntity*)&lt;br /&gt;
288     CBasePlayer::CheckObserverSettings()&lt;br /&gt;
289     CBasePlayer::JumptoPosition(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
290     CBasePlayer::ForceObserverMode(int)&lt;br /&gt;
291     CBasePlayer::ResetObserverMode()&lt;br /&gt;
292     CDODPlayer::StartReplayMode(float, float, int)&lt;br /&gt;
293     CDODPlayer::StopReplayMode()&lt;br /&gt;
294     CBasePlayer::GetDelayTicks()&lt;br /&gt;
295     CBasePlayer::GetReplayEntity()&lt;br /&gt;
296     CBasePlayer::CreateCorpse()&lt;br /&gt;
297     CDODPlayer::EntSelectSpawnPoint()&lt;br /&gt;
298     CBasePlayer::GetInVehicle(IServerVehicle*, int)&lt;br /&gt;
299     CBasePlayer::LeaveVehicle(Vector const&amp;amp;, QAngle const&amp;amp;)&lt;br /&gt;
300     CBasePlayer::OnVehicleStart()&lt;br /&gt;
301     CBasePlayer::OnVehicleEnd(Vector&amp;amp;)&lt;br /&gt;
302     CDODPlayer::BumpWeapon(CBaseCombatWeapon*)&lt;br /&gt;
303     CBasePlayer::SelectLastItem()&lt;br /&gt;
304     CBasePlayer::SelectItem(char const*, int)&lt;br /&gt;
305     CBasePlayer::ItemPostFrame()&lt;br /&gt;
306     CDODPlayer::GiveNamedItem(char const*, int)&lt;br /&gt;
307     CDODPlayer::CheckTrainUpdate()&lt;br /&gt;
308     CBasePlayer::SetPlayerUnderwater(bool)&lt;br /&gt;
309     CBasePlayer::CanBreatheUnderwater() const&lt;br /&gt;
310     CBasePlayer::PlayerUse()&lt;br /&gt;
311     CBasePlayer::PlayUseDenySound()&lt;br /&gt;
312     CDODPlayer::FindUseEntity()&lt;br /&gt;
313     CBasePlayer::IsUseableEntity(CBaseEntity*, unsigned int)&lt;br /&gt;
314     CBasePlayer::PickupObject(CBaseEntity*, bool)&lt;br /&gt;
315     CBasePlayer::ForceDropOfCarriedPhysObjects(CBaseEntity*)&lt;br /&gt;
316     CBasePlayer::GetHeldObjectMass(IPhysicsObject*)&lt;br /&gt;
317     CDODPlayer::UpdateGeigerCounter()&lt;br /&gt;
318     CBasePlayer::GetAutoaimVector(float)&lt;br /&gt;
319     CBasePlayer::GetAutoaimVector(float, autoaim_params_t&amp;amp;)&lt;br /&gt;
320     CBasePlayer::ShouldAutoaim()&lt;br /&gt;
321     CBasePlayer::ForceClientDllUpdate()&lt;br /&gt;
322     CBasePlayer::ProcessUsercmds(CUserCmd*, int, int, int, bool)&lt;br /&gt;
323     CDODPlayer::PlayerRunCommand(CUserCmd*, IMoveHelper*)&lt;br /&gt;
324     CBasePlayer::CanSpeak()&lt;br /&gt;
325     CDODPlayer::CanHearChatFrom(CBasePlayer*)&lt;br /&gt;
326     CBasePlayer::ModifyOrAppendPlayerCriteria(AI_CriteriaSet&amp;amp;)&lt;br /&gt;
327     CDODPlayer::CheckChatText(char*, int)&lt;br /&gt;
328     CBasePlayer::IsFollowingPhysics()&lt;br /&gt;
329     CDODPlayer::InitVCollision()&lt;br /&gt;
330     CBasePlayer::UpdatePhysicsShadowToCurrentPosition()&lt;br /&gt;
331     CBasePlayer::EquipSuit()&lt;br /&gt;
332     CDODPlayer::CommitSuicide()&lt;br /&gt;
333     CBasePlayer::IsBot() const&lt;br /&gt;
334     CBasePlayer::SpawnArmorValue() const&lt;br /&gt;
335     CBasePlayer::NetworkStateChanged_m_ArmorValue()&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Showdax&amp;diff=2811</id>
		<title>User:Showdax</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Showdax&amp;diff=2811"/>
		<updated>2006-03-25T21:45:21Z</updated>

		<summary type="html">&lt;p&gt;Showdax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;See also: http://dackz.net/&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Signature_Scanning&amp;diff=2766</id>
		<title>Signature Scanning</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Signature_Scanning&amp;diff=2766"/>
		<updated>2006-03-23T23:52:04Z</updated>

		<summary type="html">&lt;p&gt;Showdax: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Documentation (SourceMM)]]&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This article demonstrates a technique developed by Lance Vorgin known as &amp;quot;Signature Scanning&amp;quot;, or sigscanning for short. &lt;br /&gt;
&lt;br /&gt;
== What is Sigscanning? ==&lt;br /&gt;
&lt;br /&gt;
Sigscanning is a multi-step process involving extracting function signatures from a binary and then scanning for them at run-time to locate an otherwise-hidden function. A signature for a function is a set of bytes unique to a function. These bytes are the instructions a program uses to operate. These sets of bytes are what make up functions (or subroutines as they are called in Assembly). When we have enough of these bytes to form a unique set, we can then match them again to the function in memory.&lt;br /&gt;
&lt;br /&gt;
Why is this useful for plugins? Each time Valve releases an update for their mods, they may change classes such as CBaseEntity used by many plugin coders to interact with a player’s entity. Due to the fact that we do not have the appropriate class headers for each of these changes, we may be using virtual functions that now exist at different addresses. This would cause a crash at run-time. To avoid this, the following solutions are available:&lt;br /&gt;
*rely on manual offsets into the class' vtable&lt;br /&gt;
*modify the provided class headers by inserting dummy virtual functions to fix the offsets&lt;br /&gt;
*sigscanning&lt;br /&gt;
&lt;br /&gt;
Each have their pros and cons, but it turns out that although sigscanning is the most tedious out of the three, it is the most reliable. The first two choices are typically broken by updates.&lt;br /&gt;
&lt;br /&gt;
== Assembly and Memory ==&lt;br /&gt;
&lt;br /&gt;
To understand all of this, one must first understand how the code of a C++ program is compiled into a binary file.&lt;br /&gt;
&lt;br /&gt;
When you hit &amp;quot;Build Solution&amp;quot; on your IDE or run a makefile, your compiler does a multitude of operations. First it takes the code and runs it through a preprocessor. The preprocessor takes all the &amp;quot;#&amp;quot; directives (e.g. #define, #include, etc.) and substitutes them with normal C++ code. After the preprocessor has done its job, the code is passed on to the parser. In simplified terms, the parser basically takes C++ code and turns it into Assembly (asm) code. After the parser has parsed the code into Assembly code, the assembler &amp;quot;assembles&amp;quot; the code into mostly machine (byte) code which is put into object files that carry the .obj or .o extension. Then the linker gathers all the object files where it looks for function calls and sets the &amp;quot;links&amp;quot; to them (static linking) as well as external calls to functions outside the scope of the assembled code (dynamic linking) and finally maps any runtime calls (runtime linking). After this, it finally outputs the finished product (a binary file, i.e. an executable or library). When a server loads your plugin, it uses runtime calls to call functions from within your plugin, and likewise your plugin calls functions from the server.&lt;br /&gt;
&lt;br /&gt;
Now where this all comes into play in sigscanning is where you will be taking the server module (.dll or .so file) from memory and scanning it in its machine-code form for those functions that you need. This is done by first disassembling the server module back into Assembly form and finding the instructions that make up that function you want.&lt;br /&gt;
&lt;br /&gt;
Assembly is the &amp;quot;lowest-level&amp;quot; language in programming terms. It is easy to flip-flop between Assembly and machine code because they are basically the same, except Assembly uses something called &amp;quot;Mnemonics&amp;quot; before every instruction. These are the human-readable keywords &amp;lt;i&amp;gt;push&amp;lt;/i&amp;gt;, &amp;lt;i&amp;gt;pop&amp;lt;/i&amp;gt;, &amp;lt;i&amp;gt;mov&amp;lt;/i&amp;gt;, &amp;lt;i&amp;gt;call&amp;lt;/i&amp;gt;, etc. that define what the instruction does. As C++ code is translated into Assembly, you can imagine the very structured syntax of C++ flattened out into primitive simple Assembly instructions. I won’t go into further detail on Assembly due to its complex nature. The best way to learn more about it (which is recommended) is to read one of the reference links provided at the bottom of this writing.&lt;br /&gt;
&lt;br /&gt;
== Before We Go Further ==&lt;br /&gt;
&lt;br /&gt;
Read BAILOPAN’s three DevLogs on sigscanning to gain an understanding of the proceeding sections.&lt;br /&gt;
*&amp;lt;i&amp;gt;Oh, you’ve not hacked yet?&amp;lt;/i&amp;gt; – http://www.sourcemod.net/devlog/?p=55&lt;br /&gt;
*&amp;lt;i&amp;gt;Finding Functions, Part 2&amp;lt;/i&amp;gt; – http://www.sourcemod.net/devlog/?p=56&lt;br /&gt;
*&amp;lt;i&amp;gt;Finding Functions, Part 3&amp;lt;/i&amp;gt; – http://www.sourcemod.net/devlog/?p=57&lt;br /&gt;
&lt;br /&gt;
== Scanning for Signatures at Run-time ==&lt;br /&gt;
&lt;br /&gt;
This is the complete code for a basic sigscanner. All functions and variables are described with comments.&lt;br /&gt;
&lt;br /&gt;
=== sigscan.h ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;#ifndef SIGSCAN_H&lt;br /&gt;
#define SIGSCAN_H&lt;br /&gt;
&lt;br /&gt;
class CSigScan {&lt;br /&gt;
private:&lt;br /&gt;
    /* Private Variables */&lt;br /&gt;
    /* Base Address of the server module in memory */&lt;br /&gt;
    static unsigned char *base_addr;&lt;br /&gt;
    /* The length to the module's ending address */&lt;br /&gt;
    static size_t base_len;&lt;br /&gt;
&lt;br /&gt;
    /* The signature to scan for */&lt;br /&gt;
    unsigned char *sig_str;&lt;br /&gt;
    /* A mask to ignore certain bytes in the signature such as addresses&lt;br /&gt;
       The mask should be as long as all the bytes in the signature string&lt;br /&gt;
       Use '?' to ignore a byte and 'x' to check it&lt;br /&gt;
       Example: &amp;quot;xxx????xx&amp;quot; - The first 3 bytes are checked, then the next 4 are&lt;br /&gt;
       ignored, then the last 2 are checked */&lt;br /&gt;
    char *sig_mask;&lt;br /&gt;
    /* The length of sig_str and sig_mask (not including a terminating null for sig_mask) */&lt;br /&gt;
    size_t sig_len;&lt;br /&gt;
&lt;br /&gt;
    /* Private Functions */&lt;br /&gt;
    void* FindSignature(void);&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
    /* Public Variables */&lt;br /&gt;
&lt;br /&gt;
    /* sigscan_dllfunc is a pointer of something that resides inside the gamedll so we can get&lt;br /&gt;
       the base address of it. From a SourceMM plugin, just set this to ismm-&amp;gt;serverFactory(0)&lt;br /&gt;
       in Load(). From a Valve Server Plugin, you must set this to an actual factory returned&lt;br /&gt;
       from gameServerFactory and hope that a SourceMM plugin did not override it. */&lt;br /&gt;
    static void *(*sigscan_dllfunc)(const char *pName, int *pReturnCode);&lt;br /&gt;
&lt;br /&gt;
    /* If the scan was successful or not */&lt;br /&gt;
    char is_set;&lt;br /&gt;
    /* Starting address of the found function */&lt;br /&gt;
    void *sig_addr;&lt;br /&gt;
&lt;br /&gt;
    /* Public Functions */&lt;br /&gt;
    CSigScan(void)sig_str(NULL), sig_mask(NULL), sig_len(0), sig_addr(NULL) {}&lt;br /&gt;
    ~CSigScan(void);&lt;br /&gt;
&lt;br /&gt;
    static bool GetDllMemInfo(void);&lt;br /&gt;
    void Init(unsigned char *sig, char *mask, size_t len);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* Sigscanned member functions are casted to member function pointers of this class&lt;br /&gt;
   and called with member function pointer syntax */&lt;br /&gt;
class EmptyClass { };&lt;br /&gt;
&lt;br /&gt;
void InitSigs(void);&lt;br /&gt;
&lt;br /&gt;
/* Sig Functions */&lt;br /&gt;
class CBaseAnimating;&lt;br /&gt;
void CBaseAnimating_Ignite(CBaseAnimating *cba, float flFlameLifetime);&lt;br /&gt;
&lt;br /&gt;
#endif&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sigscan.cpp ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifdef WIN32&lt;br /&gt;
    #define WIN32_LEAN_AND_MEAN&lt;br /&gt;
    #include &amp;lt;windows.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
    #include &amp;lt;dlfcn.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
    #include &amp;lt;sys/stat.h&amp;gt; &lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;sigscan.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* There is no ANSI ustrncpy */&lt;br /&gt;
unsigned char* ustrncpy(unsigned char *dest, const unsigned char *src, int len) {&lt;br /&gt;
    while(len--)&lt;br /&gt;
        dest[len] = src[len];&lt;br /&gt;
&lt;br /&gt;
    return dest;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* //////////////////////////////////////&lt;br /&gt;
    CSigScan Class&lt;br /&gt;
    ////////////////////////////////////// */&lt;br /&gt;
unsigned char* CSigScan::base_addr;&lt;br /&gt;
size_t CSigScan::base_len;&lt;br /&gt;
void *(*CSigScan::sigscan_dllfunc)(const char *pName, int *pReturnCode);&lt;br /&gt;
&lt;br /&gt;
/* Initialize the Signature Object */&lt;br /&gt;
void CSigScan::Init(unsigned char *sig, char *mask, size_t len) {&lt;br /&gt;
    is_set = 0;&lt;br /&gt;
&lt;br /&gt;
    sig_len = len;&lt;br /&gt;
    sig_str = new unsigned char[sig_len];&lt;br /&gt;
    ustrncpy(sig_str, sig, sig_len);&lt;br /&gt;
&lt;br /&gt;
    sig_mask = new char[sig_len+1];&lt;br /&gt;
    strncpy(sig_mask, mask, sig_len);&lt;br /&gt;
    sig_mask[sig_len+1] = 0;&lt;br /&gt;
&lt;br /&gt;
    if(!base_addr)&lt;br /&gt;
        return ; // GetDllMemInfo() Failed&lt;br /&gt;
&lt;br /&gt;
    if((sig_addr = FindSignature()) == NULL)&lt;br /&gt;
        return ; // FindSignature() Failed&lt;br /&gt;
&lt;br /&gt;
    is_set = 1;&lt;br /&gt;
    // SigScan Successful!&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Destructor frees sig-string allocated memory */&lt;br /&gt;
CSigScan::~CSigScan(void) {&lt;br /&gt;
    delete[] sig_str;&lt;br /&gt;
    delete[] sig_mask;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Get base address of the server module (base_addr) and get its ending offset (base_len) */&lt;br /&gt;
bool CSigScan::GetDllMemInfo(void) {&lt;br /&gt;
    void *pAddr = (void*)sigscan_dllfunc;&lt;br /&gt;
    base_addr = 0;&lt;br /&gt;
    base_len = 0;&lt;br /&gt;
&lt;br /&gt;
    #ifdef WIN32&lt;br /&gt;
    MEMORY_BASIC_INFORMATION mem;&lt;br /&gt;
&lt;br /&gt;
    if(!pAddr)&lt;br /&gt;
        return false; // GetDllMemInfo failed!pAddr&lt;br /&gt;
&lt;br /&gt;
    if(!VirtualQuery(pAddr, &amp;amp;mem, sizeof(mem)))&lt;br /&gt;
        return false;&lt;br /&gt;
&lt;br /&gt;
    base_addr = (unsigned char*)mem.AllocationBase;&lt;br /&gt;
&lt;br /&gt;
    IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER*)mem.AllocationBase;&lt;br /&gt;
    IMAGE_NT_HEADERS *pe = (IMAGE_NT_HEADERS*)((unsigned long)dos+(unsigned long)dos-&amp;gt;e_lfanew);&lt;br /&gt;
&lt;br /&gt;
    if(pe-&amp;gt;Signature != IMAGE_NT_SIGNATURE) {&lt;br /&gt;
        base_addr = 0;&lt;br /&gt;
        return false; // GetDllMemInfo failedpe points to a bad location&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    base_len = (size_t)pe-&amp;gt;OptionalHeader.SizeOfImage;&lt;br /&gt;
&lt;br /&gt;
    #else&lt;br /&gt;
&lt;br /&gt;
    Dl_info info;&lt;br /&gt;
    struct stat buf;&lt;br /&gt;
    &lt;br /&gt;
    if(!dladdr(pAddr, &amp;amp;info))&lt;br /&gt;
        return false;&lt;br /&gt;
    &lt;br /&gt;
    if(!info.dli_fbase || !info.dli_fname)&lt;br /&gt;
        return false;&lt;br /&gt;
    &lt;br /&gt;
    if(stat(info.dli_fname, &amp;amp;buf) != 0)&lt;br /&gt;
        return false;&lt;br /&gt;
    &lt;br /&gt;
    base_addr = (unsigned char*)info.dli_fbase;&lt;br /&gt;
    base_len = buf.st_size;&lt;br /&gt;
    #endif&lt;br /&gt;
&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Scan for the signature in memory then return the starting position's address */&lt;br /&gt;
void* CSigScan::FindSignature(void) {&lt;br /&gt;
    unsigned char *pBasePtr = base_addr;&lt;br /&gt;
    unsigned char *pEndPtr = base_addr+base_len;&lt;br /&gt;
    size_t i;&lt;br /&gt;
&lt;br /&gt;
    while(pBasePtr &amp;lt; pEndPtr) {&lt;br /&gt;
        for(i = 0;i &amp;lt; sig_len;i++) {&lt;br /&gt;
            if((sig_mask[i] != '?') &amp;amp;&amp;amp; (sig_str[i] != pBasePtr[i]))&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // If 'i' reached the end, we know we have a match!&lt;br /&gt;
        if(i == sig_len)&lt;br /&gt;
            return (void*)pBasePtr;&lt;br /&gt;
&lt;br /&gt;
        pBasePtr++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Signature Objects */&lt;br /&gt;
CSigScan CBaseAnimating_Ignite_Sig;&lt;br /&gt;
&lt;br /&gt;
/* Set the static base_addr and base_len variables then initialize all Signature Objects */&lt;br /&gt;
void InitSigs(void) {&lt;br /&gt;
    CSigScan::GetDllMemInfo();&lt;br /&gt;
&lt;br /&gt;
    /* void CBaseAnimating::Ignite(float flFlameLifetime, bool bNPCOnly, float flSize,&lt;br /&gt;
        bool bCalledByLevelDesigner);&lt;br /&gt;
    Last Address: 0x220BC7A0&lt;br /&gt;
    Signature: 56  8B  F1  8B? 86? BC? 00? 00? 00? C1? E8? 1B? A8? 01? 0F? 85?&lt;br /&gt;
           9A? 00? 00? 00? 8B  16  FF  92? F0? 00? 00? 00? 80? 7C? 24? 0C?&lt;br /&gt;
           00? 74? 08? 84  C0  0F? 84? 83? 00? 00? 00? 3C  01  75? 20? 80&lt;br /&gt;
           7C  24  14  00  75? 19? 8B  CE  E8  83? 1A? 01? 00? 85? C0? 74?&lt;br /&gt;
           0E? 8B  10  8B  C8  FF  92? 08? 05? 00? 00? 84  C0  74? 5F? 57&lt;br /&gt;
           6A  01  56  E8  48? EA? 07? 00? 8B  F8  83  C4  08  85  FF  74?&lt;br /&gt;
           3D? 8B  44  24  0C  50  8B  CF  E8  83? E5? 07? 00? 68  00  00&lt;br /&gt;
           00  08  8B  CE&lt;br /&gt;
    */&lt;br /&gt;
    CBaseAnimating_Ignite_Sig.Init((unsigned char*)&lt;br /&gt;
    &amp;quot;\x56\x8B\xF1\x8B\x86\xBC\x00\x00\x00\xC1\xE8\x1B\xA8\x01\x0F\x85\x9A\x00\x00\x00&amp;quot;&lt;br /&gt;
    &amp;quot;\x8B\x16\xFF\x92\xF0\x00\x00\x00\x80\x7C\x24\x0C\x00\x74\x08\x84\xC0\x0F\x84\x83&amp;quot;&lt;br /&gt;
    &amp;quot;\x00\x00\x00\x3C\x01\x75\x20\x80\x7C\x24\x14\x00\x75\x19\x8B\xCE\xE8\x83\x1A\x01&amp;quot;&lt;br /&gt;
    &amp;quot;\x00\x85\xC0\x74\x0E\x8B\x10\x8B\xC8\xFF\x92\x08\x05\x00\x00\x84\xC0\x74\x5F\x57&amp;quot;&lt;br /&gt;
    &amp;quot;\x6A\x01\x56\xE8\x48\xEA\x07\x00\x8B\xF8\x83\xC4\x08\x85\xFF\x74\x3D\x8B\x44\x24&amp;quot;&lt;br /&gt;
    &amp;quot;\x0C\x50\x8B\xCF\xE8\x83\xE5\x07\x00\x68\x00\x00\x00\x08\x8B\xCE&amp;quot;&lt;br /&gt;
    ,&lt;br /&gt;
    &amp;quot;xxx?????????????????&amp;quot;&lt;br /&gt;
    &amp;quot;xxx????????????xx???&amp;quot;&lt;br /&gt;
    &amp;quot;???xx??xxxxx??xxx???&amp;quot;&lt;br /&gt;
    &amp;quot;?????xxxxx?????xx??x&amp;quot;&lt;br /&gt;
    &amp;quot;xxxx????xxxxxxx??xxx&amp;quot;&lt;br /&gt;
    &amp;quot;xxxxx????xxxxxxx&amp;quot;&lt;br /&gt;
    ,&lt;br /&gt;
    116);&lt;br /&gt;
&lt;br /&gt;
    return ;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Example of a sig-scanned method function */&lt;br /&gt;
void CBaseAnimating_Ignite(CBaseAnimating *cba, float flFlameLifetime) {&lt;br /&gt;
    int bNPCOnly = false, bCalledByLevelDesigner = false;&lt;br /&gt;
    float flSize = 0.0f;&lt;br /&gt;
&lt;br /&gt;
    if(!CBaseAnimating_Ignite_Sig.is_set)&lt;br /&gt;
        return ; // sigscan failed&lt;br /&gt;
&lt;br /&gt;
    union {&lt;br /&gt;
        void (EmptyClass::*mfpnew)(float, bool, float, bool);&lt;br /&gt;
        void* addr;&lt;br /&gt;
    } u;&lt;br /&gt;
    u.addr = CBaseAnimating_Ignite_Sig.sig_addr;&lt;br /&gt;
&lt;br /&gt;
    (reinterpret_cast&amp;lt;EmptyClass*&amp;gt;(cba)-&amp;gt;*u.mfpnew)(flFlameLifetime, (bool)bNPCOnly, flSize,&lt;br /&gt;
        (bool)bCalledByLevelDesigner);&lt;br /&gt;
&lt;br /&gt;
    return;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
This will find the signature of a function at runtime, however it is useless unless you already have or know how to find signatures for which it can scan.&lt;br /&gt;
&lt;br /&gt;
== Finding the Signature of a Function ==&lt;br /&gt;
&lt;br /&gt;
To find a signature for a function, we need a Disassembler to disassemble the server module. Here are links to free Disassemblers that seem to work well:&lt;br /&gt;
* [http://www.datarescue.com/idabase/idadown.htm IDA Pro Freeware Version (Windows)]&lt;br /&gt;
* [http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html PEBrowse Professional (Windows)]&lt;br /&gt;
* [http://pvdasm.reverse-engineering.net/index.php?Section=1 Proview “PVDasm” Disassembler (Windows)]&lt;br /&gt;
* [http://www.gnu.org/software/binutils/manual/html_chapter/binutils_4.html GNU objdump (Linux)]&lt;br /&gt;
* [http://www.gnu.org/software/ddd/ Data Display Debugger (Linux)]&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
Showdax pointed out a very helpful way that makes finding signatures under Linux much easier than under Windows. The GNU tool &amp;quot;objdump&amp;quot; can be used against the server module to disassemble the binary into AT&amp;amp;T Assembly code with each subroutine given its name from the source code. Here is an example of how to use the objdump tool:&lt;br /&gt;
&amp;lt;pre&amp;gt;~/usr/srcds/dod/bin$ objdump -d server_i486.so &amp;gt; server_i486.so.objdump&amp;lt;/pre&amp;gt;&lt;br /&gt;
This dumps the disassembled code into the file &amp;quot;server_i486.so.objdump&amp;quot;. You can then simply open up that file and search for the function name that corresponds to its subroutine then extract its bytes to create a signature (discussed later in [[#Creating a Searchable Signature]]).&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
Under Windows, finding a signature becomes much more complicated as PE-format binaries do not include symbol names for each subroutine. I suggest using the IDA Pro Freeware Disassembler since I will be using a method I have found to find signatures that I only know how to do in IDA Pro (although you may be able to find a way to do my method in the other disassemblers).&lt;br /&gt;
&lt;br /&gt;
The rest of this section will assume you are running Windows, have a copy of Microsoft Visual Studio C++ and are using the IDA Pro Freeware Disassembler. First what you need to do is compile the HL2:DM server module. So navigate your way to the &amp;quot;hl2src/dlls&amp;quot; directory and open up &amp;quot;hl_sdk.vcproj&amp;quot;. Once open inside MSVC++, go to the Build menu and select Configuration Manager. Set the configuration to &amp;quot;Release&amp;quot; and press OK. Go to the Build menu again and select Build. This may take a bit as everything is compiled together. Once finished, you should have a new directory named &amp;quot;Release_hl2.&amp;quot; Inside, there will be the compiled server.dll file and a server.pdb file. The PDB file is key to finding the subroutines in Assembly for the function you want to use.&lt;br /&gt;
&lt;br /&gt;
Now open IDA Pro and go to the File menu and open the server.dll file you just compiled. When you open it, a dialog will pop up. Just press &amp;quot;OK&amp;quot; and everything will start to load. Eventually IDA Pro will say something akin to &amp;quot;There is a PDB file located in the same directory for this binary.&amp;quot; Click &amp;quot;Yes&amp;quot; and it will use that PDB file to name the subroutines which will make this process much easier. As things load, IDA Pro will go through the DLL, disassembling it and naming everything to their corresponding function or variable name. This may take a while and may even appear that IDA has frozen, but it has not so don't close it or you will have to start over.&lt;br /&gt;
&lt;br /&gt;
After some time, everything will have finished. Before we continue, however, we have to open up yet another IDA Pro again (don't close the other IDA Pro) and load the server.dll for the mod we will be sigscanning (in this case, Counter-Strike: Source). This file is located in &amp;quot;cstrike/bin&amp;quot; in your game installation directory. Again, do the same procedure, except this time we won't have a PDB file for it. This should take a shorter time than last time since there is no PDB file. After both IDA Pro processes have finished disassembling, we are ready to start finding signatures.&lt;br /&gt;
&lt;br /&gt;
To start looking for a signature, switch over to the HL2:DM server module IDA Pro window. Above, we have the signature for CBaseAnimating::Ignite in the [[#sigscan.cpp]] section. As a new example, let's try to find the signature for Teleporting an entity. This is the prototype for its method from the source code:&lt;br /&gt;
&amp;lt;cpp&amp;gt;virtual void CBaseEntity::Teleport(const Vector *newPosition, const QAngle *newAngles,&lt;br /&gt;
    const Vector *newVelocity);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
Now in IDA Pro look for &amp;lt;i&amp;gt;CBaseEntity::Teleport&amp;lt;/i&amp;gt; in the &amp;lt;i&amp;gt;Names&amp;lt;/i&amp;gt; list then double click it. You should be brought to the location of &amp;lt;i&amp;gt;CBaseEntity::Teleport&amp;lt;/i&amp;gt; in the disassembly, however, its internal name is given as &amp;lt;i&amp;gt;CBaseEntity_Teleport&amp;lt;/i&amp;gt;. As you can see, IDA Pro lists all the local and parameter variables near the top (lines starting with &amp;lt;i&amp;gt;var_&amp;lt;/i&amp;gt; and &amp;lt;i&amp;gt;arg_&amp;lt;/i&amp;gt;), and then the actual code is listed below with its corresponding byte representation. (Tip: I had to actually set IDA Pro to list the opcode bytes from the Options menu, in &amp;quot;General&amp;quot; then under the tab &amp;quot;Disassembly&amp;quot;). At first, it seems feasible to just use the bytes here for the signature, but Valve decided to change almost all the CBase* methods (that I've seen) for Counter-Strike: Source from the Half-Life 2: Deathmatch code. Due to this fact, we will have to use the HL2:DM disassembly as clues for finding the same function/method in the CS:S disassembly. To find our Teleport function, we will have to find a unique set of instructions that wouldn't be repeated in another subroutine. I had to do some trial and error with this function since Valve had changed or moved various pieces of code. If you try looking over the subroutine for something unique, you may see a group of repeated &amp;lt;i&amp;gt;mov&amp;lt;/i&amp;gt; instructions:&lt;br /&gt;
&amp;lt;asm&amp;gt;.text:220C96CF 89 44 24 18          mov   [esp+30h+var_18], eax&lt;br /&gt;
.text:220C96D3 89 74 24 1C          mov   [esp+30h+var_14], esi&lt;br /&gt;
.text:220C96D7 89 74 24 20          mov   [esp+30h+var_10], esi&lt;br /&gt;
.text:220C96DB 89 74 24 24          mov   [esp+30h+var_C], esi&lt;br /&gt;
.text:220C96DF 89 74 24 28          mov   [esp+30h+var_8], esi&lt;br /&gt;
.text:220C96E3 89 74 24 2C          mov   [esp+30h+var_4], esi&amp;lt;/asm&amp;gt;&lt;br /&gt;
Try searching for part of this in the CS:S disassembly. If you get results, search for the next item to make sure there isn't another set of the same instructions. Then to verify this is the correct subroutine for the function Teleport(), compare the two subroutines to see if they have similar instructions in the same places. If they do then it is most likely correct and now you can use some of the instructions from your find in machine-code form to create a signature, which is discussed in the next section.&lt;br /&gt;
&lt;br /&gt;
== Creating a Searchable Signature ==&lt;br /&gt;
&lt;br /&gt;
Once we have found the subroutine for the function we want, we can start extracting the bytes for use in a signature. Here is part of the assembly for &amp;lt;i&amp;gt;CBaseEntity::Teleport&amp;lt;/i&amp;gt;:&lt;br /&gt;
&amp;lt;asm&amp;gt;220D9940                     CBaseEntity_Teleport proc near          ; CODE XREFsub_220B6330+14 p&lt;br /&gt;
220D9940                                                             ; sub_22143900+A p ...&lt;br /&gt;
220D9940&lt;br /&gt;
220D9940 83 EC 18            sub     esp, 18h&lt;br /&gt;
220D9943 53                  push    ebx&lt;br /&gt;
220D9944 56                  push    esi&lt;br /&gt;
220D9945 8B D9               mov     ebx, ecx&lt;br /&gt;
220D9947 8B 0D 78 B2 46 22   mov     ecx, dword_2246B278&lt;br /&gt;
220D994D 33 F6               xor     esi, esi&lt;br /&gt;
220D994F 33 C0               xor     eax, eax&lt;br /&gt;
220D9951 3B CE               cmp     ecx, esi&lt;br /&gt;
220D9953 7E 21               jle     short loc_220D9976&lt;br /&gt;
220D9955 8B 15 6C B2 46 22   mov     edx, dword_2246B26C&lt;br /&gt;
220D995B EB 03               jmp     short loc_220D9960&lt;br /&gt;
220D995B                     ; ---------------------------------------------------------------------------&lt;br /&gt;
220D995D 8D 49 00            align 10h&lt;br /&gt;
220D9960&lt;br /&gt;
220D9960                     loc_220D9960                          ; CODE XREFCBaseEntity_Teleport+1B j&lt;br /&gt;
220D9960                                                             ; CBaseEntity_Teleport+2A j&lt;br /&gt;
220D9960 39 1C 82            cmp     [edx+eax*4], ebx&lt;br /&gt;
220D9963 74 09               jz      short loc_220D996E&lt;br /&gt;
220D9965 83 C0 01            add     eax, 1&lt;br /&gt;
220D9968 3B C1               cmp     eax, ecx&lt;br /&gt;
220D996A 7C F4               jl      short loc_220D9960&lt;br /&gt;
220D996C EB 08               jmp     short loc_220D9976&lt;br /&gt;
220D996E                     ; ---------------------------------------------------------------------------&lt;br /&gt;
220D996E&lt;br /&gt;
220D996E                     loc_220D996E                          ; CODE XREFCBaseEntity_Teleport+23 j&lt;br /&gt;
220D996E 3B C6               cmp     eax, esi&lt;br /&gt;
220D9970 0F 8D 17 01 00 00   jge     loc_220D9A8D&lt;br /&gt;
220D9976&lt;br /&gt;
220D9976                     loc_220D9976                          ; CODE XREFCBaseEntity_Teleport+13 j&lt;br /&gt;
220D9976                                                             ; CBaseEntity_Teleport+2C j&lt;br /&gt;
220D9976 55                  push    ebp&lt;br /&gt;
220D9977 57                  push    edi&lt;br /&gt;
220D9978 8D 44 24 10         lea     eax, [esp+28h+var_18]&lt;br /&gt;
220D997C 50                  push    eax&lt;br /&gt;
220D997D 51                  push    ecx&lt;br /&gt;
220D997E B9 6C B2 46 22      mov     ecx, offset dword_2246B26C&lt;br /&gt;
220D9983 89 5C 24 18         mov     [esp+30h+var_18], ebx&lt;br /&gt;
220D9987 E8 B4 88 F9 FF      call    sub_22072240&lt;br /&gt;
220D998C 8D 4C 24 14         lea     ecx, [esp+28h+var_14]&lt;br /&gt;
220D9990 51                  push    ecx&lt;br /&gt;
220D9991 53                  push    ebx&lt;br /&gt;
220D9992 89 44 24 18         mov     [esp+30h+var_18], eax&lt;br /&gt;
220D9996 89 74 24 1C         mov     [esp+30h+var_14], esi&lt;br /&gt;
220D999A 89 74 24 20         mov     [esp+30h+var_10], esi&amp;lt;/asm&amp;gt;&lt;br /&gt;
I have written a small C program for which I use to create a signature string and signature mask from. It is not necessary to use, but it can help to reduce the amount of tedious work you have to do to create a signature.&lt;br /&gt;
&lt;br /&gt;
=== sigcreator.c ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ctype.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int i, len, out_i = 0, mask_i = 0;&lt;br /&gt;
    char *sig, *out, *mask;&lt;br /&gt;
    &lt;br /&gt;
    sig = (char*)calloc(1024, sizeof(char));&lt;br /&gt;
    &lt;br /&gt;
    printf(&amp;quot;?&amp;quot;);&lt;br /&gt;
    fgets(sig, 1022, stdin);&lt;br /&gt;
    len = strlen(sig);&lt;br /&gt;
    &lt;br /&gt;
    out = (char*)calloc(len*2, sizeof(char));&lt;br /&gt;
    mask = (char*)calloc(len*2, sizeof(char));&lt;br /&gt;
    &lt;br /&gt;
    for(i = 0;i &amp;lt; len;i++) {&lt;br /&gt;
        if(isalnum(sig[i]) &amp;amp;&amp;amp; isalnum(sig[i+1])) {&lt;br /&gt;
            out[out_i++] = '\\';&lt;br /&gt;
            out[out_i++] = 'x';&lt;br /&gt;
            out[out_i++] = sig[i];&lt;br /&gt;
            out[out_i++] = sig[i+1];&lt;br /&gt;
            if(sig[i+2] == '?') {&lt;br /&gt;
                mask[mask_i++] = '?';&lt;br /&gt;
                i += 2;&lt;br /&gt;
            }&lt;br /&gt;
            else {&lt;br /&gt;
                mask[mask_i++] = 'x';&lt;br /&gt;
                i++;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    printf(&amp;quot;\n\nSize%d\n\nSig:\n%s\n\nMask:\n%s&amp;quot;, strlen(mask), out, mask);&lt;br /&gt;
    getchar();&lt;br /&gt;
    &lt;br /&gt;
    free(sig);&lt;br /&gt;
    free(out);&lt;br /&gt;
    free(mask);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
It takes an input string of hexadecimal characters just as they appear in bold in the Assembly above. For each byte that should be ignored, a question mark after a hexadecimal byte will tell the program where a &amp;quot;?&amp;quot; should be in the signature mask. I will give an example of what the input and output should look like near the end of this section.&lt;br /&gt;
&lt;br /&gt;
When creating a signature, you must also create a signature mask as well. A signature mask tells the sigscanner which bytes to ignore, such as addresses which may change at runtime. The signature mask is the same length as the signature. A question mark (&amp;quot;?&amp;quot;) in the mask signifies the position of the byte in the signature string to be ignored. Any other character corresponding to a byte in the signature string will be checked (usually we use &amp;quot;x&amp;quot; to represent these).&lt;br /&gt;
&lt;br /&gt;
For the Teleport() function we found in the last section, we will build our signature from the bold hexadecimal characters in the Assembly above. I will be using the format of my &amp;quot;Sig Creator&amp;quot; for developing a signature string and mask for the sigscanner. The first three instructions in the subroutine are called the &amp;quot;function prologue.&amp;quot; These instructions will most likely never change as long as the variable declarations are not changed. So to start off, input &amp;quot;83 EC 18 53 56&amp;quot; into the sigcreator. Next is a mov instruction that probably won’t change &amp;quot;8B D9&amp;quot;. After that is another mov instruction, but this mov instruction contains an address in it, so add this to the input &amp;quot;8B? 0D? 78? B2? 46? 22?&amp;quot;. This will appear as question marks in the signature mask. The next set of xor instructions don’t reference an address so they’re safe to add normally to the input &amp;quot;33 F6 33 C0&amp;quot;. From here on, continue to input each segment of bytes into the sigcreator, where any segment referencing an address should have question marks following each hexadecimal character pairs (like I did for the mov instruction). Eventually you’ll end at those last mov instructions. This isn’t the end of the subroutine, but it’s enough to develop a worthy signature. So press enter in the sigcreator, and it should output something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;?83 EC 18 53 56 8B D9 8B? 0D? 78? B2? 46? 22? 33 F6 33 C0 3B CE 7E? 21? 8B? 15?&lt;br /&gt;
6C? B2? 46? 22? EB? 03? 8D? 49? 00? 39 1C 82 74? 09? 83? C0? 01? 3B C1 7C? F4?&lt;br /&gt;
EB? 08? 3B C6 0F? 8D? 17? 01? 00? 00? 55 57? 8D? 44? 24? 10? 50 51 B9? 6C? B2?&lt;br /&gt;
46? 22? 89 5C 24 18 E8? B4? 88? F9? FF? 8D? 4C? 24? 14? 51 53 89 44 24 18 89&lt;br /&gt;
74 24 1C 89 74 24 20 89 74 24 24 89 74 24 28 89 74 24 2C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Size106&lt;br /&gt;
&lt;br /&gt;
Sig:&lt;br /&gt;
\x83\xEC\x18\x53\x56\x8B\xD9\x8B\x0D\x78\xB2\x46\x22\x33\xF6\x33\xC0\x3B\xCE\x7E&lt;br /&gt;
\x21\x8B\x15\x6C\xB2\x46\x22\xEB\x03\x8D\x49\x00\x39\x1C\x82\x74\x09\x83\xC0\x01&lt;br /&gt;
\x3B\xC1\x7C\xF4\xEB\x08\x3B\xC6\x0F\x8D\x17\x01\x00\x00\x55\x57\x8D\x44\x24\x10&lt;br /&gt;
\x50\x51\xB9\x6C\xB2\x46\x22\x89\x5C\x24\x18\xE8\xB4\x88\xF9\xFF\x8D\x4C\x24\x14&lt;br /&gt;
\x51\x53\x89\x44\x24\x18\x89\x74\x24\x1C\x89\x74\x24\x20\x89\x74\x24\x24\x89\x74&lt;br /&gt;
\x24\x28\x89\x74\x24\x2C&lt;br /&gt;
&lt;br /&gt;
Mask:&lt;br /&gt;
xxxxxxx??????xxxxxx?????????????xxx?????xx????xx??????x?????xx?????xxxx?????????&lt;br /&gt;
xxxxxxxxxxxxxxxxxxxxxxxxxx&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now you have a nice signature and mask you can use for your sigscanner and it also gives you the length of the signature as well. Cheers!&lt;br /&gt;
&lt;br /&gt;
== Contributors ==&lt;br /&gt;
&lt;br /&gt;
Thank you to those who contributed to this document directly and/or indirectly:&lt;br /&gt;
*Lance Vorgin – Forefather of sigscanners, posted his sigscanner on the [[SourceMod]] forums somewhere&lt;br /&gt;
*BAILOPAN – Created his DevLogs on how to create a sigscanner, also gave tips as well as other useful information&lt;br /&gt;
*Showdax – Suggested the objdump command for disassembly on Linux&lt;br /&gt;
*CyberMind – Examples of how to use a different method of calling sig functions&lt;br /&gt;
*Jacob Lojo – Posted a thread on how to develop a signature from disassembly (I was having trouble finding sigs with my scanner before his post). Also contributed a link to another disassembler&lt;br /&gt;
*SeLfkiLL – Revision and completed code for the sigscanner and sigcreator&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;i&amp;gt;Oh, you’ve not hacked yet?&amp;lt;/i&amp;gt; – http://www.sourcemod.net/devlog/?p=55&lt;br /&gt;
*&amp;lt;i&amp;gt;Finding Functions, Part 2&amp;lt;/i&amp;gt; – http://www.sourcemod.net/devlog/?p=56&lt;br /&gt;
*&amp;lt;i&amp;gt;Finding Functions, Part 3&amp;lt;/i&amp;gt; – http://www.sourcemod.net/devlog/?p=57&lt;br /&gt;
*&amp;lt;i&amp;gt;Introduction to Reverse Engineering Software&amp;lt;/i&amp;gt; - http://www.acm.uiuc.edu/sigmil/RevEng/index.html&lt;br /&gt;
*&amp;lt;i&amp;gt;The Art of Assembly Language Programming&amp;lt;/i&amp;gt; - http://maven.smith.edu/~thiebaut/ArtOfAssembly/artofasm.html&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
&lt;br /&gt;
* [[Signatures]]&lt;/div&gt;</summary>
		<author><name>Showdax</name></author>
		
	</entry>
</feed>