<?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=Shaman</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=Shaman"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/Shaman"/>
	<updated>2026-05-09T18:18:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=HamSandwich_General_Usage_(AMX_Mod_X)&amp;diff=6066</id>
		<title>HamSandwich General Usage (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=HamSandwich_General_Usage_(AMX_Mod_X)&amp;diff=6066"/>
		<updated>2008-07-21T12:15:02Z</updated>

		<summary type="html">&lt;p&gt;Shaman: /* About Ham Sandwich */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Ham Sandwich ==&lt;br /&gt;
Ham Sandwich is a module that provides additional hooking and function calling capabilities to [[AMX Mod X]].  It's included with the 1.8 branch of AMX Mod X.&lt;br /&gt;
&lt;br /&gt;
Instead of hooking and executing Half-Life engine calls, like the modules FakeMeta and Engine do, this hooks and executes virtual function calls.&lt;br /&gt;
&lt;br /&gt;
=== What is a virtual function? ===&lt;br /&gt;
A virtual function is a member function of a class in C++.  In the case of Ham Sandwich, the virtual function would be a member function of a game entity.  The virtual functions deal with various events in game, such as damage, and using entities.&lt;br /&gt;
&lt;br /&gt;
Unlike normal member functions, virtual functions can be changed by class derivatives.  For example, a typical hierarchy of entities in Half-Life game dlls look something like this:&lt;br /&gt;
&lt;br /&gt;
 CBaseEntity&lt;br /&gt;
    CBaseAnimating&lt;br /&gt;
       CBaseMonster&lt;br /&gt;
          CZombie&lt;br /&gt;
          CHeadCrab&lt;br /&gt;
          CBarnacle&lt;br /&gt;
          CBasePlayer&lt;br /&gt;
             CBot&lt;br /&gt;
&lt;br /&gt;
Now for example, if CBaseEntity has the virtual function called &amp;quot;FunctionA&amp;quot;, and that function does nothing.  But, CBarnacle also declares the function &amp;quot;FunctionA&amp;quot;, and instead of doing nothing it causes the barnacle to die.&lt;br /&gt;
&lt;br /&gt;
If something like this were to be executed:&lt;br /&gt;
 CBaseEntity *ent=GET_PRIVATE(entity);&lt;br /&gt;
 ent-&amp;gt;FunctionA();&lt;br /&gt;
&lt;br /&gt;
And the entity were a barnacle, the barnacle would die.  If the entity was a zombie, nothing would happen.&lt;br /&gt;
&lt;br /&gt;
=== What are some limitations? ===&lt;br /&gt;
&lt;br /&gt;
Dealing with virtual functions have a couple minor drawbacks.&lt;br /&gt;
==== Custom Entities ====&lt;br /&gt;
Hooking virtual functions, such as TakeDamage, that get called on custom entities is a little bit awkward.&lt;br /&gt;
&lt;br /&gt;
Because of the way where classes derive, and they get their own virtual table for each class, the type of class that the game dll allocates will be whatever gets hooked for a particular hook.&lt;br /&gt;
&lt;br /&gt;
For example, say you have a plugin like this:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
 #include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
 #include &amp;lt;hamsandwich&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 new myStr;&lt;br /&gt;
 public plugin_init()&lt;br /&gt;
 {&lt;br /&gt;
   myStr = engfunc( EngFunc_AllocString, &amp;quot;info_target&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
   register_clcmd( &amp;quot;make_entity&amp;quot;, &amp;quot;cmdMakeEntity&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
   RegisterHam(Ham_TakeDamage, &amp;quot;damageHook&amp;quot;, &amp;quot;MyEntityClass&amp;quot;); // Error!&lt;br /&gt;
 }&lt;br /&gt;
 public cmdMakeEntity( id )&lt;br /&gt;
 {&lt;br /&gt;
   new ent = engfunc( EngFunc_CreateEntity, myStr );&lt;br /&gt;
   set_pev( ent, pev_classname, &amp;quot;MyEntityClass&amp;quot; );&lt;br /&gt;
   // ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
That will not work, because the class &amp;quot;MyEntityClass&amp;quot; is not native to the gamedll.  Instead, you would need to hook TakeDamage for &amp;quot;info_target&amp;quot;, and do some form of parsing on the entities that get passed to it (such as checking classname), if you want to deal with custom entity hooking.&lt;br /&gt;
&lt;br /&gt;
==== End of Chain Derivatives ====&lt;br /&gt;
The normal way virtual functions get called is by a virtual table that resides somewhere in the class.  A magical index is assigned to each function, and then it looks up the function pointer inside of the virtual table, and executes the required function.&lt;br /&gt;
&lt;br /&gt;
However, compilers are smart enough to optimize away the virtual function lookup if it knows two things about a call:&lt;br /&gt;
* The exact class type of the entity.&lt;br /&gt;
* That the entity is not derived any further.&lt;br /&gt;
&lt;br /&gt;
An example would be using the hierarchy shown earlier.  If, inside of CBot::TakeDamage a call to the virtual function CBot::Killed is made, most compilers will optimize the virtual function lookup out, so that CBot::TakeDamage would then directly call CBot::Killed.  This means that the hook would never be called.&lt;br /&gt;
&lt;br /&gt;
Fortunately, these instances are kind of rare.&lt;br /&gt;
&lt;br /&gt;
==== Config File Requirements ====&lt;br /&gt;
Every hook and every ExecuteHam() call requires an entry for the function which the scripter is attempting to hook or execute.  The function needs to be in the amxmodx/configs/hamdata.ini config file, under the game mod and operating system.&lt;br /&gt;
&lt;br /&gt;
If a function that the script attempts to hook or call is not configured in the hamdata.ini file, then the module will cause the plugin to cease operation, as this is a fatal error.&lt;br /&gt;
&lt;br /&gt;
The fatal errors can be filtered out by including a forward in the script called '''HamFilter'''.  This is similar to native/module filters available inside of the core of amxmodx, whenever a fatal error occurs, it will pass along the parameters to HamFilter, and if HamFilter returns '''PLUGIN_HANDLED''', the error will be ignored (but the attempted hook or execution will not take place).  If the forward does not exist, or if it returns something other than PLUGIN_HANDLED, the plugin will fail.&lt;br /&gt;
&lt;br /&gt;
An example layout for HamFilter:&lt;br /&gt;
 public HamFilter(Ham:which, HamError:err, const reason[])&lt;br /&gt;
 {&lt;br /&gt;
   // Ignore an unconfigured ns_awardkill&lt;br /&gt;
   if (which == Ham_NS_AwardKill &amp;amp;&amp;amp; err == HAM_FUNC_NOT_CONFIGURED)(&lt;br /&gt;
   {&lt;br /&gt;
     return PLUGIN_HANDLED;&lt;br /&gt;
   }&lt;br /&gt;
   // We absolutely need to be able to use cs_roundrespawn!&lt;br /&gt;
   // If we can't, then the plugin cannot continue.&lt;br /&gt;
   if (which == Ham_CS_RoundRespawn)&lt;br /&gt;
   {&lt;br /&gt;
     return 0;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Additionally, you can check to see if a function is valid to execute or hook by using the '''IsHamValid()''' native.  The validity of a function is determined when the module is first loaded, and it will never change, so if you want to check it, there is no need to do so before every execute.&lt;br /&gt;
&lt;br /&gt;
== Supported Mods ==&lt;br /&gt;
=== Mostly Supported ===&lt;br /&gt;
These mods have a very large list of functions that are usable in the module. &lt;br /&gt;
* Counter-Strike 1.6&lt;br /&gt;
* Condition Zero&lt;br /&gt;
* Day of Defeat&lt;br /&gt;
* Team Fortress Classic&lt;br /&gt;
* The Specialists&lt;br /&gt;
* Natural-Selection&lt;br /&gt;
&lt;br /&gt;
=== Weakly Supported ===&lt;br /&gt;
Because these mods do not contain a Linux binary, they are much harder to disassemble.  There is only plans for disassembling two functions for each (TakeDamage and Use).&lt;br /&gt;
* Sven-Coop&lt;br /&gt;
* Earth's Special Forces&lt;br /&gt;
&lt;br /&gt;
== Hooking Functions ==&lt;br /&gt;
The big feature for Ham Sandwich is the ability to hook virtual functions.&lt;br /&gt;
&lt;br /&gt;
=== Creating the Hook ===&lt;br /&gt;
Creating a hook is a lot like creating a hook in Fakemeta.&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
 #include &amp;lt;hamsandwich&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 public plugin_init()&lt;br /&gt;
 {&lt;br /&gt;
   RegisterHam(Ham_TakeDamage, &amp;quot;player_hurt&amp;quot;, &amp;quot;player&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 public player_hurt(this, inflictor, attacker, Float:damage, damagebits)&lt;br /&gt;
 {&lt;br /&gt;
   // Stuff...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
This creates a basic hook which is called any time a player takes damage.  Look in '''ham_const.inc''' for forward parameters for each hook.&lt;br /&gt;
&lt;br /&gt;
Like FakeMeta, there is a hidden last parameter (it goes after the classname in this case).  Set it to 1 to do post hooking.&lt;br /&gt;
&lt;br /&gt;
=== Blocking the Hook ===&lt;br /&gt;
Like Fakemeta and Engine, it is possible to stop a function from being called.  This is called '''superceding'''.&lt;br /&gt;
&lt;br /&gt;
Blocking in Ham Sandwich is identical to how it is accomplished in Fakemeta.  In each hook, you return one of four special values:&lt;br /&gt;
&lt;br /&gt;
* HAM_IGNORED - Nothing happened, the call continues.&lt;br /&gt;
* HAM_HANDLED - You did something, but the call continues.&lt;br /&gt;
* HAM_OVERRIDE - The call will still be executed, but instead you will change the return value.&lt;br /&gt;
* HAM_SUPERCEDE - The call is not executed, and you use your return value, if applicable.&lt;br /&gt;
&lt;br /&gt;
You can use the native '''GetHamReturnStatus()''' to check the current return status of the hook.&lt;br /&gt;
&lt;br /&gt;
=== Return Values ===&lt;br /&gt;
You can get or change the return values for all the hooks available in Ham Sandwich.  Look in '''ham_const.inc''' for a list of all hooks and their return values.&lt;br /&gt;
&lt;br /&gt;
These natives will get any ''modified'' return values.&lt;br /&gt;
* native GetHamReturnInteger(&amp;amp;output);&lt;br /&gt;
* native GetHamReturnFloat(&amp;amp;Float:output);&lt;br /&gt;
* native GetHamReturnVector(Float:output[3]);&lt;br /&gt;
* native GetHamReturnEntity(&amp;amp;output);&lt;br /&gt;
* native GetHamReturnString(output[], size);&lt;br /&gt;
&lt;br /&gt;
These natives will get the ''original'' return value from the function.&lt;br /&gt;
Note that this is '''only''' valid to call in a post hook, it will be undefined to call it at any other time.&lt;br /&gt;
* native GetOrigHamReturnInteger(&amp;amp;output);&lt;br /&gt;
* native GetOrigHamReturnFloat(&amp;amp;Float:output);&lt;br /&gt;
* native GetOrigHamReturnVector(Float:output[3]);&lt;br /&gt;
* native GetOrigHamReturnCbase(&amp;amp;output);&lt;br /&gt;
* native GetOrigHamReturnString(output[], size);&lt;br /&gt;
&lt;br /&gt;
These natives will change the return value to whatever you please.&lt;br /&gt;
Note that this will have no effect on the actual return value from the function '''unless''' the return status of the hook is HAM_OVERRIDE or HAM_SUPERCEDE.&lt;br /&gt;
* native SetHamReturnInteger(value);&lt;br /&gt;
* native SetHamReturnFloat(Float:value);&lt;br /&gt;
* native SetHamReturnVector(const Float:value[3]);&lt;br /&gt;
* native SetHamReturnEntity(value);&lt;br /&gt;
* native SetHamReturnString(const value[]);&lt;br /&gt;
&lt;br /&gt;
=== Changing Hook Parameters ===&lt;br /&gt;
One feature available in Ham Sandwich that is not available in FakeMeta is the ability to change all parameters on the fly for each hook.&lt;br /&gt;
&lt;br /&gt;
This means that, for example, if you wanted to make a plugin that halved all damage players take, you would do something like this:&lt;br /&gt;
 #include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
 #include &amp;lt;hamsandwich&amp;gt;&lt;br /&gt;
 public plugin_init()&lt;br /&gt;
 {&lt;br /&gt;
   RegisterHam(Ham_TakeDamage, &amp;quot;player_hurt&amp;quot;, &amp;quot;player&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 public player_hurt(this, inflictor, attacker, Float:damage, damagebits)&lt;br /&gt;
 {&lt;br /&gt;
   SetHamParamFloat(4, damage / 2.0);&lt;br /&gt;
   return HAM_HANDLED;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
All hooks after the one you change them in will see the modified values.  Hooks are executed in the order in which they are registered.&lt;br /&gt;
&lt;br /&gt;
All available parameter changing natives are:&lt;br /&gt;
&lt;br /&gt;
* native SetHamParamInteger(which, value);&lt;br /&gt;
* native SetHamParamFloat(which, Float:value);&lt;br /&gt;
* native SetHamParamVector(which, const Float:value[3]);&lt;br /&gt;
* native SetHamParamEntity(which, value);&lt;br /&gt;
* native SetHamParamString(which, const output[]);&lt;br /&gt;
* native SetHamParamTraceResult(which, tr_handle);&lt;br /&gt;
&lt;br /&gt;
=== Disabling Hooks ===&lt;br /&gt;
&lt;br /&gt;
Similar to how FakeMeta allows for unregistering of hooks with unregister_forward, HamSandwich will allow you to disable and enable hooks whenever you want.&lt;br /&gt;
&lt;br /&gt;
The '''RegisterHam''' function will return a handle (tagged with HamHook).  You can then make subsequent calls to DisableHamHook() and EnableHamHook() with the handle to stop it from forwarding, or enable its forwards again.&lt;br /&gt;
&lt;br /&gt;
There is no way to completely unregister the hooks (until map change), as deleting a hook is a delicate process.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_1.0.2_Release_Notes&amp;diff=5907</id>
		<title>SourceMod 1.0.2 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_1.0.2_Release_Notes&amp;diff=5907"/>
		<updated>2008-06-01T01:21:39Z</updated>

		<summary type="html">&lt;p&gt;Shaman: Team Fortress -&amp;gt; Team Fortress 2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
&lt;br /&gt;
SourceMod 1.0.2 is a feature and bug-fix upgrade from 1.0.1.  If you need help upgrading, see [[Upgrading SourceMod]].&lt;br /&gt;
&lt;br /&gt;
*[[Image:checkmark.gif]] '''All old plugins and extensions will continue to work.'''&lt;br /&gt;
*[[Image:checkmark.gif]] '''This release has new config files, but no config changes.'''&lt;br /&gt;
*[[Image:badmark.gif]] '''Config files introduced during the beta period have been changed (see notes).'''&lt;br /&gt;
*[[Image:badmark.gif]] '''This release has one very minor compatibility change.'''&lt;br /&gt;
*[[Image:checkmark.gif]] '''This release has no translation changes.'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Custom Admin Menu=&lt;br /&gt;
Also known as the &amp;quot;dynamic admin menu,&amp;quot; the admin menu now has a much greater degree of customization.  Server administrators can add new entries onto the menu via configuration files.  For more information, see [[Custom Admin Menu (SourceMod)]].&lt;br /&gt;
&lt;br /&gt;
=TF2 Extension=&lt;br /&gt;
The TF2 extension adds scripting functionality to servers running Team Fortress 2.  It also adds two new multi-targets for admin commands:&lt;br /&gt;
*@red - Everyone on the red team&lt;br /&gt;
*@blue - Everyone on the blue team&lt;br /&gt;
&lt;br /&gt;
The new scripting functionality is split into [http://docs.sourcemod.net/api/index.php?fastload=file&amp;amp;id=49&amp;amp; natives] and [http://docs.sourcemod.net/api/index.php?fastload=file&amp;amp;id=50&amp;amp; stocks].&lt;br /&gt;
&lt;br /&gt;
=RegEx Extension=&lt;br /&gt;
The new regular expression extension adds scripting features for text pattern matching.  You can view the new API [http://docs.sourcemod.net/api/index.php?fastload=file&amp;amp;id=52&amp;amp; here].&lt;br /&gt;
&lt;br /&gt;
=Entity Output Hooking=&lt;br /&gt;
Entity outputs are delayed inputs from one entity to another.  This system allows maps to queue actions on certain entities.  When a specific action happens, the queue is emptied, and all of the inputs are fired.&lt;br /&gt;
&lt;br /&gt;
SourceMod now allows scripts to intercept when these events fire.  This is a powerful feature that lets plugins listen for very specific events, for example, when a door opens (class CDoor, event &amp;quot;OnOpen&amp;quot;).  &lt;br /&gt;
&lt;br /&gt;
The API for this is [http://docs.sourcemod.net/api/index.php?fastload=file&amp;amp;id=51&amp;amp; here].&lt;br /&gt;
&lt;br /&gt;
=Map Config Helper=&lt;br /&gt;
There is a new forward, [http://docs.sourcemod.net/api/index.php?fastload=show&amp;amp;id=852&amp;amp; OnAutoConfigsBuffered], for map config plugin authors.  Using [http://docs.sourcemod.net/api/index.php?fastload=show&amp;amp;id=582&amp;amp; OnConfigsExecuted] to run config files is a mistake, because config files must be guaranteed to have already loaded by that point in time, and [http://docs.sourcemod.net/api/index.php?fastload=show&amp;amp;id=454&amp;amp; ServerCommand] is delayed.&lt;br /&gt;
&lt;br /&gt;
Plugins with this mistake were notified a few weeks ago, and with this release, authors should make sure they fix any conflicts.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Changes=&lt;br /&gt;
*The admin menu is now user-modifiable (the &amp;quot;Dynamic Admin Menu&amp;quot;).&lt;br /&gt;
*Added a TF2 extension with Team Fortress 2 functions.&lt;br /&gt;
*Added a RegEx extension with regular expression functions.&lt;br /&gt;
*Added functions to SDKTools for hooking entity outputs.&lt;br /&gt;
*Added preliminary support for the DoD:S Orange Box beta.&lt;br /&gt;
*Added a forward for map config plugins for preventing race conditions.&lt;br /&gt;
*Added a %b format specifier for binary printing.&lt;br /&gt;
*Added sm_dump_datamaps command (SDKTools) for enumerating datamap properties.&lt;br /&gt;
*Added sm_dump_admcache command for debugging the admin cache.&lt;br /&gt;
*Added {{amb|1715}} - TraceHull functions to SDKTools (complementing TraceRay).&lt;br /&gt;
*Added {{amb|1694}} - FindCharInString() function.&lt;br /&gt;
*Added {{amb|1685}} - GetTickInterval() function.&lt;br /&gt;
*Added {{amb|1620}} - ActivateEntity() function to SDKTools (for Orange Box particle system).&lt;br /&gt;
*Added {{amb|1610}} - StripQuotes() function.&lt;br /&gt;
*Added {{amb|1558}} - Compiler now has __BINARY_PATH__ and __BINARY_FILE__ macros.&lt;br /&gt;
*Fixed {{amb|1686}} -  ReplaceString* with an empty search string crashed; it now throws an error instead.&lt;br /&gt;
*Fixed {{amb|1684}} - Blank passwords required an existing but empty setinfo password.&lt;br /&gt;
*Fixed {{amb|1595}} - Extension load failures did not show a platform error message.&lt;br /&gt;
*Fixed {{amb|1583}} - MySQL string fetch from prepared queries returned corrupted data.&lt;br /&gt;
*Fixed {{amb|1358}} - Timeleft did not reset on TF2 restarts.&lt;br /&gt;
*Fixed cases where the JIT was too cautious in space optimizations.&lt;br /&gt;
*Fixed TF2/Cstrike extensions being loadable on incompatible games.&lt;br /&gt;
*Fixed various documentation inconsistencies and typos.&lt;br /&gt;
*Fixed internal bugs with file extension handling.&lt;br /&gt;
&lt;br /&gt;
=Notes=&lt;br /&gt;
==Blank Passwords==&lt;br /&gt;
There is a possible compatibility regression from {{amb|1684}}.  SetAdminPassword() has been modified to remove any set password when given an empty string.  Previously, a blank password (&amp;quot;&amp;quot;) would force an admin to use &amp;quot;setinfo&amp;quot; to set an empty password, but this functionality was deemed unuseful and unintended.  Blank passwords now remove any set password.&lt;br /&gt;
&lt;br /&gt;
==Moved Config Files==&lt;br /&gt;
Two files were moved during the shift from beta to release.  These files were introduced during the beta cycle and thus this modification is not considered a compatibility change.  Nonetheless, there is a compatibility shim for this change.&lt;br /&gt;
&lt;br /&gt;
*'''configs/dynamicmenu/adminmenu_grouping.txt''' is now '''configs/adminmenu_grouping.txt'''&lt;br /&gt;
*'''configs/dynamicmenu/menu.ini''' is now '''configs/adminmenu_custom.txt'''&lt;br /&gt;
*'''configs/dynamicmenu has been removed'''&lt;br /&gt;
&lt;br /&gt;
Temporary compatibility is as follows: If any older file exists, it is loaded instead of the new file.  If an old file cannot be found, the new file is loaded instead.  This compatibility shim will be removed from all branches next release.&lt;br /&gt;
&lt;br /&gt;
==DoD:S Beta Support==&lt;br /&gt;
Since DoD:S Orange Box is a beta, its SDKTools support is experimental only.  It will be officially supported when DoD:S Orange Box is officially released.&lt;br /&gt;
&lt;br /&gt;
==Web Compiler==&lt;br /&gt;
The web compiler has been updated to build 1.0.2-compatible plugins.  Old SourceMod installations will be able to run these plugins as long as no new functionality is used.&lt;br /&gt;
&lt;br /&gt;
==Removed TF2 Stocks==&lt;br /&gt;
More broken TF2 stocks have been removed.  There are no compatibility shims for them.&lt;br /&gt;
*TF2_GivePlayerWeapon&lt;br /&gt;
*TF2_EquipPlayerClassWeapons&lt;br /&gt;
*TF2_SetPlayerClass's third parameter is now ignored&lt;br /&gt;
&lt;br /&gt;
These functions may be restored in full if workarounds can be found.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Support Schedule=&lt;br /&gt;
SourceMod 1.0.2 replaces SourceMod 1.0.0, and 1.0.0 is no longer supported.  &lt;br /&gt;
&lt;br /&gt;
SourceMod 1.0.1 will continue to be supported, however, all bug fixes will occur in the 1.0.3 branch (which includes all changes in 1.0.2).  Support for 1.0.1 will stop when 1.0.3 is released.&lt;/div&gt;</summary>
		<author><name>Shaman</name></author>
		
	</entry>
</feed>