<?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=PRED%2A</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=PRED%2A"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/PRED*"/>
	<updated>2026-04-18T08:22:14Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.2_Release_Notes&amp;diff=7387</id>
		<title>SourceMod 1.2.2 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.2_Release_Notes&amp;diff=7387"/>
		<updated>2009-08-27T21:41:31Z</updated>

		<summary type="html">&lt;p&gt;PRED*: Created page with '__FORCETOC__ SourceMod 1.2.2 is a minor bug-fix update.  If you need help upgrading, see Upgrading SourceMod.  To see the full 1.2 release notes, [[SourceMod 1.2.0 Release No...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
SourceMod 1.2.2 is a minor bug-fix update.  If you need help upgrading, see [[Upgrading SourceMod]].  To see the full 1.2 release notes, [[SourceMod 1.2.0 Release Notes|click here]].&lt;br /&gt;
&lt;br /&gt;
*'''This release DOES NOT have configuration changes.'''&lt;br /&gt;
*'''This release DOES NOT break compatibility.'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=Compatibility=&lt;br /&gt;
This release is fully backwards compatible.  It is not, however, forwards compatible.  Plugins compiled against SourceMod 1.2 will not run on 1.1 or 1.0.  If you encounter any compatibility problems, file a bug.&lt;br /&gt;
&lt;br /&gt;
=Translations=&lt;br /&gt;
SourceMod 1.2 comes with the following languages translated, thanks to [http://www.sourcemod.net/translator/?go=translate&amp;amp;op=status community translators]:&lt;br /&gt;
*Brazilian Portuguese&lt;br /&gt;
*Chinese Simplified&lt;br /&gt;
*Danish&lt;br /&gt;
*Dutch&lt;br /&gt;
*French&lt;br /&gt;
*German&lt;br /&gt;
*Hungarian&lt;br /&gt;
*Italian&lt;br /&gt;
*Japanese&lt;br /&gt;
*Latvian&lt;br /&gt;
*Norwegian&lt;br /&gt;
*Polish&lt;br /&gt;
*Romanian&lt;br /&gt;
*Russian&lt;br /&gt;
*Spanish&lt;br /&gt;
*Turkish&lt;br /&gt;
&lt;br /&gt;
=Changelog=&lt;br /&gt;
*Removed auto folders. ({{bz|3949}}).&lt;br /&gt;
*Added PointOutsideWorld native to sdktools. ({{bz|3906}}).&lt;br /&gt;
*Added &amp;quot;motd&amp;quot; chat trigger to basetriggers. ({{bz|2694}}).&lt;br /&gt;
*Added manual extension reloading command to root console menu. ({{bz|3934}}).&lt;br /&gt;
*Fixed 'list' type custom menu entries overwriting admin restrictions. ({{bz|3783}}).&lt;br /&gt;
*Added sm_resetcvar command to basecommands. ({{bz|3636}}).&lt;br /&gt;
*Updated gamedata for DOD:S. ({{bz|3948}}).&lt;br /&gt;
*Updated gamedata for TF2. ({{bz|3948}}).&lt;br /&gt;
*Added new .ep2v build config for valve OB based games. ({{bz|3948}}).&lt;br /&gt;
*Fixed incorrect escaping in clientprefs SQLite queries. ({{bz|3904}}).&lt;br /&gt;
*Updated gamedata for Synergy. ({{bz|3315}}).&lt;br /&gt;
*Upgraded to pcre-7.9 ({{bz|3923}}).&lt;br /&gt;
*Switched Insurgency chat printing to SayText. ({{bz|3738}}).&lt;br /&gt;
*Updated gamedata for Insurgency. ({{bz|3511}}).&lt;br /&gt;
*Updated gamedata for ZM. ({{bz|3746}}).&lt;br /&gt;
*Updated gamedata for Empires. ({{bz|3500}}).&lt;br /&gt;
*Updated gamedata for ZPS. ({{bz|3877}}).&lt;br /&gt;
*Updated gamedata for AoC. ({{bz|3891}}).&lt;br /&gt;
*Fixed RemovePlayerDisguise signature for TF2. ({{bz|3892}}).&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Logical_Entities_(SourceMod)&amp;diff=7334</id>
		<title>Logical Entities (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Logical_Entities_(SourceMod)&amp;diff=7334"/>
		<updated>2009-07-24T00:11:10Z</updated>

		<summary type="html">&lt;p&gt;PRED*: Redirected page to Entity References (SourceMod)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Entity References (SourceMod)]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Scripting&amp;diff=7333</id>
		<title>Category:SourceMod Scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Scripting&amp;diff=7333"/>
		<updated>2009-07-24T00:10:09Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains articles about scripting for SourceMod with SourcePawn.&lt;br /&gt;
&lt;br /&gt;
===Introductions===&lt;br /&gt;
*[[Introduction to SourcePawn]] - Learning language syntax.&lt;br /&gt;
*[[Introduction to SourceMod Plugins]] - Writing your &amp;quot;first plugin.&amp;quot;&lt;br /&gt;
*[http://docs.sourcemod.net/api API Reference] - Searchable scripting API reference.&lt;br /&gt;
&lt;br /&gt;
===Basic API===&lt;br /&gt;
*[[AutoConfigs (SourceMod Scripting)|AutoConfigs]] - Automatic .cfg creation for cvars.&lt;br /&gt;
*[[Commands (SourceMod Scripting)|Commands]] - Console commands/input.&lt;br /&gt;
*[[ConVars (SourceMod Scripting)|ConVars]] - Console variables (cvars).&lt;br /&gt;
*[[Events (SourceMod Scripting)|Events]] - Half-Life 2 Game Events.&lt;br /&gt;
*[[KeyValues (SourceMod Scripting)|KeyValues]] - KeyValues file parsing/writing.&lt;br /&gt;
*[[Menu API (SourceMod)|Menus]] - Building and drawing menus.&lt;br /&gt;
*[[SQL (SourceMod Scripting)|SQL]] - Using databases (MySQL, SQLite).&lt;br /&gt;
*[[Timers (SourceMod Scripting)|Timers]] - Timed callbacks.&lt;br /&gt;
*[[Translations (SourceMod Scripting)|Translations]] - Internationalization.&lt;br /&gt;
*[[Entity References (SourceMod)|Entity References]] - A safe way of storing entities.&lt;br /&gt;
&lt;br /&gt;
===Advanced API===&lt;br /&gt;
*[[Admin API (SourceMod)|Administration API]] - Using the Admin Cache.&lt;br /&gt;
*[[Admin Menu (SourceMod Scripting)|Admin Menu API]] - Attaching to the Admin Menu.&lt;br /&gt;
*[[Creating Natives (SourceMod Scripting)|Creating Natives]] - Exposing API to other plugins.&lt;br /&gt;
*[[Function Calling API (SourceMod Scripting)|Function Calling API]] - Calling external functions.&lt;br /&gt;
*[[Optional Requirements (SourceMod Scripting)|Optional Requirements]] - Managing dependencies.&lt;br /&gt;
*[[SDKTools (SourceMod Scripting)|SDKTools]] - Using the powerful SDK abstraction layer.&lt;br /&gt;
*[[TempEnts (SourceMod SDKTools)|Temporary Entities]] - Using temporary entities.&lt;br /&gt;
&lt;br /&gt;
===Information===&lt;br /&gt;
*[[Format Class Functions (SourceMod Scripting)|Format Class Functions]] - All about text formatting.&lt;br /&gt;
*[[Handles (SourceMod Scripting)|Handles]] - Overview of Handles and some common types.&lt;br /&gt;
*[[Optimizing Plugins (SourceMod Scripting)|Optimizing Plugins]] - Optimization hints.&lt;br /&gt;
*[[Tags (Scripting)|Tags]] - All about tags.&lt;br /&gt;
*[[Vectors Explained (Scripting)|Vectors Explained]] - Explanation of Vector types.&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
*[http://docs.sourcemod.net/api API Reference] - Searchable scripting API reference.&lt;br /&gt;
*[[Entity Properties]] - Explanation of Source entity properties.&lt;br /&gt;
*[[Game Events (Source)|Game Events]] - Game events listings for popular mods.&lt;br /&gt;
*[[Mod TempEnt List (Source)|Temp Entity Lists]] - Temporary entities for popular mods.&lt;br /&gt;
*[[SourceMod Profiler]] - Performance tracking and optimizing.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Scripting&amp;diff=7332</id>
		<title>Category:SourceMod Scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Scripting&amp;diff=7332"/>
		<updated>2009-07-24T00:09:56Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains articles about scripting for SourceMod with SourcePawn.&lt;br /&gt;
&lt;br /&gt;
===Introductions===&lt;br /&gt;
*[[Introduction to SourcePawn]] - Learning language syntax.&lt;br /&gt;
*[[Introduction to SourceMod Plugins]] - Writing your &amp;quot;first plugin.&amp;quot;&lt;br /&gt;
*[http://docs.sourcemod.net/api API Reference] - Searchable scripting API reference.&lt;br /&gt;
&lt;br /&gt;
===Basic API===&lt;br /&gt;
*[[AutoConfigs (SourceMod Scripting)|AutoConfigs]] - Automatic .cfg creation for cvars.&lt;br /&gt;
*[[Commands (SourceMod Scripting)|Commands]] - Console commands/input.&lt;br /&gt;
*[[ConVars (SourceMod Scripting)|ConVars]] - Console variables (cvars).&lt;br /&gt;
*[[Events (SourceMod Scripting)|Events]] - Half-Life 2 Game Events.&lt;br /&gt;
*[[KeyValues (SourceMod Scripting)|KeyValues]] - KeyValues file parsing/writing.&lt;br /&gt;
*[[Menu API (SourceMod)|Menus]] - Building and drawing menus.&lt;br /&gt;
*[[SQL (SourceMod Scripting)|SQL]] - Using databases (MySQL, SQLite).&lt;br /&gt;
*[[Timers (SourceMod Scripting)|Timers]] - Timed callbacks.&lt;br /&gt;
*[[Translations (SourceMod Scripting)|Translations]] - Internationalization.&lt;br /&gt;
*[[Entity References (SourceMod)|Entity References] - A safe way of storing entities.&lt;br /&gt;
&lt;br /&gt;
===Advanced API===&lt;br /&gt;
*[[Admin API (SourceMod)|Administration API]] - Using the Admin Cache.&lt;br /&gt;
*[[Admin Menu (SourceMod Scripting)|Admin Menu API]] - Attaching to the Admin Menu.&lt;br /&gt;
*[[Creating Natives (SourceMod Scripting)|Creating Natives]] - Exposing API to other plugins.&lt;br /&gt;
*[[Function Calling API (SourceMod Scripting)|Function Calling API]] - Calling external functions.&lt;br /&gt;
*[[Optional Requirements (SourceMod Scripting)|Optional Requirements]] - Managing dependencies.&lt;br /&gt;
*[[SDKTools (SourceMod Scripting)|SDKTools]] - Using the powerful SDK abstraction layer.&lt;br /&gt;
*[[TempEnts (SourceMod SDKTools)|Temporary Entities]] - Using temporary entities.&lt;br /&gt;
&lt;br /&gt;
===Information===&lt;br /&gt;
*[[Format Class Functions (SourceMod Scripting)|Format Class Functions]] - All about text formatting.&lt;br /&gt;
*[[Handles (SourceMod Scripting)|Handles]] - Overview of Handles and some common types.&lt;br /&gt;
*[[Optimizing Plugins (SourceMod Scripting)|Optimizing Plugins]] - Optimization hints.&lt;br /&gt;
*[[Tags (Scripting)|Tags]] - All about tags.&lt;br /&gt;
*[[Vectors Explained (Scripting)|Vectors Explained]] - Explanation of Vector types.&lt;br /&gt;
&lt;br /&gt;
===Resources===&lt;br /&gt;
*[http://docs.sourcemod.net/api API Reference] - Searchable scripting API reference.&lt;br /&gt;
*[[Entity Properties]] - Explanation of Source entity properties.&lt;br /&gt;
*[[Game Events (Source)|Game Events]] - Game events listings for popular mods.&lt;br /&gt;
*[[Mod TempEnt List (Source)|Temp Entity Lists]] - Temporary entities for popular mods.&lt;br /&gt;
*[[SourceMod Profiler]] - Performance tracking and optimizing.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7331</id>
		<title>Entity References (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7331"/>
		<updated>2009-07-24T00:08:49Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Since entities are constantly being created and destroyed a cached index doesn't guarantee the underlying entity is the same, references provide a way of verifying the same entity still exists. Generally speaking, if you have an entity index you wish to cache you should convert it to a reference first. All natives (provided by SourceMod) should be able to accept references in place of indexes (wherever the parameter asks for an entity - Not clients), and these will check use the serial to check that the entity index contained in the reference is the same as when the reference was created.&lt;br /&gt;
&lt;br /&gt;
SourceMod now also supports handling of logical (non-networked entities) and these use references exclusively. Natives that used to return an entity index will continue to do so in the case of networked entities (for backwards compatability) and will only return a reference for non-networked ones.&lt;br /&gt;
&lt;br /&gt;
==Converting a backwards-compat index/ref to a guaranteed reference for safely caching==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new index = GetEntPropEnt(client, Prop_Send, &amp;quot;m_hActiveWeapon&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
/* Convert our backwards-compat index/ref to a guaranteed reference */&lt;br /&gt;
new ref = EntIndexToEntRef(index);&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Converting a reference back to an entity index==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new index = EntRefToEntIndex(ref);&lt;br /&gt;
&lt;br /&gt;
if (index == -1)&lt;br /&gt;
{&lt;br /&gt;
	/* Reference wasn't valid - Entity must have been deleted */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using References to handle a logic entity==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new ent = -1;&lt;br /&gt;
&lt;br /&gt;
while ((ent = FindEntityByClassname(ent, &amp;quot;logic_auto&amp;quot;)) != INVALID_ENT_REFERENCE)&lt;br /&gt;
{&lt;br /&gt;
	/** &lt;br /&gt;
	 * Get the entity index from this reference - This works on references and indexes for convenience. &lt;br /&gt;
	 * Should be a number &amp;gt;2048 since logic_auto is a non networked entity &lt;br /&gt;
	 */&lt;br /&gt;
	new index = EntRefToEntIndex(ent);&lt;br /&gt;
&lt;br /&gt;
	/* Fire an input on this entity - We use the reference version since this includes a serial check */&lt;br /&gt;
	AcceptEntityInput(ent, &amp;quot;Kill&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Scripting]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7330</id>
		<title>Entity References (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7330"/>
		<updated>2009-07-24T00:06:31Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Since entities are constantly being created and destroyed a cached index doesn't guarantee the underlying entity is the same, references provide a way of verifying the same entity still exists. Generally speaking, if you have an entity index you wish to cache you should convert it to a reference first. All natives (provided by SourceMod) should be able to accept references in place of indexes (wherever the parameter asks for an entity - Not clients), and these will check use the serial to check that the entity index contained in the reference is the same as when the reference was created.&lt;br /&gt;
&lt;br /&gt;
SourceMod now also supports handling of logical (non-networked entities) and these use references exclusively. Natives that used to return an entity index will continue to do so in the case of networked entities (for backwards compatability) and will only return a reference for non-networked ones.&lt;br /&gt;
&lt;br /&gt;
==Converting a backwards-compat index/ref to a guaranteed reference for safely caching==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new index = GetEntPropEnt(client, Prop_Send, &amp;quot;m_hActiveWeapon&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
/* Convert our backwards-compat index/ref to a guaranteed reference */&lt;br /&gt;
new ref = EntIndexToEntRef(index);&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Converting a reference back to an entity index==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new index = EntRefToEntIndex(ref);&lt;br /&gt;
&lt;br /&gt;
if (index == -1)&lt;br /&gt;
{&lt;br /&gt;
	/* Reference wasn't valid - Entity must have been deleted */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using References to handle a logic entity==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new ent = -1;&lt;br /&gt;
&lt;br /&gt;
while ((ent = FindEntityByClassname(ent, &amp;quot;logic_auto&amp;quot;)) != INVALID_ENT_REFERENCE)&lt;br /&gt;
{&lt;br /&gt;
	/** &lt;br /&gt;
	 * Get the entity index from this reference - This works on references and indexes for convenience. &lt;br /&gt;
	 * Should be a number &amp;gt;2048 since logic_auto is a non networked entity &lt;br /&gt;
	 */&lt;br /&gt;
	new index = EntRefToEntIndex(ent);&lt;br /&gt;
&lt;br /&gt;
	/* Fire an input on this entity - We use the reference version since this includes a serial check */&lt;br /&gt;
	AcceptEntityInput(ent, &amp;quot;Kill&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7329</id>
		<title>Entity References (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7329"/>
		<updated>2009-07-24T00:06:18Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Since entities are constantly being created and destroyed a cached index doesn't guarantee the underlying entity is the same, references provide a way of verifying the same entity still exists. Generally speaking, if you have an entity index you wish to cache you should convert it to a reference first. All natives (provided by SourceMod) should be able to accept references in place of indexes (wherever the parameter asks for an entity - Not clients), and these will check use the serial to check that the entity index contained in the reference is the same as when the reference was created.&lt;br /&gt;
&lt;br /&gt;
SourceMod now also supports handling of logical (non-networked entities) and these use references exclusively. Natives that used to return an entity index will continue to do so in the case of networked entities (for backwards compatability) and will only return a reference for non-networked ones.&lt;br /&gt;
&lt;br /&gt;
==Converting a backwards-compat index/ref to a guaranteed reference for safely caching==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new index = GetEntPropEnt(client, Prop_Send, &amp;quot;m_hActiveWeapon&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
/* Convert our backwards-compat index/ref to a guaranteed reference */&lt;br /&gt;
new ref = EntIndexToEntRef(index);&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Converting a reference back to an entity index==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new index = EntRefToEntIndex(ref);&lt;br /&gt;
&lt;br /&gt;
if (index == -1)&lt;br /&gt;
{&lt;br /&gt;
	/* Reference wasn't valid - Entity must have been deleted */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using References to handle a logic entity==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new ent = -1;&lt;br /&gt;
&lt;br /&gt;
while ((ent = FindEntityByClassname(ent, &amp;quot;logic_auto&amp;quot;)) != INVALID_ENT_REFERENCE)&lt;br /&gt;
{&lt;br /&gt;
	/** &lt;br /&gt;
	 * Get the entity index from this reference - This works on references and indexes for convenience. &lt;br /&gt;
	 * Should be a number &amp;gt;2048 since logic_auto is a non networked entity &lt;br /&gt;
	 */&lt;br /&gt;
	new index = EntRefToEntIndex(ent);&lt;br /&gt;
&lt;br /&gt;
	/* Fire an input on this entity - We use the reference version since this includes a serial check */&lt;br /&gt;
	AcceptEntityInput(ent, &amp;quot;Kill&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7328</id>
		<title>Entity References (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Entity_References_(SourceMod)&amp;diff=7328"/>
		<updated>2009-07-24T00:04:05Z</updated>

		<summary type="html">&lt;p&gt;PRED*: Created page with 'An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Sinc...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An entity reference is a combination of a standard entity index (used for all entities in SourceMod previously) and a pseudo-unique serial number that identifies the entity. Since entities are constantly being created and destroyed a cached index doesn't guarantee the underlying entity is the same, references provide a way of verifying the same entity still exists. Generally speaking, if you have an entity index you wish to cache you should convert it to a reference first. All natives (provided by SourceMod) should be able to accept references in place of indexes (wherever the parameter asks for an entity - Not clients), and these will check use the serial to check that the entity index contained in the reference is the same as when the reference was created.&lt;br /&gt;
&lt;br /&gt;
SourceMod now also supports handling of logical (non-networked entities) and these use references exclusively. Natives that used to return an entity index will continue to do so in the case of networked entities (for backwards compatability) and will only return a reference for non-networked ones.&lt;br /&gt;
&lt;br /&gt;
==Converting a backwards-compat index/ref to a guaranteed reference for safely caching==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new index = GetEntPropEnt(client, Prop_Send, &amp;quot;m_hActiveWeapon&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
/* Convert our backwards-compat index/ref to a guaranteed reference */&lt;br /&gt;
new ref = EntIndexToEntRef(index);&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
==Using References to handle a logic entity==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
new ent = -1;&lt;br /&gt;
&lt;br /&gt;
while ((ent = FindEntityByClassname(ent, &amp;quot;logic_auto&amp;quot;)) != INVALID_ENT_REFERENCE)&lt;br /&gt;
{&lt;br /&gt;
	/** &lt;br /&gt;
	 * Get the entity index from this reference - This works on references and indexes for convenience. &lt;br /&gt;
	 * Should be a number &amp;gt;2048 since logic_auto is a non networked entity &lt;br /&gt;
	 */&lt;br /&gt;
	new index = EntRefToEntIndex(ent);&lt;br /&gt;
&lt;br /&gt;
	/* Fire an input on this entity - We use the reference version since this includes a serial check */&lt;br /&gt;
	AcceptEntityInput(ent, &amp;quot;Kill&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:Game_Resources&amp;diff=7288</id>
		<title>Category:Game Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:Game_Resources&amp;diff=7288"/>
		<updated>2009-05-22T04:46:46Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Team Fortress 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this category you can find resources for specific mods.&lt;br /&gt;
&lt;br /&gt;
==Left 4 Dead==&lt;br /&gt;
[[Left_4_Dead_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Left_4_Voting|Voting]]&lt;br /&gt;
&lt;br /&gt;
==Team Fortress 2==&lt;br /&gt;
[[Team_Fortress_2_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tf2classes.txt Classnames]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/ctfplayer-vtable-220509.txt CTFPlayer Virtual Functions] - Updated 22/05/09&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tf-net-220509.txt Entity Properties] - Updated 22/05/09&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tf-data-220509.txt DataMap Properties] - Updated 22/05/09&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mod_TempEnt_List_(Source)#Team_Fortress_2|Temp Ents]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/CTFKnife%20vtable.txt CTFKnife Virtual Functions]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/CTFWeaponBase%20Vtable.txt CTFWeaponBase Virtual Functions]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://wiki.alliedmods.net/Achievement_IDs Achievement ID Numbers]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Team_Fortress_2_Weapons|Team Fortress 2 Weapon Entity Names]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Counter-Strike: Source==&lt;br /&gt;
[[Counter-Strike:_Source_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csclasses.txt Classnames]&amp;lt;br&amp;gt;&lt;br /&gt;
[[CCSPlayer_offset_list_(SourceMM)|CCSPlayer Virtual Functions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[CBaseCombatWeapon_CSS_offset_list_(SourceMM)|CBaseCombatWeapon Virtual Functions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csdump.txt Entity Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csdatamaps.txt DataMap Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mod_TempEnt_List_(Source)#Counter-Strike:_Source|Temp Ents]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Counter-Strike:_Source_Weapons| Counter-Strike: Source Weapons]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://wiki.alliedmods.net/images/Counter-Strike_Source_-_Cvar_List.txt Cvar List]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:Game_Resources&amp;diff=7286</id>
		<title>Category:Game Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:Game_Resources&amp;diff=7286"/>
		<updated>2009-05-22T03:22:51Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Team Fortress 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this category you can find resources for specific mods.&lt;br /&gt;
&lt;br /&gt;
==Left 4 Dead==&lt;br /&gt;
[[Left_4_Dead_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Left_4_Voting|Voting]]&lt;br /&gt;
&lt;br /&gt;
==Team Fortress 2==&lt;br /&gt;
[[Team_Fortress_2_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tf2classes.txt Classnames]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/ctfplayer-vtable-20070522.txt CTFPlayer Virtual Functions] - Updated 22/05/08&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tf-net-220509.txt Entity Properties] - Updated 22/05/09&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tf-data-220509.txt DataMap Properties] - Updated 22/05/09&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mod_TempEnt_List_(Source)#Team_Fortress_2|Temp Ents]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/CTFKnife%20vtable.txt CTFKnife Virtual Functions]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/CTFWeaponBase%20Vtable.txt CTFWeaponBase Virtual Functions]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://wiki.alliedmods.net/Achievement_IDs Achievement ID Numbers]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Team_Fortress_2_Weapons|Team Fortress 2 Weapon Entity Names]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Counter-Strike: Source==&lt;br /&gt;
[[Counter-Strike:_Source_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csclasses.txt Classnames]&amp;lt;br&amp;gt;&lt;br /&gt;
[[CCSPlayer_offset_list_(SourceMM)|CCSPlayer Virtual Functions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[CBaseCombatWeapon_CSS_offset_list_(SourceMM)|CBaseCombatWeapon Virtual Functions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csdump.txt Entity Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csdatamaps.txt DataMap Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mod_TempEnt_List_(Source)#Counter-Strike:_Source|Temp Ents]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Counter-Strike:_Source_Weapons| Counter-Strike: Source Weapons]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://wiki.alliedmods.net/images/Counter-Strike_Source_-_Cvar_List.txt Cvar List]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_Release_Notes&amp;diff=6954</id>
		<title>SourceMod Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_Release_Notes&amp;diff=6954"/>
		<updated>2009-02-26T22:42:47Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[SourceMod]] Release notes for each release:&lt;br /&gt;
&lt;br /&gt;
*[[SourceMod 1.1.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.1.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.1.0 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.4 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.3 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.2 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0.1 Release Notes]]&lt;br /&gt;
*[[SourceMod 1.0 Release Notes]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_1.1.2_Release_Notes&amp;diff=6953</id>
		<title>SourceMod 1.1.2 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_1.1.2_Release_Notes&amp;diff=6953"/>
		<updated>2009-02-26T22:42:31Z</updated>

		<summary type="html">&lt;p&gt;PRED*: New page: __FORCETOC__ SourceMod 1.1.2 is a minor bug-fix update, intended mainly for parity with the latest Team Fortress update.  If you need help upgrading, see Upgrading SourceMod.  *'''This...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
SourceMod 1.1.2 is a minor bug-fix update, intended mainly for parity with the latest Team Fortress update.  If you need help upgrading, see [[Upgrading SourceMod]].&lt;br /&gt;
&lt;br /&gt;
*'''This release DOES NOT have configuration changes.'''&lt;br /&gt;
*'''This release DOES NOT break compatibility.'''&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
=Compatibility=&lt;br /&gt;
This release is fully backwards compatible.  It is not, however, forwards compatible.  Plugins compiled against SourceMod 1.1 will not run on any earlier version.  If you encounter any compatibility problems, file a bug.&lt;br /&gt;
&lt;br /&gt;
=Translations=&lt;br /&gt;
SourceMod 1.1.2 ships with a number of community provided translation packs.  The following languages are included:&lt;br /&gt;
*Brazilian Portuguese&lt;br /&gt;
*Chinese Simplified&lt;br /&gt;
*Danish &lt;br /&gt;
*German &lt;br /&gt;
*Hungarian &lt;br /&gt;
*Japanese &lt;br /&gt;
*Latvian &lt;br /&gt;
*Norwegian &lt;br /&gt;
*Polish &lt;br /&gt;
*Romanian &lt;br /&gt;
*Russian &lt;br /&gt;
*Spanish &lt;br /&gt;
*Swedish &lt;br /&gt;
*Turkish &lt;br /&gt;
&lt;br /&gt;
=Changelog=&lt;br /&gt;
*Fixed critical hits being disabled by default ({{bz|3674}})&lt;br /&gt;
*Critical hit hooks are now disabled until used&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.0_Release_Notes&amp;diff=6925</id>
		<title>SourceMod 1.2.0 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.0_Release_Notes&amp;diff=6925"/>
		<updated>2009-02-19T07:08:20Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Changelog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
SourceMod 1.2 is a major update.  It is fully backwards compatible.  Old plugins and extensions will continue to work.&lt;br /&gt;
&lt;br /&gt;
=TODO List=&lt;br /&gt;
*&amp;lt;strike&amp;gt;[http://tinyurl.com/cgxk4w blocking-1.1.1+] HIGHEST PRIORITY&amp;lt;/strike&amp;gt;&lt;br /&gt;
*[http://tinyurl.com/6c6qqb blocking-1.2+] HIGH PRIORITY&lt;br /&gt;
*[http://tinyurl.com/9xo7y7 wanted-1.2+] LOW PRIORITY&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Changelog=&lt;br /&gt;
*Added Left 4 Dead support ({{bz|3414}}).&lt;br /&gt;
*Added Age of Chivalry support ({{bz|3366}}, IceMatrix).&lt;br /&gt;
*Added Obsidian Conflict support ({{bz|2699}}, The DOO).&lt;br /&gt;
*Added sm_name command ({{bz|2150}}).&lt;br /&gt;
*Added extension-level dynamic hooking to bintools ({{bz|2616}}).&lt;br /&gt;
*Added cURL extension, available to other extensions ({{bz|3560}}).&lt;br /&gt;
*Split gamedata files into smaller, inheritable files ({{bz|3546}}).&lt;br /&gt;
*Fixed crash when an event handler fired an event of the same name ({{bz|3468}}).&lt;br /&gt;
*Fixed formatting error with zero precision floats ({{bz|3447}}).&lt;br /&gt;
*Fixed various Insurgency offsets ({{bz|3544}}).&lt;br /&gt;
*Fixed admin menu (topmenu) categories being selectable when not usable ({{bz|3256}}).&lt;br /&gt;
*Fixed sm_sql_addgroup not working ({{bz|3578}}).&lt;br /&gt;
*Fixed blank admins being created from invalid admin file lines ({{bz|3431}}).&lt;br /&gt;
*Fixed memory leak when events were hooked as EventHookMode_Post.&lt;br /&gt;
*Fixed nextmap trigger showing wrong output with end-of-map voting disabled and sm_trigger_show set to zero ({{bz|3597}}, mr.e.unk).&lt;br /&gt;
*Fixed basetriggers not working on Insurgency ({{bz|3497}}).&lt;br /&gt;
*Exposed IServer address to extensions ({{bz|3545}}).&lt;br /&gt;
*Improved database fallback mechanism in clientprefs ({{bz|3564}}).&lt;br /&gt;
*Improved timer handling in funcommands ({{bz|3498}}).&lt;br /&gt;
*Improved compile.sh to take filenames ({{bz|3550}}, jonasfietz).&lt;br /&gt;
*sm_kick now shows the kick reason when available.&lt;br /&gt;
*Split sound functions into a new plugin, sounds.smx.&lt;br /&gt;
*Added parsing of custom gamedata files ({{bz|3644}}).&lt;br /&gt;
*Fixed MsgSentNotify callbacks not firing on intercept hook ({{bz|3631}}).&lt;br /&gt;
*Added client validation API ({{bz|3616}}).&lt;br /&gt;
*Clientprefs now uses the client validation API to avoid using valves broken userid system ({{bz|3616}}).&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.0_Release_Notes&amp;diff=6924</id>
		<title>SourceMod 1.2.0 Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SourceMod_1.2.0_Release_Notes&amp;diff=6924"/>
		<updated>2009-02-19T07:04:59Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Changelog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
SourceMod 1.2 is a major update.  It is fully backwards compatible.  Old plugins and extensions will continue to work.&lt;br /&gt;
&lt;br /&gt;
=TODO List=&lt;br /&gt;
*&amp;lt;strike&amp;gt;[http://tinyurl.com/cgxk4w blocking-1.1.1+] HIGHEST PRIORITY&amp;lt;/strike&amp;gt;&lt;br /&gt;
*[http://tinyurl.com/6c6qqb blocking-1.2+] HIGH PRIORITY&lt;br /&gt;
*[http://tinyurl.com/9xo7y7 wanted-1.2+] LOW PRIORITY&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Changelog=&lt;br /&gt;
*Added Left 4 Dead support ({{bz|3414}}).&lt;br /&gt;
*Added Age of Chivalry support ({{bz|3366}}, IceMatrix).&lt;br /&gt;
*Added Obsidian Conflict support ({{bz|2699}}, The DOO).&lt;br /&gt;
*Added sm_name command ({{bz|2150}}).&lt;br /&gt;
*Added extension-level dynamic hooking to bintools ({{bz|2616}}).&lt;br /&gt;
*Added cURL extension, available to other extensions ({{bz|3560}}).&lt;br /&gt;
*Split gamedata files into smaller, inheritable files ({{bz|3546}}).&lt;br /&gt;
*Fixed crash when an event handler fired an event of the same name ({{bz|3468}}).&lt;br /&gt;
*Fixed formatting error with zero precision floats ({{bz|3447}}).&lt;br /&gt;
*Fixed various Insurgency offsets ({{bz|3544}}).&lt;br /&gt;
*Fixed admin menu (topmenu) categories being selectable when not usable ({{bz|3256}}).&lt;br /&gt;
*Fixed sm_sql_addgroup not working ({{bz|3578}}).&lt;br /&gt;
*Fixed blank admins being created from invalid admin file lines ({{bz|3431}}).&lt;br /&gt;
*Fixed memory leak when events were hooked as EventHookMode_Post.&lt;br /&gt;
*Fixed nextmap trigger showing wrong output with end-of-map voting disabled and sm_trigger_show set to zero ({{bz|3597}}, mr.e.unk).&lt;br /&gt;
*Fixed basetriggers not working on Insurgency ({{bz|3497}}).&lt;br /&gt;
*Exposed IServer address to extensions ({{bz|3545}}).&lt;br /&gt;
*Improved database fallback mechanism in clientprefs ({{bz|3564}}).&lt;br /&gt;
*Improved timer handling in funcommands ({{bz|3498}}).&lt;br /&gt;
*Improved compile.sh to take filenames ({{bz|3550}}, jonasfietz).&lt;br /&gt;
*sm_kick now shows the kick reason when available.&lt;br /&gt;
*Split sound functions into a new plugin, sounds.smx.&lt;br /&gt;
*Added client validation API ({{bz|3616}})&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Zombie_Panic!_Source_Events&amp;diff=6554</id>
		<title>Zombie Panic! Source Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Zombie_Panic!_Source_Events&amp;diff=6554"/>
		<updated>2008-12-02T22:19:25Z</updated>

		<summary type="html">&lt;p&gt;PRED*: Zombie Panic! Source events temp moved to Zombie Panic! Source Events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== player_death ===&lt;br /&gt;
{{qnotice|When a client dies}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_death|string}}&lt;br /&gt;
{{hl2msg|short|userid}}&lt;br /&gt;
{{hl2msg|short|attacker}}&lt;br /&gt;
{{hl2msg|string|weapon}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== zombie_death ===&lt;br /&gt;
{{qnotice|When a zombie dies}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|zombie_death|string}}&lt;br /&gt;
{{hl2msg|byte|count}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== ambient_play ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|ambient_play|string}}&lt;br /&gt;
{{hl2msg|string|sound}}&lt;br /&gt;
{{hl2msg|bool|fade}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== game_round_restart ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|game_round_restart|string}}&lt;br /&gt;
{{hl2msg|none|none}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== gravity_change ===&lt;br /&gt;
{{qnotice|When the gravity changes}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|gravity_change|string}}&lt;br /&gt;
{{hl2msg|float|newgravity}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== achievement_earned ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|achievement_earned|string}}&lt;br /&gt;
{{hl2msg|byte|player}}&lt;br /&gt;
{{hl2msg|short|achievement}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== spec_target_updated ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|spec_target_updated|string}}&lt;br /&gt;
{{hl2msg|none|none}}&lt;br /&gt;
{{end-hl2msg}}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Zombie_Panic!_Source_events_temp&amp;diff=6555</id>
		<title>Zombie Panic! Source events temp</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Zombie_Panic!_Source_events_temp&amp;diff=6555"/>
		<updated>2008-12-02T22:19:25Z</updated>

		<summary type="html">&lt;p&gt;PRED*: Zombie Panic! Source events temp moved to Zombie Panic! Source Events&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Zombie Panic! Source Events]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Zombie_Panic!_Source_Events&amp;diff=6551</id>
		<title>Zombie Panic! Source Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Zombie_Panic!_Source_Events&amp;diff=6551"/>
		<updated>2008-12-02T22:18:29Z</updated>

		<summary type="html">&lt;p&gt;PRED*: Zombie Panic! Source events moved to Zombie Panic! Source events temp&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== player_death ===&lt;br /&gt;
{{qnotice|When a client dies}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_death|string}}&lt;br /&gt;
{{hl2msg|short|userid}}&lt;br /&gt;
{{hl2msg|short|attacker}}&lt;br /&gt;
{{hl2msg|string|weapon}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== zombie_death ===&lt;br /&gt;
{{qnotice|When a zombie dies}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|zombie_death|string}}&lt;br /&gt;
{{hl2msg|byte|count}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== ambient_play ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|ambient_play|string}}&lt;br /&gt;
{{hl2msg|string|sound}}&lt;br /&gt;
{{hl2msg|bool|fade}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== game_round_restart ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|game_round_restart|string}}&lt;br /&gt;
{{hl2msg|none|none}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== gravity_change ===&lt;br /&gt;
{{qnotice|When the gravity changes}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|gravity_change|string}}&lt;br /&gt;
{{hl2msg|float|newgravity}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== achievement_earned ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|achievement_earned|string}}&lt;br /&gt;
{{hl2msg|byte|player}}&lt;br /&gt;
{{hl2msg|short|achievement}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
&lt;br /&gt;
=== spec_target_updated ===&lt;br /&gt;
{{qnotice|None}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|spec_target_updated|string}}&lt;br /&gt;
{{hl2msg|none|none}}&lt;br /&gt;
{{end-hl2msg}}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Gamedata_Updating_(SourceMod)&amp;diff=6341</id>
		<title>Gamedata Updating (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Gamedata_Updating_(SourceMod)&amp;diff=6341"/>
		<updated>2008-10-11T06:48:05Z</updated>

		<summary type="html">&lt;p&gt;PRED*: New page: We now have a gamedata auto-updating feature in SourceMod (for gamedata files only). When your server starts, SourceMod will contact AlliedModders to check for gamedata file updates. Allie...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We now have a gamedata auto-updating feature in SourceMod (for gamedata files only). When your server starts, SourceMod will contact AlliedModders to check for gamedata file updates. AlliedModders will send back new files if they are available.&lt;br /&gt;
&lt;br /&gt;
As part of this effort, if your server crashes on load, gamedata files will become locked, and no &amp;quot;hacky&amp;quot; functionality will be available. The motivation behind this is to give your server time to update safely in case plugins are trying to run functions that are doomed to crash. &lt;br /&gt;
&lt;br /&gt;
=Users=&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
&lt;br /&gt;
core.cfg has four new settings to control the autoupdaters functionality&lt;br /&gt;
&lt;br /&gt;
*DisableAutoUpdate&lt;br /&gt;
**Enables or Disables SourceMod's automatic gamedata updating.&lt;br /&gt;
**The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will block the Auto Updater.&lt;br /&gt;
*ForceRestartAfterUpdate&lt;br /&gt;
**Enables or disables automatic restarting of the server after a successful update.&lt;br /&gt;
**The default value is &amp;quot;no&amp;quot;. A value of &amp;quot;yes&amp;quot; will let the server automatically restart.&lt;br /&gt;
*AutoUpdateServer&lt;br /&gt;
**Sets the server to connect to for auotmatic gamedata updates.&lt;br /&gt;
**Default is &amp;quot;hayate.alliedmods.net&amp;quot;&lt;br /&gt;
*AutoUpdatePort&lt;br /&gt;
**Sets the port to connect to on the AutoUpdateServer server&lt;br /&gt;
**Default is 6500&lt;br /&gt;
&lt;br /&gt;
=Developers=&lt;br /&gt;
&lt;br /&gt;
The daemon is a c++ linux console app that listens for incoming gamedata requests and replies with any changed files.&lt;br /&gt;
The default listening port is 6500.&lt;br /&gt;
SourceCode is available from mercurial under tools/daemon.&lt;br /&gt;
&lt;br /&gt;
==File Layout==&lt;br /&gt;
&lt;br /&gt;
All runtime files used are stored in a subdirectory of the daemon executable called 'md5'. &lt;br /&gt;
The list of recognised files is hard coded into the program.&lt;br /&gt;
Each recognised gamedata file must also have a matching information file with an identical name bar using *.sums for the extension instead of *.txt. This file contains the current md5 sum on the first line and the name of the gamedata file it relates to on the second line.&lt;br /&gt;
All known md5 sums for a file are created as symlinks pointing to the sums file.&lt;br /&gt;
&lt;br /&gt;
==Updating Daemon==&lt;br /&gt;
&lt;br /&gt;
*Overwrite the gamedata file with the new one&lt;br /&gt;
*Edit the sums file to have the new md5 sum - There is a special calculator for this in tools/gamedata_md5&lt;br /&gt;
*Add a symlink from the sum to the sums file&lt;br /&gt;
*There is a script called 'updateGameData.sh' which can do the second part of this for you&lt;br /&gt;
./updateGameData.sh &amp;lt;filename with no extension&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Protocol==&lt;br /&gt;
&lt;br /&gt;
Should I doc this? Can't find the bug report where it was..&lt;br /&gt;
&lt;br /&gt;
==ToDo==&lt;br /&gt;
&lt;br /&gt;
*Convert daemon to a proper system process/daemon and remove it from my user&lt;br /&gt;
*Run another test with the recent gamedata changes&lt;br /&gt;
*Add structs gamedata file to the daemon&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6274</id>
		<title>Map Management Plugins (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6274"/>
		<updated>2008-09-24T08:16:35Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Admin Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This articles refers to the plugins provided with 1.1 snapshots of SourceMod.&lt;br /&gt;
&lt;br /&gt;
=Plugins=&lt;br /&gt;
&lt;br /&gt;
==Mapchooser==&lt;br /&gt;
*Provides a central map voting interface for other plugins to use and optional automated end of map voting.&lt;br /&gt;
*Uses the maplists.cfg “mapchooser” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nominations==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds user/admin nominations into mapvotes.&lt;br /&gt;
*Uses the maplists.cfg “nominations” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Rockthevote==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds rockthevote functionality (forced early voting) to mapchooser.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nextmap==&lt;br /&gt;
*Automatically selects a nextmap at the start of each map&lt;br /&gt;
*Follows the mapcycle specied by the 'mapcyclefile' cvar.&lt;br /&gt;
*Provides map history and mapcycle listings.&lt;br /&gt;
==Randomcycle==&lt;br /&gt;
*Randomly selects a nextmap at the start of each map.&lt;br /&gt;
*Uses the maplists.cfg “randomcycle” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
&lt;br /&gt;
=Cvars=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Cvar&lt;br /&gt;
| Plugin&lt;br /&gt;
| Default Value&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nextmap&lt;br /&gt;
| Core&lt;br /&gt;
| &lt;br /&gt;
| The Next Map that SourceMod will change to.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_endvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if MapChooser should run an end of map vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_start&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 3.0&lt;br /&gt;
| Specifies when to start the vote based on time remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startround&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 2&lt;br /&gt;
| Specifies when to start the vote based on rounds remaining. Use 0 on TF2 to start vote during bonus round time.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startfrags&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies when to start the vote base on frags remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_timestep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 15&lt;br /&gt;
| Specifies how much many more minutes each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_roundstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many more rounds each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_fragstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 10&lt;br /&gt;
| Specifies how many more frags are allowed when map is extended.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_exclude&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_include&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many maps to include in the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_novote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies whether or not MapChooser should pick a map if no votes are received.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_extend&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Number of extensions allowed each map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_dontchange&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if a 'Don't Change' option should be added to early votes (like rockthevote).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_voteduration&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 20&lt;br /&gt;
| Specifies how long the mapvote should be available for.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludeold&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the current map should be excluded from the Nominations list.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludecurrent&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the MapChooser excluded maps should also be excluded from Nominations.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_needed&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0.60&lt;br /&gt;
| Percentage of players needed to rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_minplayers&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| Number of players required before RTV will be enabled.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_initialdelay&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 30.0&lt;br /&gt;
| Time (in seconds) before first RTV can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_interval&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 240.0&lt;br /&gt;
| Time (in seconds) after a failed RTV before another can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_changetime&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| When to change the map after a successful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_postvoteaction&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_randomcycle_exclude&lt;br /&gt;
| Randomcycle&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Admin Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Access&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &lt;br /&gt;
| Forces MapChooser to attempt to run a map vote now.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_setnextmap&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Sets the nextmap and disables the end of map vote for this map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_addmap&lt;br /&gt;
| Nominations&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Forcibly adds the map to the list of nominations (even if the limit had been reached).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_maphistory&lt;br /&gt;
| Nextmap&lt;br /&gt;
| changemap&lt;br /&gt;
| &lt;br /&gt;
| Shows the most recent maps played.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Public Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &amp;lt;map&amp;gt; or none for menu&lt;br /&gt;
| Attempts to nominate a map for the next vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &lt;br /&gt;
| Shows a list of possible maps to nominate.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| listmaps&lt;br /&gt;
| Nextmap&lt;br /&gt;
| &lt;br /&gt;
| Lists the current mapcycle in console.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
&lt;br /&gt;
*The nextmap output from the basetriggers plugin will display 'Pending Vote' if mapchooser is running, has end of map votes enabled and the vote has not yet run this map. Remove the plugin or disable end of map votes to see the actual map displayed.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Documentation&amp;diff=6246</id>
		<title>Category:SourceMod Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Documentation&amp;diff=6246"/>
		<updated>2008-09-21T03:07:05Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Installation'''&lt;br /&gt;
*[[Installing SourceMod]]&lt;br /&gt;
*[[Upgrading SourceMod]]&lt;br /&gt;
&lt;br /&gt;
'''Configuration'''&lt;br /&gt;
*[[SourceMod Configuration|General Overview]]&lt;br /&gt;
*[[Adding Admins (SourceMod)|Adding Admins]]&lt;br /&gt;
*[[Adding Groups (SourceMod)|Adding Groups]]&lt;br /&gt;
*[[Overriding Command Access (SourceMod)|Overriding Command Access]]&lt;br /&gt;
*[[SQL Admins (SourceMod)|SQL Admins]]&lt;br /&gt;
*[[Admin Menu Configuration (SourceMod)|Admin Menu Configuration]]&lt;br /&gt;
*[[Dynamic Admin Menu (SourceMod) | Dynamic Admin Menu Configuration]]&lt;br /&gt;
*[[Reserved Slots (SourceMod)|Reserved Slots]]&lt;br /&gt;
*[[Map Management Plugins (SourceMod) |Map Management Plugins (1.1 Snapshots only)]]&lt;br /&gt;
&lt;br /&gt;
'''Information'''&lt;br /&gt;
*[[Admin Commands (SourceMod)|Admin Commands]]&lt;br /&gt;
*[[Public Commands (SourceMod)|Public Commands]]&lt;br /&gt;
*[[Base Plugins (SourceMod)|Base Plugin List]]&lt;br /&gt;
*[[War Mode (SourceMod)|War Mode]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Documentation&amp;diff=6245</id>
		<title>Category:SourceMod Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Documentation&amp;diff=6245"/>
		<updated>2008-09-21T03:06:42Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Installation'''&lt;br /&gt;
*[[Installing SourceMod]]&lt;br /&gt;
*[[Upgrading SourceMod]]&lt;br /&gt;
&lt;br /&gt;
'''Configuration'''&lt;br /&gt;
*[[SourceMod Configuration|General Overview]]&lt;br /&gt;
*[[Adding Admins (SourceMod)|Adding Admins]]&lt;br /&gt;
*[[Adding Groups (SourceMod)|Adding Groups]]&lt;br /&gt;
*[[Overriding Command Access (SourceMod)|Overriding Command Access]]&lt;br /&gt;
*[[SQL Admins (SourceMod)|SQL Admins]]&lt;br /&gt;
*[[Admin Menu Configuration (SourceMod)|Admin Menu Configuration]]&lt;br /&gt;
*[[Dynamic Admin Menu (SourceMod) | Dynamic Admin Menu Configuration]]&lt;br /&gt;
*[[Reserved Slots (SourceMod)|Reserved Slots]]&lt;br /&gt;
*[[Map Management Plugins (SourceMod) |Map Management Plugins (1.1 Snapshots only)]&lt;br /&gt;
&lt;br /&gt;
'''Information'''&lt;br /&gt;
*[[Admin Commands (SourceMod)|Admin Commands]]&lt;br /&gt;
*[[Public Commands (SourceMod)|Public Commands]]&lt;br /&gt;
*[[Base Plugins (SourceMod)|Base Plugin List]]&lt;br /&gt;
*[[War Mode (SourceMod)|War Mode]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6244</id>
		<title>Map Management Plugins (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6244"/>
		<updated>2008-09-21T03:06:03Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This articles refers to the plugins provided with 1.1 snapshots of SourceMod.&lt;br /&gt;
&lt;br /&gt;
=Plugins=&lt;br /&gt;
&lt;br /&gt;
==Mapchooser==&lt;br /&gt;
*Provides a central map voting interface for other plugins to use and optional automated end of map voting.&lt;br /&gt;
*Uses the maplists.cfg “mapchooser” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nominations==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds user/admin nominations into mapvotes.&lt;br /&gt;
*Uses the maplists.cfg “nominations” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Rockthevote==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds rockthevote functionality (forced early voting) to mapchooser.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nextmap==&lt;br /&gt;
*Automatically selects a nextmap at the start of each map&lt;br /&gt;
*Follows the mapcycle specied by the 'mapcyclefile' cvar.&lt;br /&gt;
*Provides map history and mapcycle listings.&lt;br /&gt;
==Randomcycle==&lt;br /&gt;
*Randomly selects a nextmap at the start of each map.&lt;br /&gt;
*Uses the maplists.cfg “randomcycle” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
&lt;br /&gt;
=Cvars=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Cvar&lt;br /&gt;
| Plugin&lt;br /&gt;
| Default Value&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nextmap&lt;br /&gt;
| Core&lt;br /&gt;
| &lt;br /&gt;
| The Next Map that SourceMod will change to.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_endvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if MapChooser should run an end of map vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_start&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 3.0&lt;br /&gt;
| Specifies when to start the vote based on time remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startround&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 2&lt;br /&gt;
| Specifies when to start the vote based on rounds remaining. Use 0 on TF2 to start vote during bonus round time.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startfrags&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies when to start the vote base on frags remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_timestep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 15&lt;br /&gt;
| Specifies how much many more minutes each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_roundstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many more rounds each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_fragstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 10&lt;br /&gt;
| Specifies how many more frags are allowed when map is extended.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_exclude&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_include&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many maps to include in the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_novote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies whether or not MapChooser should pick a map if no votes are received.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_extend&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Number of extensions allowed each map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_dontchange&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if a 'Don't Change' option should be added to early votes (like rockthevote).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_voteduration&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 20&lt;br /&gt;
| Specifies how long the mapvote should be available for.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludeold&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the current map should be excluded from the Nominations list.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludecurrent&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the MapChooser excluded maps should also be excluded from Nominations.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_needed&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0.60&lt;br /&gt;
| Percentage of players needed to rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_minplayers&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| Number of players required before RTV will be enabled.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_initialdelay&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 30.0&lt;br /&gt;
| Time (in seconds) before first RTV can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_interval&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 240.0&lt;br /&gt;
| Time (in seconds) after a failed RTV before another can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_changetime&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| When to change the map after a successful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_postvoteaction&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_randomcycle_exclude&lt;br /&gt;
| Randomcycle&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Admin Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Access&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &lt;br /&gt;
| Forces MapChooser to attempt to run a map vote now.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_setnextmap&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Sets the nextmap and disables the end of map vote for this map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_addmap&lt;br /&gt;
| Nominations&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Forcibly adds the map to the list of nominations (even if the limit had been reached).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_maphistory&lt;br /&gt;
| Nextmap&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Shows the most recent maps played.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Public Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &amp;lt;map&amp;gt; or none for menu&lt;br /&gt;
| Attempts to nominate a map for the next vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &lt;br /&gt;
| Shows a list of possible maps to nominate.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| listmaps&lt;br /&gt;
| Nextmap&lt;br /&gt;
| &lt;br /&gt;
| Lists the current mapcycle in console.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
&lt;br /&gt;
*The nextmap output from the basetriggers plugin will display 'Pending Vote' if mapchooser is running, has end of map votes enabled and the vote has not yet run this map. Remove the plugin or disable end of map votes to see the actual map displayed.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6243</id>
		<title>Map Management Plugins (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6243"/>
		<updated>2008-09-21T03:05:18Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This articles refers to the plugins provided with 1.1 snapshots of SourceMod.&lt;br /&gt;
&lt;br /&gt;
=Plugins=&lt;br /&gt;
&lt;br /&gt;
==Mapchooser==&lt;br /&gt;
*Provides a central map voting interface for other plugins to use and optional automated end of map voting.&lt;br /&gt;
*Uses the maplists.cfg “mapchooser” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nominations==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds user/admin nominations into mapvotes.&lt;br /&gt;
*Uses the maplists.cfg “nominations” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Rockthevote==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds rockthevote functionality (forced early voting) to mapchooser.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nextmap==&lt;br /&gt;
*Automatically selects a nextmap at the start of each map&lt;br /&gt;
*Follows the mapcycle specied by the 'mapcyclefile' cvar.&lt;br /&gt;
*Provides map history and mapcycle listings.&lt;br /&gt;
==Randomcycle==&lt;br /&gt;
*Randomly selects a nextmap at the start of each map.&lt;br /&gt;
*Uses the maplists.cfg “randomcycle” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
&lt;br /&gt;
=Cvars=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Cvar&lt;br /&gt;
| Plugin&lt;br /&gt;
| Default Value&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nextmap&lt;br /&gt;
| Core&lt;br /&gt;
| &lt;br /&gt;
| The Next Map that SourceMod will change to.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_endvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if MapChooser should run an end of map vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_start&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 3.0&lt;br /&gt;
| Specifies when to start the vote based on time remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startround&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 2&lt;br /&gt;
| Specifies when to start the vote based on rounds remaining. Use 0 on TF2 to start vote during bonus round time.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startfrags&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies when to start the vote base on frags remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_timestep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 15&lt;br /&gt;
| Specifies how much many more minutes each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_roundstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many more rounds each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_fragstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 10&lt;br /&gt;
| Specifies how many more frags are allowed when map is extended.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_exclude&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_include&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many maps to include in the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_novote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies whether or not MapChooser should pick a map if no votes are received.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_extend&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Number of extensions allowed each map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_dontchange&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if a 'Don't Change' option should be added to early votes (like rockthevote).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_voteduration&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 20&lt;br /&gt;
| Specifies how long the mapvote should be available for.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludeold&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the current map should be excluded from the Nominations list.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludecurrent&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the MapChooser excluded maps should also be excluded from Nominations.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_needed&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0.60&lt;br /&gt;
| Percentage of players needed to rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_minplayers&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| Number of players required before RTV will be enabled.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_initialdelay&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 30.0&lt;br /&gt;
| Time (in seconds) before first RTV can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_interval&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 240.0&lt;br /&gt;
| Time (in seconds) after a failed RTV before another can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_changetime&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| When to change the map after a successful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_postvoteaction&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_randomcycle_exclude&lt;br /&gt;
| Randomcycle&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Admin Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Access&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &lt;br /&gt;
| Forces MapChooser to attempt to run a map vote now.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_setnextmap&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Sets the nextmap and disables the end of map vote for this map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_addmap&lt;br /&gt;
| Nominations&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Forcibly adds the map to the list of nominations (even if the limit had been reached).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_maphistory&lt;br /&gt;
| Nextmap&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Shows the most recent maps played.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Public Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &amp;lt;map&amp;gt; or none for menu&lt;br /&gt;
| Attempts to nominate a map for the next vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &lt;br /&gt;
| Shows a list of possible maps to nominate.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| listmaps&lt;br /&gt;
| Nextmap&lt;br /&gt;
| &lt;br /&gt;
| Lists the current mapcycle in console.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
&lt;br /&gt;
*The nextmap output from the basetriggers plugin will display 'Pending Vote' if mapchooser is running, has end of map votes enabled and the vote has not yet run this map. Remove the plugin or disable end of map votes to see the actual map displayed.&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6242</id>
		<title>Map Management Plugins (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Map_Management_Plugins_(SourceMod)&amp;diff=6242"/>
		<updated>2008-09-21T02:59:30Z</updated>

		<summary type="html">&lt;p&gt;PRED*: New page: =Plugins=  ==Mapchooser== *Provides a central map voting interface for other plugins to use and optional automated end of map voting. *Uses the maplists.cfg “mapchooser” section. *Disa...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Plugins=&lt;br /&gt;
&lt;br /&gt;
==Mapchooser==&lt;br /&gt;
*Provides a central map voting interface for other plugins to use and optional automated end of map voting.&lt;br /&gt;
*Uses the maplists.cfg “mapchooser” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nominations==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds user/admin nominations into mapvotes.&lt;br /&gt;
*Uses the maplists.cfg “nominations” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Rockthevote==&lt;br /&gt;
*Requires mapchooser&lt;br /&gt;
*Adds rockthevote functionality (forced early voting) to mapchooser.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
==Nextmap==&lt;br /&gt;
*Automatically selects a nextmap at the start of each map&lt;br /&gt;
*Follows the mapcycle specied by the 'mapcyclefile' cvar.&lt;br /&gt;
*Provides map history and mapcycle listings.&lt;br /&gt;
==Randomcycle==&lt;br /&gt;
*Randomly selects a nextmap at the start of each map.&lt;br /&gt;
*Uses the maplists.cfg “randomcycle” section.&lt;br /&gt;
*Disabled by default&lt;br /&gt;
&lt;br /&gt;
=Cvars=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Cvar&lt;br /&gt;
| Plugin&lt;br /&gt;
| Default Value&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nextmap&lt;br /&gt;
| Core&lt;br /&gt;
| &lt;br /&gt;
| The Next Map that SourceMod will change to.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_endvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if MapChooser should run an end of map vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_start&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 3.0&lt;br /&gt;
| Specifies when to start the vote based on time remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startround&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 2&lt;br /&gt;
| Specifies when to start the vote based on rounds remaining. Use 0 on TF2 to start vote during bonus round time.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_startfrags&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies when to start the vote base on frags remaining.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_timestep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 15&lt;br /&gt;
| Specifies how much many more minutes each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_roundstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many more rounds each extension makes.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_extendmap_fragstep&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 10&lt;br /&gt;
| Specifies how many more frags are allowed when map is extended.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_exclude&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_include&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many maps to include in the vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_novote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies whether or not MapChooser should pick a map if no votes are received.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_extend&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 5&lt;br /&gt;
| Number of extensions allowed each map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_dontchange&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if a 'Don't Change' option should be added to early votes (like rockthevote).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote_voteduration&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| 20&lt;br /&gt;
| Specifies how long the mapvote should be available for.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludeold&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the current map should be excluded from the Nominations list.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_excludecurrent&lt;br /&gt;
| Nominations&lt;br /&gt;
| 1&lt;br /&gt;
| Specifies if the MapChooser excluded maps should also be excluded from Nominations.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_needed&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0.60&lt;br /&gt;
| Percentage of players needed to rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_minplayers&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| Number of players required before RTV will be enabled.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_initialdelay&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 30.0&lt;br /&gt;
| Time (in seconds) before first RTV can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_interval&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 240.0&lt;br /&gt;
| Time (in seconds) after a failed RTV before another can be held.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_changetime&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| When to change the map after a successful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv_postvoteaction&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| 0&lt;br /&gt;
| What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_randomcycle_exclude&lt;br /&gt;
| Randomcycle&lt;br /&gt;
| 5&lt;br /&gt;
| Specifies how many past maps to exclude from the vote.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Admin Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Access&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_mapvote&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &lt;br /&gt;
| Forces MapChooser to attempt to run a map vote now.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_setnextmap&lt;br /&gt;
| Mapchooser&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Sets the nextmap and disables the end of map vote for this map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate_addmap&lt;br /&gt;
| Nominations&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Forcibly adds the map to the list of nominations (even if the limit had been reached).&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_maphistory&lt;br /&gt;
| Nextmap&lt;br /&gt;
| changemap&lt;br /&gt;
| &amp;lt;map&amp;gt;&lt;br /&gt;
| Shows the most recent maps played.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Public Commands=&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &amp;lt;map&amp;gt; or none for menu&lt;br /&gt;
| Attempts to nominate a map for the next vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say nominate&lt;br /&gt;
| Nominations&lt;br /&gt;
| &lt;br /&gt;
| Shows a list of possible maps to nominate.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| say rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_rtv&lt;br /&gt;
| Rockthevote&lt;br /&gt;
| &lt;br /&gt;
| Votes to Rockthevote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| listmaps&lt;br /&gt;
| Nextmap&lt;br /&gt;
| &lt;br /&gt;
| Lists the current mapcycle in console.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Tips and Tricks=&lt;br /&gt;
&lt;br /&gt;
*The nextmap output from the basetriggers plugin will display 'Pending Vote' if mapchooser is running, has end of map votes enabled and the vote has not yet run this map. Remove the plugin or disable end of map votes to see the actual map displayed.&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Contributing_to_SourceMod&amp;diff=6241</id>
		<title>Contributing to SourceMod</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Contributing_to_SourceMod&amp;diff=6241"/>
		<updated>2008-09-21T01:50:32Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rambling about why patches are good&lt;br /&gt;
&lt;br /&gt;
=Source Code Guidelines=&lt;br /&gt;
==Double-Check your commits, and check compilability==&lt;br /&gt;
Don't commit something because it looks right -- while you don't need to explicitly test every addition, it should at least compile. Breaking the build process for anything on either Windows and Linux causes the build server to send everyone an e-mail.&lt;br /&gt;
&lt;br /&gt;
The builds are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;Windows - Microsoft Visual Studio, 8.0 (required)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;Linux, 32bit - GCC, 4.1 (required)&amp;lt;/tt&amp;gt;&lt;br /&gt;
==Submit one patch idea at a time==&lt;br /&gt;
Mercurial marks all changes in a set. For example, if you change 30 files, all 30 files will be marked as one revision set. Thus, it is best if you submit one &amp;quot;patch idea&amp;quot; at a time. If you add feature X to one file, submit it as a single patch before you add feature Y to another file, otherwise you risk committing both changes in one revision.&lt;br /&gt;
==ALWAYS MIND BACKWARDS COMPATIBILITY==&lt;br /&gt;
If you're about to change the functionality of a native, first consider every way a script could be using it. For example, pev() on a string will return the string length. Is it likely any script is actually using this? No. Can we remove this functionality? No.&lt;br /&gt;
&lt;br /&gt;
It may suck, but the instant we break anything, someone will complain that the newer version is worse. All old plugins should work, especially without recompiling. This is called ABI compatibility, and it means that all old SourceMod plugin binaries should work with modification across updates.&lt;br /&gt;
&lt;br /&gt;
Another example: if you are about to add parameters onto a native, you should make the new parameters have default arguments. Furthermore, you must make sure that old binary plugins passing in the old number of parameters will not break (easy, since Pawn tells you how many parameters were passed).&lt;br /&gt;
&lt;br /&gt;
Remember: If it breaks something, don't do it, or else you'll find any number of people hounding you!&lt;br /&gt;
==Coding Style==&lt;br /&gt;
For SourceMod, we do have loose official coding style. You should use this style within reasonable limits. The most important rules are the ones about brace blocks and camel case, every thing else can be tweaked to your own style.&lt;br /&gt;
&lt;br /&gt;
Always put braces on a new line, except for else cases&lt;br /&gt;
The following are bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben() {&lt;br /&gt;
	if (gaben) {&lt;br /&gt;
	  hello&lt;br /&gt;
	} &lt;br /&gt;
	else &lt;br /&gt;
	{&lt;br /&gt;
	  ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Always put the brace on a new line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben()&lt;br /&gt;
{&lt;br /&gt;
	if (gaben)&lt;br /&gt;
	{&lt;br /&gt;
		hello&lt;br /&gt;
	} else {&lt;br /&gt;
		ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben()&lt;br /&gt;
{&lt;br /&gt;
	if (gaben)&lt;br /&gt;
	{&lt;br /&gt;
		hello&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(These are both allowed conventions)&lt;br /&gt;
&lt;br /&gt;
Always use braces for block statements (no one liners!)&lt;br /&gt;
The following are bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (gaben) hacks&lt;br /&gt;
if (gaben)&lt;br /&gt;
	hacks&lt;br /&gt;
if (gaben) {&lt;br /&gt;
	hacks&lt;br /&gt;
}&lt;br /&gt;
if (gaben) { hacks }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Proper:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (gaben)&lt;br /&gt;
{&lt;br /&gt;
	hacks&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This adds more spaces but improves readability. It also makes it less annoying to add more into the block later.&lt;br /&gt;
&lt;br /&gt;
==Use Camel Case for API==&lt;br /&gt;
No questions asked, use CamelCase! SourceMod does everything in a &amp;quot;Verb, Noun&amp;quot; or &amp;quot;Subject, Verb, Noun&amp;quot; form. I.e. SQL_Connect, or GetClientName. Some natives have the verb implied. For example, &amp;quot;StrEqual&amp;quot; is implicitly &amp;quot;IsStrEqual.&amp;quot; This practice is kind of cheap and you should try to deprecate usage of it.&lt;br /&gt;
&lt;br /&gt;
==Space/parenthesize operators in math functions==&lt;br /&gt;
The following are not very readable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int mynum = (a/b+c)*d-e;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int mynum = (((a / b) + c) * d) - e;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Never add extra spaces to parenthetical listings==&lt;br /&gt;
For example, this is silly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Function ( a, b, c, d )&lt;br /&gt;
{&lt;br /&gt;
	Function ( a, b, c, d );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should, of course, be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Function(a, b, c, d)&lt;br /&gt;
{&lt;br /&gt;
	Function(a, b, c, d)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The expection to this rule is with complicated inner expressions. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function(Calc(Reduce(((*iter)-&amp;gt;GetFunc())())))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Is impossible to read, and might look better as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function(Calc(Reduce(&lt;br /&gt;
		((*iter)-&amp;gt;GetFunc()) ()&lt;br /&gt;
		)));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Don't &amp;quot;crunch&amp;quot; control statements==&lt;br /&gt;
Bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if(a)&lt;br /&gt;
for(;;)&lt;br /&gt;
while(gaben)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Good:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (a)&lt;br /&gt;
for (;;)&lt;br /&gt;
while (gaben)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Don't unnecessarily expand iterator expressions==&lt;br /&gt;
Example of unnecessary spacing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ( (fp=fopen(&amp;quot;file&amp;quot;, &amp;quot;rt&amp;quot;)) == NULL )&lt;br /&gt;
if ( (a + b) )&lt;br /&gt;
for (int i = 1; i &amp;lt;= 1; i++)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Read better as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ((fp=fopen(&amp;quot;file&amp;quot;, &amp;quot;rt&amp;quot;) == NULL)&lt;br /&gt;
if ((a+b) != 0)&lt;br /&gt;
for (int i=1; i&amp;lt;=1; i++)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Make conditional statements clear==&lt;br /&gt;
This is unclear, and may have random bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (a &amp;amp; *b = c + d == t * d+++k || b -= 5)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Better:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ( ((a &amp;amp; *b) = (c+d)) == (t * (d + ++k))&lt;br /&gt;
	|| (b -= 5) != 0 )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Use #if 0 to disable code, not /* */==&lt;br /&gt;
Block comments are annoying, and tend to be messy when they're nested. Use #if 0 / #endif to disable code.&lt;br /&gt;
&lt;br /&gt;
==Do not use Hungarian notation==&lt;br /&gt;
Use g_, m_, b, and f where appropriate. If you find yourself using variable names like m_pszString, you probably need to stop. &lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Obtaining the Source Code==&lt;br /&gt;
Download the latest copy of the SourceMod source code using [http://wiki.alliedmods.net/Mercurial_Tutorial Mercurial]. If you are going to be submitting changes for c++ parts of SourceMod make sure you can [http://wiki.alliedmods.net/Compiling_SourceMod compile SourceMod].&lt;br /&gt;
==Making and submitting a patch==&lt;br /&gt;
Use the Mercurial command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg diff file1.txt file2.txt &amp;gt; outputfile.patch&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To generate a patch file for your changes. This can then be attached to the appropriate [https://bugs.alliedmods.net/ Bugzilla] bug report using the Add an attachment link (don't forget to tick the patch box).&lt;br /&gt;
==Why hasn't my patch been committed?==&lt;br /&gt;
See Bailopan's blog regarding patch submitting guidelines: [http://www.bailopan.net/blog/?p=9 Blag]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Contributing_to_SourceMod&amp;diff=6240</id>
		<title>Contributing to SourceMod</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Contributing_to_SourceMod&amp;diff=6240"/>
		<updated>2008-09-21T01:48:32Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rambling about why patches are good&lt;br /&gt;
&lt;br /&gt;
=Source Code Guidelines=&lt;br /&gt;
==Double-Check your commits, and check compilability==&lt;br /&gt;
Don't commit something because it looks right -- while you don't need to explicitly test every addition, it should at least compile. Breaking the build process for anything on either Windows and Linux causes the build server to send everyone an e-mail.&lt;br /&gt;
&lt;br /&gt;
The builds are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;Windows - Microsoft Visual Studio, 8.0 (required)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;Linux, 32bit - GCC, 4.1 (required)&amp;lt;/tt&amp;gt;&lt;br /&gt;
==Submit one patch idea at a time==&lt;br /&gt;
Mercurial marks all changes in a set. For example, if you change 30 files, all 30 files will be marked as one revision set. Thus, it is best if you submit one &amp;quot;patch idea&amp;quot; at a time. If you add feature X to one file, submit it as a single patch before you add feature Y to another file, otherwise you risk committing both changes in one revision.&lt;br /&gt;
==ALWAYS MIND BACKWARDS COMPATIBILITY==&lt;br /&gt;
If you're about to change the functionality of a native, first consider every way a script could be using it. For example, pev() on a string will return the string length. Is it likely any script is actually using this? No. Can we remove this functionality? No.&lt;br /&gt;
&lt;br /&gt;
It may suck, but the instant we break anything, someone will complain that the newer version is worse. All old plugins should work, especially without recompiling. This is called ABI compatibility, and it means that all old SourceMod plugin binaries should work with modification across updates.&lt;br /&gt;
&lt;br /&gt;
Another example: if you are about to add parameters onto a native, you should make the new parameters have default arguments. Furthermore, you must make sure that old binary plugins passing in the old number of parameters will not break (easy, since Pawn tells you how many parameters were passed).&lt;br /&gt;
&lt;br /&gt;
Remember: If it breaks something, don't do it, or else you'll find any number of people hounding you!&lt;br /&gt;
==Coding Style==&lt;br /&gt;
For SourceMod, we do have loose official coding style. You should use this style within reasonable limits. The most important rules are the ones about brace blocks and camel case, every thing else can be tweaked to your own style.&lt;br /&gt;
&lt;br /&gt;
Always put braces on a new line, except for else cases&lt;br /&gt;
The following are bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben() {&lt;br /&gt;
	if (gaben) {&lt;br /&gt;
	  hello&lt;br /&gt;
	} &lt;br /&gt;
	else &lt;br /&gt;
	{&lt;br /&gt;
	  ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Always put the brace on a new line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben()&lt;br /&gt;
{&lt;br /&gt;
	if (gaben)&lt;br /&gt;
	{&lt;br /&gt;
		hello&lt;br /&gt;
	} else {&lt;br /&gt;
		ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben()&lt;br /&gt;
{&lt;br /&gt;
	if (gaben)&lt;br /&gt;
	{&lt;br /&gt;
		hello&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(These are both allowed conventions)&lt;br /&gt;
&lt;br /&gt;
Always use braces for block statements (no one liners!)&lt;br /&gt;
The following are bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (gaben) hacks&lt;br /&gt;
if (gaben)&lt;br /&gt;
	hacks&lt;br /&gt;
if (gaben) {&lt;br /&gt;
	hacks&lt;br /&gt;
}&lt;br /&gt;
if (gaben) { hacks }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Proper:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (gaben)&lt;br /&gt;
{&lt;br /&gt;
	hacks&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This adds more spaces but improves readability. It also makes it less annoying to add more into the block later.&lt;br /&gt;
&lt;br /&gt;
==Use Camel Case for API==&lt;br /&gt;
No questions asked, use CamelCase! SourceMod does everything in a &amp;quot;Verb, Noun&amp;quot; or &amp;quot;Subject, Verb, Noun&amp;quot; form. I.e. SQL_Connect, or GetClientName. Some natives have the verb implied. For example, &amp;quot;StrEqual&amp;quot; is implicitly &amp;quot;IsStrEqual.&amp;quot; This practice is kind of cheap and you should try to deprecate usage of it.&lt;br /&gt;
&lt;br /&gt;
Space/parenthesize operators in math functions:&lt;br /&gt;
The following are not very readable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int mynum = (a/b+c)*d-e;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int mynum = (((a / b) + c) * d) - e;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Never add extra spaces to parenthetical listings&lt;br /&gt;
For example, this is silly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Function ( a, b, c, d )&lt;br /&gt;
{&lt;br /&gt;
	Function ( a, b, c, d );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should, of course, be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Function(a, b, c, d)&lt;br /&gt;
{&lt;br /&gt;
	Function(a, b, c, d)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The expection to this rule is with complicated inner expressions. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function(Calc(Reduce(((*iter)-&amp;gt;GetFunc())())))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Is impossible to read, and might look better as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function(Calc(Reduce(&lt;br /&gt;
		((*iter)-&amp;gt;GetFunc()) ()&lt;br /&gt;
		)));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Don't &amp;quot;crunch&amp;quot; control statements&lt;br /&gt;
Bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if(a)&lt;br /&gt;
for(;;)&lt;br /&gt;
while(gaben)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Good:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (a)&lt;br /&gt;
for (;;)&lt;br /&gt;
while (gaben)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Don't unnecessarily expand iterator expressions&lt;br /&gt;
Example of unnecessary spacing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ( (fp=fopen(&amp;quot;file&amp;quot;, &amp;quot;rt&amp;quot;)) == NULL )&lt;br /&gt;
if ( (a + b) )&lt;br /&gt;
for (int i = 1; i &amp;lt;= 1; i++)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Read better as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ((fp=fopen(&amp;quot;file&amp;quot;, &amp;quot;rt&amp;quot;) == NULL)&lt;br /&gt;
if ((a+b) != 0)&lt;br /&gt;
for (int i=1; i&amp;lt;=1; i++)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Make conditional statements clear&lt;br /&gt;
This is unclear, and may have random bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (a &amp;amp; *b = c + d == t * d+++k || b -= 5)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Better:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ( ((a &amp;amp; *b) = (c+d)) == (t * (d + ++k))&lt;br /&gt;
	|| (b -= 5) != 0 )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Use #if 0 to disable code, not /* */&lt;br /&gt;
Block comments are annoying, and tend to be messy when they're nested. Use #if 0 / #endif to disable code.&lt;br /&gt;
&lt;br /&gt;
==Do not use Hungarian notation==&lt;br /&gt;
Use g_, m_, b, and f where appropriate. If you find yourself using variable names like m_pszString, you probably need to stop. &lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Obtaining the Source Code==&lt;br /&gt;
Download the latest copy of the SourceMod source code using [http://wiki.alliedmods.net/Mercurial_Tutorial Mercurial]. If you are going to be submitting changes for c++ parts of SourceMod make sure you can [http://wiki.alliedmods.net/Compiling_SourceMod compile SourceMod].&lt;br /&gt;
==Making and submitting a patch==&lt;br /&gt;
Use the Mercurial command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg diff file1.txt file2.txt &amp;gt; outputfile.patch&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To generate a patch file for your changes. This can then be attached to the appropriate [https://bugs.alliedmods.net/ Bugzilla] bug report using the Add an attachment link (don't forget to tick the patch box).&lt;br /&gt;
==Why hasn't my patch been committed?==&lt;br /&gt;
See Bailopan's blog regarding patch submitting guidelines: [http://www.bailopan.net/blog/?p=9 Blag]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Contributing_to_SourceMod&amp;diff=6239</id>
		<title>Contributing to SourceMod</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Contributing_to_SourceMod&amp;diff=6239"/>
		<updated>2008-09-21T01:45:55Z</updated>

		<summary type="html">&lt;p&gt;PRED*: New page: Rambling about why patches are good  =Source Code Guidelines= ==Double-Check your commits, and check compilability== Don't commit something because it looks right -- while you don't need t...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rambling about why patches are good&lt;br /&gt;
&lt;br /&gt;
=Source Code Guidelines=&lt;br /&gt;
==Double-Check your commits, and check compilability==&lt;br /&gt;
Don't commit something because it looks right -- while you don't need to explicitly test every addition, it should at least compile. Breaking the build process for anything on either Windows and Linux causes the build server to send everyone an e-mail.&lt;br /&gt;
&lt;br /&gt;
The builds are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;Windows - Microsoft Visual Studio, 8.0 (required)&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;Linux, 32bit - GCC, 4.1 (required)&amp;lt;/tt&amp;gt;&lt;br /&gt;
==Submit one patch idea at a time==&lt;br /&gt;
Mercurial marks all changes in a set. For example, if you change 30 files, all 30 files will be marked as one revision set. Thus, it is best if you submit one &amp;quot;patch idea&amp;quot; at a time. If you add feature X to one file, submit it as a single patch before you add feature Y to another file, otherwise you risk committing both changes in one revision.&lt;br /&gt;
==ALWAYS MIND BACKWARDS COMPATIBILITY==&lt;br /&gt;
If you're about to change the functionality of a native, first consider every way a script could be using it. For example, pev() on a string will return the string length. Is it likely any script is actually using this? No. Can we remove this functionality? No.&lt;br /&gt;
&lt;br /&gt;
It may suck, but the instant we break anything, someone will complain that the newer version is worse. All old plugins should work, especially without recompiling. This is called ABI compatibility, and it means that all old SourceMod plugin binaries should work with modification across updates.&lt;br /&gt;
&lt;br /&gt;
Another example: if you are about to add parameters onto a native, you should make the new parameters have default arguments. Furthermore, you must make sure that old binary plugins passing in the old number of parameters will not break (easy, since Pawn tells you how many parameters were passed).&lt;br /&gt;
&lt;br /&gt;
Remember: If it breaks something, don't do it, or else you'll find any number of people hounding you!&lt;br /&gt;
==Coding Style==&lt;br /&gt;
For SourceMod, we do have loose official coding style. You should use this style within reasonable limits. The most important rules are the ones about brace blocks and camel case, every thing else can be tweaked to your own style.&lt;br /&gt;
&lt;br /&gt;
Always put braces on a new line, except for else cases&lt;br /&gt;
The following are bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben() {&lt;br /&gt;
	if (gaben) {&lt;br /&gt;
	  hello&lt;br /&gt;
	} &lt;br /&gt;
	else &lt;br /&gt;
	{&lt;br /&gt;
	  ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Always put the brace on a new line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben()&lt;br /&gt;
{&lt;br /&gt;
	if (gaben)&lt;br /&gt;
	{&lt;br /&gt;
		hello&lt;br /&gt;
	} else {&lt;br /&gt;
		ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Gaben()&lt;br /&gt;
{&lt;br /&gt;
	if (gaben)&lt;br /&gt;
	{&lt;br /&gt;
		hello&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		ghello&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(These are both allowed conventions)&lt;br /&gt;
&lt;br /&gt;
Always use braces for block statements (no one liners!)&lt;br /&gt;
The following are bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (gaben) hacks&lt;br /&gt;
if (gaben)&lt;br /&gt;
	hacks&lt;br /&gt;
if (gaben) {&lt;br /&gt;
	hacks&lt;br /&gt;
}&lt;br /&gt;
if (gaben) { hacks }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Proper:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (gaben)&lt;br /&gt;
{&lt;br /&gt;
	hacks&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
This adds more spaces but improves readability. It also makes it less annoying to add more into the block later.&lt;br /&gt;
&lt;br /&gt;
Use Camel Case for API&lt;br /&gt;
No questions asked, use CamelCase! SourceMod does everything in a &amp;quot;Verb, Noun&amp;quot; or &amp;quot;Subject, Verb, Noun&amp;quot; form. I.e. SQL_Connect, or GetClientName. Some natives have the verb implied. For example, &amp;quot;StrEqual&amp;quot; is implicitly &amp;quot;IsStrEqual.&amp;quot; This practice is kind of cheap and you should try to deprecate usage of it.&lt;br /&gt;
&lt;br /&gt;
Space/parenthesize operators in math functions:&lt;br /&gt;
The following are not very readable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int mynum = (a/b+c)*d-e;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int mynum = (((a / b) + c) * d) - e;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Never add extra spaces to parenthetical listings&lt;br /&gt;
For example, this is silly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Function ( a, b, c, d )&lt;br /&gt;
{&lt;br /&gt;
	Function ( a, b, c, d );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It should, of course, be:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Function(a, b, c, d)&lt;br /&gt;
{&lt;br /&gt;
	Function(a, b, c, d)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The expection to this rule is with complicated inner expressions. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function(Calc(Reduce(((*iter)-&amp;gt;GetFunc())())))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Is impossible to read, and might look better as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Function(Calc(Reduce(&lt;br /&gt;
		((*iter)-&amp;gt;GetFunc()) ()&lt;br /&gt;
		)));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Don't &amp;quot;crunch&amp;quot; control statements&lt;br /&gt;
Bad:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if(a)&lt;br /&gt;
for(;;)&lt;br /&gt;
while(gaben)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Good:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (a)&lt;br /&gt;
for (;;)&lt;br /&gt;
while (gaben)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Don't unnecessarily expand iterator expressions&lt;br /&gt;
Example of unnecessary spacing:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ( (fp=fopen(&amp;quot;file&amp;quot;, &amp;quot;rt&amp;quot;)) == NULL )&lt;br /&gt;
if ( (a + b) )&lt;br /&gt;
for (int i = 1; i &amp;lt;= 1; i++)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Read better as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ((fp=fopen(&amp;quot;file&amp;quot;, &amp;quot;rt&amp;quot;) == NULL)&lt;br /&gt;
if ((a+b) != 0)&lt;br /&gt;
for (int i=1; i&amp;lt;=1; i++)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Make conditional statements clear&lt;br /&gt;
This is unclear, and may have random bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (a &amp;amp; *b = c + d == t * d+++k || b -= 5)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Better:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ( ((a &amp;amp; *b) = (c+d)) == (t * (d + ++k))&lt;br /&gt;
	|| (b -= 5) != 0 )&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Use #if 0 to disable code, not /* */&lt;br /&gt;
Block comments are annoying, and tend to be messy when they're nested. Use #if 0 / #endif to disable code.&lt;br /&gt;
&lt;br /&gt;
Do not use Hungarian notation.&lt;br /&gt;
Use g_, m_, b, and f where appropriate. If you find yourself using variable names like m_pszString, you probably need to stop. &lt;br /&gt;
&lt;br /&gt;
=Steps=&lt;br /&gt;
&lt;br /&gt;
==Obtaining the Source Code==&lt;br /&gt;
Download the latest copy of the SourceMod source code using [http://wiki.alliedmods.net/Mercurial_Tutorial Mercurial]. If you are going to be submitting changes for c++ parts of SourceMod make sure you can [http://wiki.alliedmods.net/Compiling_SourceMod compile SourceMod].&lt;br /&gt;
==Making and submitting a patch==&lt;br /&gt;
Use the Mercurial command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;hg diff file1.txt file2.txt &amp;gt; outputfile.patch&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To generate a patch file for your changes. This can then be attached to the appropriate [https://bugs.alliedmods.net/ Bugzilla] bug report using the Add an attachment link (don't forget to tick the patch box).&lt;br /&gt;
==Why hasn't my patch been committed?==&lt;br /&gt;
See Bailopan's blog regarding patch submitting guidelines: [http://www.bailopan.net/blog/?p=9 Blag]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6055</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6055"/>
		<updated>2008-06-29T06:16:49Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || byte || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || byte || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || short || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || short || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || short || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || short || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || byte || Number of MD5 Checksums&lt;br /&gt;
|-&lt;br /&gt;
| Checksum || byte * 16 || Bytes of the MD5 Checksum - Repeat 'Count' Times&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6054</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6054"/>
		<updated>2008-06-29T06:13:28Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; background=&amp;quot;#f0f0f0&amp;quot;&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || byte || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || byte || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || short || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || short || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || short || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || short || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || byte || Number of MD5 Checksums&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6053</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6053"/>
		<updated>2008-06-29T06:09:49Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || byte || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || byte || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || short || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || short || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || short || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || short || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || byte || Number of MD5 Checksums&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6052</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6052"/>
		<updated>2008-06-29T06:09:22Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || byte || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || byte || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || short || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || short || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || short || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || short || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || byte || Number of MD5 Checksums&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6051</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6051"/>
		<updated>2008-06-29T06:09:08Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin: 1em auto 1em auto&amp;quot;&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || byte || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || byte || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || short || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || short || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || short || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || short || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || byte || Number of MD5 Checksums&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6050</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6050"/>
		<updated>2008-06-29T06:06:15Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Request format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || byte || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || byte || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || short || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || short || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || short || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || short || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || byte || Number of MD5 Checksums&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6049</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6049"/>
		<updated>2008-06-29T06:04:23Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Request format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || [[byte]] || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || [[byte]] || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || [[short]] || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || [[short]] || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || [[short]] || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || [[short]] || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || [[byte]] || Number of MD5 Checksums&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6048</id>
		<title>GameData Query</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=GameData_Query&amp;diff=6048"/>
		<updated>2008-06-29T06:04:05Z</updated>

		<summary type="html">&lt;p&gt;PRED*: New page: ====Request format==== GameData updates can be requested by sending the following byte values in a TCP packet to the server.  {| ! Data || Type || Comment |- | Header || byte || Should...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;====Request format====&lt;br /&gt;
GameData updates can be requested by sending the following byte values in a TCP packet to the server.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
! Data || Type || Comment&lt;br /&gt;
|-&lt;br /&gt;
| Header || [[byte]] || Should be equal to 'A'&lt;br /&gt;
|-&lt;br /&gt;
| Type || [[byte]] || Should be equal to 'G'&lt;br /&gt;
|-&lt;br /&gt;
| Version || [[short]] || Current SourceMod version number (1)&lt;br /&gt;
|-&lt;br /&gt;
| Major || [[short]] || Current Major release version&lt;br /&gt;
|-&lt;br /&gt;
| Minor || [[short]] || Current Minor release version&lt;br /&gt;
|-&lt;br /&gt;
| Build || [[short]] || Current build number&lt;br /&gt;
|-&lt;br /&gt;
| Count || [[byte]] || Number of MD5 Checksums&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AlliedModders_Planning&amp;diff=6031</id>
		<title>AlliedModders Planning</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AlliedModders_Planning&amp;diff=6031"/>
		<updated>2008-06-22T01:28:13Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
&lt;br /&gt;
This is sort of a major push for AlliedModders to be a bit more streamlined.  We're encountering growth problems, especially as our personnel has dwindled quite low recently.  This document discusses some changes I'm proposing.  Anyone is free to discuss this on the forums or add comments into this document.&lt;br /&gt;
&lt;br /&gt;
Everything related to source code management in this document refers to Metamod:Source and SourceMod.  AMX Mod X is considered &amp;quot;mature&amp;quot; and is no longer maintained except for critical or high priority bugs.  If and when we do a move past Subversion, it is unlikely AMX Mod X will follow.  &lt;br /&gt;
&lt;br /&gt;
=The Problems=&lt;br /&gt;
==Short Term==&lt;br /&gt;
*We're finding it hard to manage multiple projects in a unified way.&lt;br /&gt;
*There are site disparities, Metamod:Source and SourceMod and AMX Mod X each have entirely different backends.&lt;br /&gt;
*Similarly, each site has a different version of the mirror system script.  &lt;br /&gt;
*Subversion doesn't cut it -- Mercurial might handle things better.  Subversion basically has no branching or tagging support, and it has no real branch merging capabilities.  This is a real problem for SourceMod which has pretty active development.&lt;br /&gt;
*The packaging system is disorganized and fundamentally broken.  It's inconsistent, inaccurate, and takes up 1.7GB of wasted space and growing.&lt;br /&gt;
&lt;br /&gt;
==Long Term==&lt;br /&gt;
*AlliedModders has plans past SourceMod.  We need to be able to grow our project base without adding exponential amounts of work.&lt;br /&gt;
*We still don't have a main site&lt;br /&gt;
*MediaWiki still has authentication problems since its handling of usernames is broken&lt;br /&gt;
*Flyspray is buggy, definitely non-production, and doesn't get maintained frequently&lt;br /&gt;
*It's impossible to maintain the AMXX/SM/MM:S sites right now&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Mercurial=&lt;br /&gt;
Subversion doesn't let us branch nicely or create user-specific branches without forever mucking up the central repository.  It's difficult to do merges.  Mercurial seems to solve these problems, but our build process will be majorly affected.&lt;br /&gt;
&lt;br /&gt;
An excellent tutorial for how Mercurial works is [http://www.selenic.com/mercurial/wiki/index.cgi/UnderstandingMercurial here].&lt;br /&gt;
&lt;br /&gt;
==The Revision Problem==&lt;br /&gt;
Mercurial tracks revisions with 160-bit IDs (40 digits of hex), called &amp;quot;changeset IDs.&amp;quot;  Mercurial has aesthetic revision numbers only; they're not guarantees like they are in Subversion.  Revision numbers are properties of a repository clone, not the overall repository.  This means that if two people make changes locally, those revisions will be different, and will change again once pushed upstream.&lt;br /&gt;
&lt;br /&gt;
This problem is somewhat mitigated by the fact that the central repository will have reliable revision numbers, but that's still not good enough since branching will generate multiple revisions.  Branching also makes the revision numbers awkward since users assign meaning to them where none exists (for example, &amp;quot;1.0.1.1234 versus 1.1.0.1231 doesn't make sense because 1.1 is later than 1.0.1&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Eliminating Revision Numbers=&lt;br /&gt;
Even in our current Subversion system, revision numbers have become meaningless because they can't be easily interpreted by users.  They're simply confusing, and regardless of whether we move to Mercurial, eliminating these numbers is a good idea.&lt;br /&gt;
&lt;br /&gt;
==Problems==&lt;br /&gt;
There are two problems.  The first is that we need to display '''something'''.  The automated builds system means we need some way of identifying a specific build, both programmatically, and visually (for users).  &lt;br /&gt;
&lt;br /&gt;
The programmatic part is important for our &amp;quot;fetchdlls&amp;quot; utility which is used for debugging.  This utility reads an mdmp file and downloads matching binaries from our package repository -- this makes debugging with our symbol server really easy.  There are two invariants that fetchdlls needs to work:&lt;br /&gt;
*A way to match a [http://msdn.microsoft.com/en-us/library/ms680392(VS.85).aspx MINIDUMP_MODULE] structure to a downloadable path, and;&lt;br /&gt;
*A download mechanism&lt;br /&gt;
&lt;br /&gt;
Currently, fetchdlls uses the revision number in the product version slot, but eliminating the revision number will prevent that from working.  We could shim it for Subversion by keeping the local number in version.rc, but this seems bad as it would prevent us from eliminating the messy version bumping logic, and the version number would still technically be visible.&lt;br /&gt;
&lt;br /&gt;
The only solution I can think of to this problem, a solution that is scalable, is to use the binary checksums instead of the version ID.  This would require some sort of website that would keep track of the checksum -&amp;gt; changeset mapping, in order to get a package back.  This would be part of a new automation system that would quickly follow the versioning changes.  I'd probably rewrite fetchdlls in C#.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Automation=&lt;br /&gt;
Right now we use subversion for all of the packages.  This is getting to be troublesome.  It makes fetchdlls extraordinarily complicated when it really does not have to be, and the hourly builds just accumulate with no way of being deleted.  The package repository is 1.7GB and growing.&lt;br /&gt;
&lt;br /&gt;
It would be a lot simpler if we could just throw a single package on the webserver and forget about it.  We could even keep a rotation of, say, 30 days' worth of packages in a rotation.  This would let us remove cruft and keep enough binaries around for debugging.  The problem is that people rely on the repositories to perform diffs.&lt;br /&gt;
&lt;br /&gt;
I don't have any good ideas on solving that problem, because there's no way to selectively rotate things out of a versioning system.  The only solution I can think of is providing people with, say, a perl or bash script that does the job for them.  This could go through two routes: using local repositories, or simply doing a HTTP fetch from the web server and then doing a diff.&lt;br /&gt;
&lt;br /&gt;
Nonetheless, it feels like this is the right way to go.  It would also give us the opportunity to really clean up how packaging is done.  This could be made project inspecific, and we could have a single set of scripts doing all the upstream packaging and symbol stuff.  The sketchy perl scripts are just for doing per-project releases and that's fine (for now), but the disparity between MM:S/AMXX/SM automation is ridiculous.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=License Changes=&lt;br /&gt;
I don't want to keep hacking up our private-&amp;gt;public sync script.  DS has faithfully maintained it until now, but I believe he will be as glad as I to do away with it.  A move to Mercurial would have either of the following benefits:&lt;br /&gt;
*We could keep the JIT closed source and shove it in a private repository, OR&lt;br /&gt;
*Just open source the thing finally, it's not very special, and have everything be together.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Phases=&lt;br /&gt;
&lt;br /&gt;
==Phase 0==&lt;br /&gt;
'''DONE:''' We've eliminated build numbers and are back on the x.y.z system.  SVN builds have &amp;quot;-svn&amp;quot; on them.  We'll branch and remove those for releases.  version.rc still has the fourth number so we can use fetchdlls and debug easily.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;strike&amp;gt;Apply new versioning scheme, whatever it may be.&amp;lt;/strike&amp;gt; &lt;br /&gt;
&lt;br /&gt;
==Phase 1==&lt;br /&gt;
'''DONE:''' We're now on a new box.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strike&amp;gt;Move from Sente to Iroh so we can get away from ThePlanet and clean up/optimize some infrastructure.  This is documented at [[Iroh_Migration|Iroh Migration]].&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Phase 2==&lt;br /&gt;
Expected date: Mid-July&lt;br /&gt;
&lt;br /&gt;
*Redo automation so the &amp;quot;packaging&amp;quot; versus &amp;quot;sending upstream&amp;quot; processes are fundamentally separate.&lt;br /&gt;
*Redo &amp;quot;sending upstream&amp;quot; process so it simply sends over FTP.&lt;br /&gt;
*Use an SSH tunnel to notify of new packages, so we don't have to do something idiotic like mirrors.pl for the mirror system, or using post-commit scripts on the Packages repository.&lt;br /&gt;
*Redo the package system so only 30 days worth of builds are available.&lt;br /&gt;
*Write a script to help users diff between packages?&lt;br /&gt;
*Remove the Packages repository entirely (transitioning AMX Mod X to this will be trivial).&lt;br /&gt;
&lt;br /&gt;
==Phase 2b==&lt;br /&gt;
&lt;br /&gt;
Expected date: Tomorrow?&lt;br /&gt;
&lt;br /&gt;
*Update symbol server to include binaries and maybe even sourcecode? Removes the need for fetchdll's.&lt;br /&gt;
* [http://entland.homelinux.com/blog/2006/07/06/setting-up-a-symbol-server/ Is this enough info?]&lt;br /&gt;
&lt;br /&gt;
==Phase 3==&lt;br /&gt;
Expected date: End of July&lt;br /&gt;
&lt;br /&gt;
*Transition C# build tool to vs2k8 project that targets .NET Framework 2.0.&lt;br /&gt;
*Transition SourceMod and Metamod:Source to vs2k8.&lt;br /&gt;
&lt;br /&gt;
==Phase 4==&lt;br /&gt;
Expected date: End of July&lt;br /&gt;
&lt;br /&gt;
*Move the pdbstore to be centralized client-side.  This can be accomplished by making a more advanced symstore wrapper that will remove anything older than 30 days, and then (in a similar SSH tunnel method as above), rsync all changes upstream to the webserver.  The exact mechanism is still up in the air, but rsync would probably suffice (as long as we can stomach cygwin).&lt;br /&gt;
*Remove the Symbols repository.&lt;br /&gt;
*Rewrite fetchdlls to support the new layout.&lt;br /&gt;
&lt;br /&gt;
==Phase 5==&lt;br /&gt;
*Add hg.alliedmods.net pointing to our &amp;quot;repository roots,&amp;quot; which will be per-project.  For example, hg.alliedmods.net/sourcemod.  &lt;br /&gt;
*From there, import trunk as &amp;quot;sourcemod.&amp;quot;&lt;br /&gt;
*Branch every major release off as separate repositories, from the appropriate revisions.&lt;br /&gt;
*Tag minor releases.&lt;br /&gt;
*Update all links we can find on the site and in the docs.&lt;br /&gt;
&lt;br /&gt;
==Phase 6==&lt;br /&gt;
(Assuming Phase 3, No real date in mind, before 2009)&lt;br /&gt;
*Add /metamodsource, import trunk and branches.&lt;br /&gt;
*Branch every major release off as separate repositories, from the appropriate revisions.&lt;br /&gt;
*Tag minor releases.&lt;br /&gt;
*Update all links we can find on the site and in the docs.&lt;br /&gt;
*Create new repositories for the hl2sdk stuff.  This way, the AlliedModders root organization will look like:&lt;br /&gt;
**hl2sdk&lt;br /&gt;
***hl2sdk&lt;br /&gt;
***hl2sdk-ob&lt;br /&gt;
**metamodsource&lt;br /&gt;
***metamodsource&lt;br /&gt;
***metamodsource-1.0&lt;br /&gt;
***metamodsource-1.1&lt;br /&gt;
***metamodsource-1.2&lt;br /&gt;
***metamodsource-1.3&lt;br /&gt;
***metamodsource-1.4&lt;br /&gt;
***metamodsource-1.6&lt;br /&gt;
**sourcemod&lt;br /&gt;
***sourcemod&lt;br /&gt;
***sourcemod-1.0&lt;br /&gt;
&lt;br /&gt;
==Phase 7==&lt;br /&gt;
Expected date: End of 2008&lt;br /&gt;
&lt;br /&gt;
We really, really still need a CMS to make this packaging, mirroring, etc business much more streamlined.  But this phase is so far in the future I expect other phases to creep in before it.  This is more a mind dump than anything, but here goes --&lt;br /&gt;
&lt;br /&gt;
*Moving from flyspray to bugzilla.  After using bugzilla, I'm convinced that its massive feature set far outweights the few permissions issues we ran into.  flyspray is severely lacking, and even though bugzilla isn't the nicest looking tool, it's templated and professionally done.  It has little things that really count, like..&lt;br /&gt;
**The input system isn't broken and convoluted like Flyspray's embedded dokuwiki (which seems to be less a product than a bunch of bugs someone coded)&lt;br /&gt;
**A much, MUCH better attachment system that allows for attachment reviews&lt;br /&gt;
**More focused on triaging and patch management than flyspray, which is simply a list of tasks with some basic statistics&lt;br /&gt;
*Moving from MediaWiki, which (I view) as a very, very outdated piece of software.  From version 1.5 to 1.10 I have noticed no real usability or feature set changes, and the installation/upgrade process is always very buggy for us.  Its administration and permissions model is laughably limited.  A possible target for this is DekiWiki which Mozilla is supposedly converting to.  It's open source and it's actually a CMS, which (perhaps) could kill two birds with one stone.&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:Game_Resources&amp;diff=5810</id>
		<title>Category:Game Resources</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:Game_Resources&amp;diff=5810"/>
		<updated>2008-05-21T23:50:40Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Team Fortress 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this category you can find resources for specific mods.&lt;br /&gt;
&lt;br /&gt;
==Team Fortress 2==&lt;br /&gt;
[[Team_Fortress_2_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tf2classes.txt Classnames]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/ctfplayer-vtable-20070522.txt CTFPlayer Virtual Functions] - Updated 22/05/08&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/hi.txt Entity Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/tfdatamaps.txt DataMap Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mod_TempEnt_List_(Source)#Team_Fortress_2|Temp Ents]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/CTFKnife%20vtable.txt CTFKnife Virtual Functions]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/CTFWeaponBase%20Vtable.txt CTFWeaponBase Virtual Functions]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Counter-Strike Source==&lt;br /&gt;
[[Counter-Strike:_Source_Events|Events]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csclasses.txt Classnames]&amp;lt;br&amp;gt;&lt;br /&gt;
[[CCSPlayer_offset_list_(SourceMM)|CCSPlayer Virtual Functions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[CBaseCombatWeapon_CSS_offset_list_(SourceMM)|CBaseCombatWeapon Virtual Functions]]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csdump.txt Entity Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/csdatamaps.txt DataMap Properties]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Mod_TempEnt_List_(Source)#Counter-Strike:_Source|Temp Ents]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Counter-Strike:_Source_Weapons| Counter-Strike:Source Weapons]]&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Base_Plugins_(SourceMod)&amp;diff=5807</id>
		<title>Base Plugins (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Base_Plugins_(SourceMod)&amp;diff=5807"/>
		<updated>2008-05-12T08:56:32Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Default Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
The following is a full list of [[SourceMod]]'s base plugins and the purpose of each one.&lt;br /&gt;
&lt;br /&gt;
Plugins with a bold name are safe to be used in [[War_Mode_(SourceMod)|War Mode]], as they do not contain anything that could be considered abusive or unfair.&lt;br /&gt;
&lt;br /&gt;
=Default Plugins=&lt;br /&gt;
{| style=&amp;quot;width:600px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
 |- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
 |Plugin&lt;br /&gt;
 |Purpose&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''admin-flatfile'''&lt;br /&gt;
 | Loads admins from the admin configuration files.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''adminhelp'''&lt;br /&gt;
 | Provides the sm_help command (lists other commands and their syntax).&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''adminmenu'''&lt;br /&gt;
 | Provides the admin menu API and core features.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | antiflood&lt;br /&gt;
 | Prevents clients from spamming messagemode/chat.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''basebans'''&lt;br /&gt;
 | Provides basic banning commands and menu options.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basechat&lt;br /&gt;
 | Provides commands and menu options for managing player's abilities to use voice chat or say chat.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basecomm&lt;br /&gt;
 | Provides functionality for tweaking how players can communicate (in comparison to sv_alltalk).&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''basecommands'''&lt;br /&gt;
 | Provides basic administrative commands unrelated to player abuse (for example, map changing, kicking, and cvar changing).&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basetriggers&lt;br /&gt;
 | Provides automated responses to phrases such as &amp;quot;nextmap&amp;quot;, &amp;quot;thetime&amp;quot;, and &amp;quot;timeleft&amp;quot;.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basevotes&lt;br /&gt;
 | Provides basic voting commands, such as map voting.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | funcommands&lt;br /&gt;
 | Provides &amp;quot;fun&amp;quot; commands, like slapping.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | funvotes&lt;br /&gt;
 | Provides votes based on basefuncommands.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''nextmap'''&lt;br /&gt;
 | Allows admins or other plugins to dynamically alter or retrieve the effective mapcycle.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | reservedslots&lt;br /&gt;
 | Allows the server to have slots that are reserved for administrators (or privileged people), to ensure prioritized entry.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''clientprefs'''&lt;br /&gt;
 | Adds a console based (sm_cookies) and menu based (sm_settings) inteface for clients to access their settings.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=Extra Plugins=&lt;br /&gt;
The following plugins are in the &amp;lt;tt&amp;gt;addons/sourcemod/plugins/disabled&amp;lt;/tt&amp;gt; folder by default, and must be moved out of that folder to be enabled.&lt;br /&gt;
&lt;br /&gt;
If a plugin has cvars, you can load it once to generate its config file in &amp;lt;tt&amp;gt;cfg/sourcemod&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:600px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
 |- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
 |Plugin File&lt;br /&gt;
 |Purpose&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''admin-sql-prefetch'''&lt;br /&gt;
 | Loads admins from an SQL database as a big lump every mapchange.  If enabled, &amp;lt;tt&amp;gt;admin-sql-threaded&amp;lt;/tt&amp;gt; must be disabled; see [[SQL_Admins_(SourceMod)|SQL Admins]].&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''admin-sql-threaded'''&lt;br /&gt;
 | Loads admins from an SQL database dynamically as each admin connects.  If enabled, &amp;lt;tt&amp;gt;admin-sql-prefetch&amp;lt;/tt&amp;gt; must be disabled; see [[SQL_Admins_(SourceMod)|SQL Admins]].&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | mapchooser&lt;br /&gt;
 | Provides an automated system for players to vote for map changes.  If enabled, &amp;lt;tt&amp;gt;rockthevote&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;randomcycle&amp;lt;/tt&amp;gt; should be disabled.  Cvars are generated in &amp;lt;tt&amp;gt;plugin.mapchooser.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | randomcycle&lt;br /&gt;
 | Randomizes the map cycle.  If enabled, &amp;lt;tt&amp;gt;mapchooser&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;rockthevote&amp;lt;/tt&amp;gt; should be disabled.  Cvars are generated in &amp;lt;tt&amp;gt;plugin.randomcycle.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | rockthevote&lt;br /&gt;
 | Provides a player-initiated system for players to vote for map changes.  If enabled, &amp;lt;tt&amp;gt;mapchooser&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;randomcycle&amp;lt;/tt&amp;gt; should be disabled.  Cvars are generated in &amp;lt;tt&amp;gt;plugin.rtv.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Public_Commands_(SourceMod)&amp;diff=5806</id>
		<title>Public Commands (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Public_Commands_(SourceMod)&amp;diff=5806"/>
		<updated>2008-05-12T08:55:43Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following commands are available to players on SourceMod servers using the provided base plugin set.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;rockthevote.smx&amp;lt;/tt&amp;gt; is not enabled by default.&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| currentmap&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the name of the current map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| ff&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays whether friendly fire is on or off.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| nextmap&lt;br /&gt;
| nextmap.smx&lt;br /&gt;
| &lt;br /&gt;
| Shows the next map in the mapcycle to the user.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| nominate&lt;br /&gt;
| rockthevote.smx&lt;br /&gt;
| &amp;amp;lt;map&amp;amp;gt;&lt;br /&gt;
| Nominates a map for rtv.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| rtv OR rockthevote&lt;br /&gt;
| rockthevote.smx&lt;br /&gt;
| &lt;br /&gt;
| Starts a rockthevote vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| thetime&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the current time of the server.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| timeleft&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the time left in the map cycle.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_settings&lt;br /&gt;
| clientprefs.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the client settings menu.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_cookies&lt;br /&gt;
| clientprefs.smx&lt;br /&gt;
| &amp;lt;name&amp;gt; [value]&lt;br /&gt;
| With no arguments displays the list of available cookies, specify a name to show or change it's value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Public_Commands_(SourceMod)&amp;diff=5805</id>
		<title>Public Commands (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Public_Commands_(SourceMod)&amp;diff=5805"/>
		<updated>2008-05-12T08:55:31Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following commands are available to players on SourceMod servers using the provided base plugin set.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;rockthevote.smx&amp;lt;/tt&amp;gt; is not enabled by default.&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| currentmap&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the name of the current map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| ff&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays whether friendly fire is on or off.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| nextmap&lt;br /&gt;
| nextmap.smx&lt;br /&gt;
| &lt;br /&gt;
| Shows the next map in the mapcycle to the user.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| nominate&lt;br /&gt;
| rockthevote.smx&lt;br /&gt;
| &amp;amp;lt;map&amp;amp;gt;&lt;br /&gt;
| Nominates a map for rtv.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| rtv OR rockthevote&lt;br /&gt;
| rockthevote.smx&lt;br /&gt;
| &lt;br /&gt;
| Starts a rockthevote vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| thetime&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the current time of the server.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| timeleft&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the time left in the map cycle.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_settings&lt;br /&gt;
| clientprefs.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the client settings menu.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_cookie&lt;br /&gt;
| clientprefs.smx&lt;br /&gt;
| &amp;lt;name&amp;gt; [value]&lt;br /&gt;
| With no arguments displays the list of available cookies, specify a name to show or change it's value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Public_Commands_(SourceMod)&amp;diff=5804</id>
		<title>Public Commands (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Public_Commands_(SourceMod)&amp;diff=5804"/>
		<updated>2008-05-12T08:55:09Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The following commands are available to players on SourceMod servers using the provided base plugin set.&lt;br /&gt;
&lt;br /&gt;
Note that &amp;lt;tt&amp;gt;rockthevote.smx&amp;lt;/tt&amp;gt; is not enabled by default.&lt;br /&gt;
&lt;br /&gt;
:{| cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
| Command&lt;br /&gt;
| Plugin&lt;br /&gt;
| Format&lt;br /&gt;
| Description&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| currentmap&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the name of the current map.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| ff&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays whether friendly fire is on or off.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| nextmap&lt;br /&gt;
| nextmap.smx&lt;br /&gt;
| &lt;br /&gt;
| Shows the next map in the mapcycle to the user.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| nominate&lt;br /&gt;
| rockthevote.smx&lt;br /&gt;
| &amp;amp;lt;map&amp;amp;gt;&lt;br /&gt;
| Nominates a map for rtv.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| rtv OR rockthevote&lt;br /&gt;
| rockthevote.smx&lt;br /&gt;
| &lt;br /&gt;
| Starts a rockthevote vote.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| thetime&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the current time of the server.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| timeleft&lt;br /&gt;
| basetriggers.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the time left in the map cycle.&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_settings&lt;br /&gt;
| clientprefs.smx&lt;br /&gt;
| &lt;br /&gt;
| Displays the client settings menu&lt;br /&gt;
|- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
| sm_cookie&lt;br /&gt;
| clientprefs.smx&lt;br /&gt;
| &amp;lt;name&amp;gt; [value]&lt;br /&gt;
| With no arguments displays the list of available cookies, specify a name to show or change it's value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Base_Plugins_(SourceMod)&amp;diff=5803</id>
		<title>Base Plugins (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Base_Plugins_(SourceMod)&amp;diff=5803"/>
		<updated>2008-05-12T08:50:13Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Default Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
The following is a full list of [[SourceMod]]'s base plugins and the purpose of each one.&lt;br /&gt;
&lt;br /&gt;
Plugins with a bold name are safe to be used in [[War_Mode_(SourceMod)|War Mode]], as they do not contain anything that could be considered abusive or unfair.&lt;br /&gt;
&lt;br /&gt;
=Default Plugins=&lt;br /&gt;
{| style=&amp;quot;width:600px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
 |- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
 |Plugin&lt;br /&gt;
 |Purpose&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''admin-flatfile'''&lt;br /&gt;
 | Loads admins from the admin configuration files.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''adminhelp'''&lt;br /&gt;
 | Provides the sm_help command (lists other commands and their syntax).&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''adminmenu'''&lt;br /&gt;
 | Provides the admin menu API and core features.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | antiflood&lt;br /&gt;
 | Prevents clients from spamming messagemode/chat.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''basebans'''&lt;br /&gt;
 | Provides basic banning commands and menu options.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basechat&lt;br /&gt;
 | Provides commands and menu options for managing player's abilities to use voice chat or say chat.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basecomm&lt;br /&gt;
 | Provides functionality for tweaking how players can communicate (in comparison to sv_alltalk).&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''basecommands'''&lt;br /&gt;
 | Provides basic administrative commands unrelated to player abuse (for example, map changing, kicking, and cvar changing).&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basetriggers&lt;br /&gt;
 | Provides automated responses to phrases such as &amp;quot;nextmap&amp;quot;, &amp;quot;thetime&amp;quot;, and &amp;quot;timeleft&amp;quot;.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | basevotes&lt;br /&gt;
 | Provides basic voting commands, such as map voting.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | funcommands&lt;br /&gt;
 | Provides &amp;quot;fun&amp;quot; commands, like slapping.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | funvotes&lt;br /&gt;
 | Provides votes based on basefuncommands.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''nextmap'''&lt;br /&gt;
 | Allows admins or other plugins to dynamically alter or retrieve the effective mapcycle.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | reservedslots&lt;br /&gt;
 | Allows the server to have slots that are reserved for administrators (or privileged people), to ensure prioritized entry.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''clientprefs'''&lt;br /&gt;
 | Adds a console based (sm_cookie) and menu based (sm_settings) inteface for clients to access their settings.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
=Extra Plugins=&lt;br /&gt;
The following plugins are in the &amp;lt;tt&amp;gt;addons/sourcemod/plugins/disabled&amp;lt;/tt&amp;gt; folder by default, and must be moved out of that folder to be enabled.&lt;br /&gt;
&lt;br /&gt;
If a plugin has cvars, you can load it once to generate its config file in &amp;lt;tt&amp;gt;cfg/sourcemod&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:600px;&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
 |- class=&amp;quot;t2th&amp;quot;&lt;br /&gt;
 |Plugin File&lt;br /&gt;
 |Purpose&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''admin-sql-prefetch'''&lt;br /&gt;
 | Loads admins from an SQL database as a big lump every mapchange.  If enabled, &amp;lt;tt&amp;gt;admin-sql-threaded&amp;lt;/tt&amp;gt; must be disabled; see [[SQL_Admins_(SourceMod)|SQL Admins]].&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | '''admin-sql-threaded'''&lt;br /&gt;
 | Loads admins from an SQL database dynamically as each admin connects.  If enabled, &amp;lt;tt&amp;gt;admin-sql-prefetch&amp;lt;/tt&amp;gt; must be disabled; see [[SQL_Admins_(SourceMod)|SQL Admins]].&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | mapchooser&lt;br /&gt;
 | Provides an automated system for players to vote for map changes.  If enabled, &amp;lt;tt&amp;gt;rockthevote&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;randomcycle&amp;lt;/tt&amp;gt; should be disabled.  Cvars are generated in &amp;lt;tt&amp;gt;plugin.mapchooser.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | randomcycle&lt;br /&gt;
 | Randomizes the map cycle.  If enabled, &amp;lt;tt&amp;gt;mapchooser&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;rockthevote&amp;lt;/tt&amp;gt; should be disabled.  Cvars are generated in &amp;lt;tt&amp;gt;plugin.randomcycle.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 |- class=&amp;quot;t2td&amp;quot;&lt;br /&gt;
 | rockthevote&lt;br /&gt;
 | Provides a player-initiated system for players to vote for map changes.  If enabled, &amp;lt;tt&amp;gt;mapchooser&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;randomcycle&amp;lt;/tt&amp;gt; should be disabled.  Cvars are generated in &amp;lt;tt&amp;gt;plugin.rtv.cfg&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5788</id>
		<title>Reserved Slots (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5788"/>
		<updated>2008-04-30T03:39:38Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Kick Type */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cvars==&lt;br /&gt;
&lt;br /&gt;
*[[#Reserve Type|sm_reserve_type &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
*[[#Reserve Slots|sm_reserve_slots &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Hidden Slots|sm_hide_slots &amp;lt;0|1&amp;gt;]]&lt;br /&gt;
*[[#Max Admins|sm_reserve_maxadmins &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Kick Type|sm_reserve_kicktype &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Reserve Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_type &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how reserve slots work on the server (the default is 0).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Public slots are used in preference to reserved slots. Reserved slots are freed before public slots.&lt;br /&gt;
No players are ever kicked and once reserved slots are filled by a reserve slot player (and the rest of the server is full) they will remain occupied until a player leaves.&lt;br /&gt;
The use of this is that there can always be at least one admin (assuming you only give reserved slots to admins) on the server at any time. If players inform you that there is a hacker on the server, at least one admin should be able to get it and do something about it.&lt;br /&gt;
If a player without reserve slot access joins when there are only reserved spaces remaining they will be kicked from the server.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 1&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If someone with reserve access joins into a reserved slot, the player with the highest latency and without reserve access (spectator players are selected first) is kicked to make room. Thus, the reserved slots always remain free. The only situation where the reserved slot(s) can become properly occupied is if the server is full with reserve slot access clients. &lt;br /&gt;
This is for servers that want some people to have playing preference over other. With this method admins could one by one join a full server until they all get in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 2&amp;lt;/tt&amp;gt; - Only available in SourceMod 1.1 branch.&lt;br /&gt;
&lt;br /&gt;
The same as sm_reserve_type 1 except once a certain number of admins have been reached the reserve slot stops kicking people and anyone can join to fill the server.&lt;br /&gt;
You can use this to simulate having a large number of reserved slots with sm_reserve_type 0 but with only need to have 1 slot unavailable when there are less admins connected.&lt;br /&gt;
&lt;br /&gt;
==Reserve Slots==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_slots &amp;lt;#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how many slots get reserved by the plugin (the default is 0). &lt;br /&gt;
&lt;br /&gt;
Using sm_reserve_type 0 this is how many admins can join the server after it appears full to the public.&lt;br /&gt;
Using sm_reserve_type 1 this is how many slots are saved for swapping admins in (you shouldn't need more than one)&lt;br /&gt;
&lt;br /&gt;
==Hidden Slots==&lt;br /&gt;
&lt;br /&gt;
sm_hide_slots &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls the plugin hides the reserved slots (the default is 0).&lt;br /&gt;
&lt;br /&gt;
If enabled (1) reserve slots are hidden in the server browser window when they are not in use. For example a 24 player server with 2 reserved slots will show as a 22 player server (until the reserved slots are occupied).&lt;br /&gt;
To connect to the reserved slot of a server that shows as full you will need to use 'connect ip:port' in console. (e.g. 'connect 192.168.1.100:27015')&lt;br /&gt;
&lt;br /&gt;
There is no possible way for the reserved slots to be visible to admins and hidden from normal users. Admin authentication can only happen after the user is fully connected to the server and their steam id is available to SourceMod. For this reason it is often better to hide the slots otherwise public users will attempt to join the server and will get kicked again (rendering the ‘autojoin’ feature useless)&lt;br /&gt;
&lt;br /&gt;
==Max Admins==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_maxadmins &amp;lt;#&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how many admins can join the server before the reserved slots are made public (only relevant to sm_reserve_type 2) &lt;br /&gt;
&lt;br /&gt;
==Kick Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_kicktype &amp;lt;0|1|2&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how a client is selected to be kicked (only relevant to sm_reserve_type 1/2)&lt;br /&gt;
&lt;br /&gt;
Clients with reserve slot access or the override 'sm_reskick_immunity' are always immune to being kicked. Spectating clients are chosen before playing clients.&lt;br /&gt;
&lt;br /&gt;
0 - Highest Ping&amp;lt;br&amp;gt;&lt;br /&gt;
1 - Highest Connection Time&amp;lt;br&amp;gt;&lt;br /&gt;
2 - Random Player&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Immunity==&lt;br /&gt;
&lt;br /&gt;
To make players immune from being kicked by the reserved slots plugin they need to have access to the override 'sm_reskick_immunity' (users with root or reserved slot access are already immune).&lt;br /&gt;
&lt;br /&gt;
NB: This is only relevant when using sm_reserve_type 1/2.&lt;br /&gt;
&lt;br /&gt;
You can either assign this override to a flag using admin_overrides.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;o&amp;quot; - to give all users with flag 'o' (custom flag 1) immunity from being kicked)&lt;br /&gt;
&lt;br /&gt;
Or&lt;br /&gt;
&lt;br /&gt;
Give groups access to the overrides in admin_groups.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;allow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Then add your VIP members or other users you wish to be immune from being kicked as admins with either the flag you specified or as members of the group you gave access to. (You can create a group with 0 flags and ‘0’ normal immunity and only this override if you don't want them to have any other privileges) &lt;br /&gt;
&lt;br /&gt;
Full details on overriding command access can be found at [[Overriding Command Access (SourceMod)]]&lt;br /&gt;
&lt;br /&gt;
==Possible Future Additions==&lt;br /&gt;
&lt;br /&gt;
These are possible feature additions that have been requested and are under consideration for inclusion in later versions of SourceMod&lt;br /&gt;
&lt;br /&gt;
*Choice to redirect players instead of kicking.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation|Categories]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5787</id>
		<title>Reserved Slots (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5787"/>
		<updated>2008-04-30T03:35:48Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Possible Future Additions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cvars==&lt;br /&gt;
&lt;br /&gt;
*[[#Reserve Type|sm_reserve_type &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
*[[#Reserve Slots|sm_reserve_slots &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Hidden Slots|sm_hide_slots &amp;lt;0|1&amp;gt;]]&lt;br /&gt;
*[[#Max Admins|sm_reserve_maxadmins &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Kick Type|sm_reserve_kicktype &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Reserve Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_type &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how reserve slots work on the server (the default is 0).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Public slots are used in preference to reserved slots. Reserved slots are freed before public slots.&lt;br /&gt;
No players are ever kicked and once reserved slots are filled by a reserve slot player (and the rest of the server is full) they will remain occupied until a player leaves.&lt;br /&gt;
The use of this is that there can always be at least one admin (assuming you only give reserved slots to admins) on the server at any time. If players inform you that there is a hacker on the server, at least one admin should be able to get it and do something about it.&lt;br /&gt;
If a player without reserve slot access joins when there are only reserved spaces remaining they will be kicked from the server.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 1&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If someone with reserve access joins into a reserved slot, the player with the highest latency and without reserve access (spectator players are selected first) is kicked to make room. Thus, the reserved slots always remain free. The only situation where the reserved slot(s) can become properly occupied is if the server is full with reserve slot access clients. &lt;br /&gt;
This is for servers that want some people to have playing preference over other. With this method admins could one by one join a full server until they all get in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 2&amp;lt;/tt&amp;gt; - Only available in SourceMod 1.1 branch.&lt;br /&gt;
&lt;br /&gt;
The same as sm_reserve_type 1 except once a certain number of admins have been reached the reserve slot stops kicking people and anyone can join to fill the server.&lt;br /&gt;
You can use this to simulate having a large number of reserved slots with sm_reserve_type 0 but with only need to have 1 slot unavailable when there are less admins connected.&lt;br /&gt;
&lt;br /&gt;
==Reserve Slots==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_slots &amp;lt;#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how many slots get reserved by the plugin (the default is 0). &lt;br /&gt;
&lt;br /&gt;
Using sm_reserve_type 0 this is how many admins can join the server after it appears full to the public.&lt;br /&gt;
Using sm_reserve_type 1 this is how many slots are saved for swapping admins in (you shouldn't need more than one)&lt;br /&gt;
&lt;br /&gt;
==Hidden Slots==&lt;br /&gt;
&lt;br /&gt;
sm_hide_slots &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls the plugin hides the reserved slots (the default is 0).&lt;br /&gt;
&lt;br /&gt;
If enabled (1) reserve slots are hidden in the server browser window when they are not in use. For example a 24 player server with 2 reserved slots will show as a 22 player server (until the reserved slots are occupied).&lt;br /&gt;
To connect to the reserved slot of a server that shows as full you will need to use 'connect ip:port' in console. (e.g. 'connect 192.168.1.100:27015')&lt;br /&gt;
&lt;br /&gt;
There is no possible way for the reserved slots to be visible to admins and hidden from normal users. Admin authentication can only happen after the user is fully connected to the server and their steam id is available to SourceMod. For this reason it is often better to hide the slots otherwise public users will attempt to join the server and will get kicked again (rendering the ‘autojoin’ feature useless)&lt;br /&gt;
&lt;br /&gt;
==Max Admins==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_maxadmins &amp;lt;#&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how many admins can join the server before the reserved slots are made public (only relevant to sm_reserve_type 2) &lt;br /&gt;
&lt;br /&gt;
==Kick Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_kicktype &amp;lt;0|1|2&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how a client is selected to be kicked (only relevant to sm_reserve_type 1/2)&lt;br /&gt;
&lt;br /&gt;
Clients with reserve slot access or the override 'sm_reskick_immunity' are always immune to being kicked. Spectating clients are chosen before playing clients.&lt;br /&gt;
&lt;br /&gt;
0 - Highest Ping&lt;br /&gt;
1 - Highest Connection Time&lt;br /&gt;
2 - Random Player&lt;br /&gt;
&lt;br /&gt;
==Immunity==&lt;br /&gt;
&lt;br /&gt;
To make players immune from being kicked by the reserved slots plugin they need to have access to the override 'sm_reskick_immunity' (users with root or reserved slot access are already immune).&lt;br /&gt;
&lt;br /&gt;
NB: This is only relevant when using sm_reserve_type 1/2.&lt;br /&gt;
&lt;br /&gt;
You can either assign this override to a flag using admin_overrides.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;o&amp;quot; - to give all users with flag 'o' (custom flag 1) immunity from being kicked)&lt;br /&gt;
&lt;br /&gt;
Or&lt;br /&gt;
&lt;br /&gt;
Give groups access to the overrides in admin_groups.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;allow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Then add your VIP members or other users you wish to be immune from being kicked as admins with either the flag you specified or as members of the group you gave access to. (You can create a group with 0 flags and ‘0’ normal immunity and only this override if you don't want them to have any other privileges) &lt;br /&gt;
&lt;br /&gt;
Full details on overriding command access can be found at [[Overriding Command Access (SourceMod)]]&lt;br /&gt;
&lt;br /&gt;
==Possible Future Additions==&lt;br /&gt;
&lt;br /&gt;
These are possible feature additions that have been requested and are under consideration for inclusion in later versions of SourceMod&lt;br /&gt;
&lt;br /&gt;
*Choice to redirect players instead of kicking.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation|Categories]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5739</id>
		<title>Reserved Slots (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5739"/>
		<updated>2008-04-22T23:06:21Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Immunity */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cvars==&lt;br /&gt;
&lt;br /&gt;
*[[#Reserve Type|sm_reserve_type &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
*[[#Reserve Slots|sm_reserve_slots &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Hidden Slots|sm_hide_slots &amp;lt;0|1&amp;gt;]]&lt;br /&gt;
*[[#Max Admins|sm_reserve_maxadmins &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Kick Type|sm_reserve_kicktype &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Reserve Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_type &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how reserve slots work on the server (the default is 0).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Public slots are used in preference to reserved slots. Reserved slots are freed before public slots.&lt;br /&gt;
No players are ever kicked and once reserved slots are filled by a reserve slot player (and the rest of the server is full) they will remain occupied until a player leaves.&lt;br /&gt;
The use of this is that there can always be at least one admin (assuming you only give reserved slots to admins) on the server at any time. If players inform you that there is a hacker on the server, at least one admin should be able to get it and do something about it.&lt;br /&gt;
If a player without reserve slot access joins when there are only reserved spaces remaining they will be kicked from the server.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 1&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If someone with reserve access joins into a reserved slot, the player with the highest latency and without reserve access (spectator players are selected first) is kicked to make room. Thus, the reserved slots always remain free. The only situation where the reserved slot(s) can become properly occupied is if the server is full with reserve slot access clients. &lt;br /&gt;
This is for servers that want some people to have playing preference over other. With this method admins could one by one join a full server until they all get in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 2&amp;lt;/tt&amp;gt; - Only available in SourceMod 1.1 branch.&lt;br /&gt;
&lt;br /&gt;
The same as sm_reserve_type 1 except once a certain number of admins have been reached the reserve slot stops kicking people and anyone can join to fill the server.&lt;br /&gt;
You can use this to simulate having a large number of reserved slots with sm_reserve_type 0 but with only need to have 1 slot unavailable when there are less admins connected.&lt;br /&gt;
&lt;br /&gt;
==Reserve Slots==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_slots &amp;lt;#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how many slots get reserved by the plugin (the default is 0). &lt;br /&gt;
&lt;br /&gt;
Using sm_reserve_type 0 this is how many admins can join the server after it appears full to the public.&lt;br /&gt;
Using sm_reserve_type 1 this is how many slots are saved for swapping admins in (you shouldn't need more than one)&lt;br /&gt;
&lt;br /&gt;
==Hidden Slots==&lt;br /&gt;
&lt;br /&gt;
sm_hide_slots &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls the plugin hides the reserved slots (the default is 0).&lt;br /&gt;
&lt;br /&gt;
If enabled (1) reserve slots are hidden in the server browser window when they are not in use. For example a 24 player server with 2 reserved slots will show as a 22 player server (until the reserved slots are occupied).&lt;br /&gt;
To connect to the reserved slot of a server that shows as full you will need to use 'connect ip:port' in console. (e.g. 'connect 192.168.1.100:27015')&lt;br /&gt;
&lt;br /&gt;
There is no possible way for the reserved slots to be visible to admins and hidden from normal users. Admin authentication can only happen after the user is fully connected to the server and their steam id is available to SourceMod. For this reason it is often better to hide the slots otherwise public users will attempt to join the server and will get kicked again (rendering the ‘autojoin’ feature useless)&lt;br /&gt;
&lt;br /&gt;
==Max Admins==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_maxadmins &amp;lt;#&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how many admins can join the server before the reserved slots are made public (only relevant to sm_reserve_type 2) &lt;br /&gt;
&lt;br /&gt;
==Kick Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_kicktype &amp;lt;0|1|2&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how a client is selected to be kicked (only relevant to sm_reserve_type 1/2)&lt;br /&gt;
&lt;br /&gt;
Clients with reserve slot access or the override 'sm_reskick_immunity' are always immune to being kicked. Spectating clients are chosen before playing clients.&lt;br /&gt;
&lt;br /&gt;
0 - Highest Ping&lt;br /&gt;
1 - Highest Connection Time&lt;br /&gt;
2 - Random Player&lt;br /&gt;
&lt;br /&gt;
==Immunity==&lt;br /&gt;
&lt;br /&gt;
To make players immune from being kicked by the reserved slots plugin they need to have access to the override 'sm_reskick_immunity' (users with root or reserved slot access are already immune).&lt;br /&gt;
&lt;br /&gt;
NB: This is only relevant when using sm_reserve_type 1/2.&lt;br /&gt;
&lt;br /&gt;
You can either assign this override to a flag using admin_overrides.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;o&amp;quot; - to give all users with flag 'o' (custom flag 1) immunity from being kicked)&lt;br /&gt;
&lt;br /&gt;
Or&lt;br /&gt;
&lt;br /&gt;
Give groups access to the overrides in admin_groups.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;allow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Then add your VIP members or other users you wish to be immune from being kicked as admins with either the flag you specified or as members of the group you gave access to. (You can create a group with 0 flags and ‘0’ normal immunity and only this override if you don't want them to have any other privileges) &lt;br /&gt;
&lt;br /&gt;
Full details on overriding command access can be found at [[Overriding Command Access (SourceMod)]]&lt;br /&gt;
&lt;br /&gt;
==Possible Future Additions==&lt;br /&gt;
&lt;br /&gt;
These are possible feature additions that have been requested and are under consideration for inclusion in later versions of SourceMod&lt;br /&gt;
&lt;br /&gt;
*More methods of selecting the player to be kicked - connection time, afk idle time etc&lt;br /&gt;
*Choice to redirect players instead of kicking.&lt;br /&gt;
*Extra reserve mode that works as per mode '1' but only lets a specified number of admins in.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation|Categories]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5738</id>
		<title>Reserved Slots (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5738"/>
		<updated>2008-04-22T23:00:33Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Kick Type */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cvars==&lt;br /&gt;
&lt;br /&gt;
*[[#Reserve Type|sm_reserve_type &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
*[[#Reserve Slots|sm_reserve_slots &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Hidden Slots|sm_hide_slots &amp;lt;0|1&amp;gt;]]&lt;br /&gt;
*[[#Max Admins|sm_reserve_maxadmins &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Kick Type|sm_reserve_kicktype &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Reserve Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_type &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how reserve slots work on the server (the default is 0).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Public slots are used in preference to reserved slots. Reserved slots are freed before public slots.&lt;br /&gt;
No players are ever kicked and once reserved slots are filled by a reserve slot player (and the rest of the server is full) they will remain occupied until a player leaves.&lt;br /&gt;
The use of this is that there can always be at least one admin (assuming you only give reserved slots to admins) on the server at any time. If players inform you that there is a hacker on the server, at least one admin should be able to get it and do something about it.&lt;br /&gt;
If a player without reserve slot access joins when there are only reserved spaces remaining they will be kicked from the server.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 1&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If someone with reserve access joins into a reserved slot, the player with the highest latency and without reserve access (spectator players are selected first) is kicked to make room. Thus, the reserved slots always remain free. The only situation where the reserved slot(s) can become properly occupied is if the server is full with reserve slot access clients. &lt;br /&gt;
This is for servers that want some people to have playing preference over other. With this method admins could one by one join a full server until they all get in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 2&amp;lt;/tt&amp;gt; - Only available in SourceMod 1.1 branch.&lt;br /&gt;
&lt;br /&gt;
The same as sm_reserve_type 1 except once a certain number of admins have been reached the reserve slot stops kicking people and anyone can join to fill the server.&lt;br /&gt;
You can use this to simulate having a large number of reserved slots with sm_reserve_type 0 but with only need to have 1 slot unavailable when there are less admins connected.&lt;br /&gt;
&lt;br /&gt;
==Reserve Slots==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_slots &amp;lt;#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how many slots get reserved by the plugin (the default is 0). &lt;br /&gt;
&lt;br /&gt;
Using sm_reserve_type 0 this is how many admins can join the server after it appears full to the public.&lt;br /&gt;
Using sm_reserve_type 1 this is how many slots are saved for swapping admins in (you shouldn't need more than one)&lt;br /&gt;
&lt;br /&gt;
==Hidden Slots==&lt;br /&gt;
&lt;br /&gt;
sm_hide_slots &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls the plugin hides the reserved slots (the default is 0).&lt;br /&gt;
&lt;br /&gt;
If enabled (1) reserve slots are hidden in the server browser window when they are not in use. For example a 24 player server with 2 reserved slots will show as a 22 player server (until the reserved slots are occupied).&lt;br /&gt;
To connect to the reserved slot of a server that shows as full you will need to use 'connect ip:port' in console. (e.g. 'connect 192.168.1.100:27015')&lt;br /&gt;
&lt;br /&gt;
There is no possible way for the reserved slots to be visible to admins and hidden from normal users. Admin authentication can only happen after the user is fully connected to the server and their steam id is available to SourceMod. For this reason it is often better to hide the slots otherwise public users will attempt to join the server and will get kicked again (rendering the ‘autojoin’ feature useless)&lt;br /&gt;
&lt;br /&gt;
==Max Admins==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_maxadmins &amp;lt;#&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how many admins can join the server before the reserved slots are made public (only relevant to sm_reserve_type 2) &lt;br /&gt;
&lt;br /&gt;
==Kick Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_kicktype &amp;lt;0|1|2&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how a client is selected to be kicked (only relevant to sm_reserve_type 1/2)&lt;br /&gt;
&lt;br /&gt;
Clients with reserve slot access or the override 'sm_reskick_immunity' are always immune to being kicked. Spectating clients are chosen before playing clients.&lt;br /&gt;
&lt;br /&gt;
0 - Highest Ping&lt;br /&gt;
1 - Highest Connection Time&lt;br /&gt;
2 - Random Player&lt;br /&gt;
&lt;br /&gt;
==Immunity==&lt;br /&gt;
&lt;br /&gt;
To make players immune from being kicked by the reserved slots plugin they need to have access to the override 'sm_reskick_immunity' (users with root or reserved slot access are already immune).&lt;br /&gt;
&lt;br /&gt;
NB: This is only relevant when using sm_reserve_type 1.&lt;br /&gt;
&lt;br /&gt;
You can either assign this override to a flag using admin_overrides.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;o&amp;quot; - to give all users with flag 'o' (custom flag 1) immunity from being kicked)&lt;br /&gt;
&lt;br /&gt;
Or&lt;br /&gt;
&lt;br /&gt;
Give groups access to the overrides in admin_groups.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;allow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Then add your VIP members or other users you wish to be immune from being kicked as admins with either the flag you specified or as members of the group you gave access to. (You can create a group with 0 flags and ‘0’ normal immunity and only this override if you don't want them to have any other privileges) &lt;br /&gt;
&lt;br /&gt;
Full details on overriding command access can be found at [[Overriding Command Access (SourceMod)]]&lt;br /&gt;
&lt;br /&gt;
==Possible Future Additions==&lt;br /&gt;
&lt;br /&gt;
These are possible feature additions that have been requested and are under consideration for inclusion in later versions of SourceMod&lt;br /&gt;
&lt;br /&gt;
*More methods of selecting the player to be kicked - connection time, afk idle time etc&lt;br /&gt;
*Choice to redirect players instead of kicking.&lt;br /&gt;
*Extra reserve mode that works as per mode '1' but only lets a specified number of admins in.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation|Categories]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5737</id>
		<title>Reserved Slots (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Reserved_Slots_(SourceMod)&amp;diff=5737"/>
		<updated>2008-04-22T23:00:13Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Cvars==&lt;br /&gt;
&lt;br /&gt;
*[[#Reserve Type|sm_reserve_type &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
*[[#Reserve Slots|sm_reserve_slots &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Hidden Slots|sm_hide_slots &amp;lt;0|1&amp;gt;]]&lt;br /&gt;
*[[#Max Admins|sm_reserve_maxadmins &amp;lt;#&amp;gt;]]&lt;br /&gt;
*[[#Kick Type|sm_reserve_kicktype &amp;lt;0|1|2&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==Reserve Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_type &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how reserve slots work on the server (the default is 0).&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 0&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Public slots are used in preference to reserved slots. Reserved slots are freed before public slots.&lt;br /&gt;
No players are ever kicked and once reserved slots are filled by a reserve slot player (and the rest of the server is full) they will remain occupied until a player leaves.&lt;br /&gt;
The use of this is that there can always be at least one admin (assuming you only give reserved slots to admins) on the server at any time. If players inform you that there is a hacker on the server, at least one admin should be able to get it and do something about it.&lt;br /&gt;
If a player without reserve slot access joins when there are only reserved spaces remaining they will be kicked from the server.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 1&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If someone with reserve access joins into a reserved slot, the player with the highest latency and without reserve access (spectator players are selected first) is kicked to make room. Thus, the reserved slots always remain free. The only situation where the reserved slot(s) can become properly occupied is if the server is full with reserve slot access clients. &lt;br /&gt;
This is for servers that want some people to have playing preference over other. With this method admins could one by one join a full server until they all get in.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;sm_reserve_type 2&amp;lt;/tt&amp;gt; - Only available in SourceMod 1.1 branch.&lt;br /&gt;
&lt;br /&gt;
The same as sm_reserve_type 1 except once a certain number of admins have been reached the reserve slot stops kicking people and anyone can join to fill the server.&lt;br /&gt;
You can use this to simulate having a large number of reserved slots with sm_reserve_type 0 but with only need to have 1 slot unavailable when there are less admins connected.&lt;br /&gt;
&lt;br /&gt;
==Reserve Slots==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_slots &amp;lt;#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls how many slots get reserved by the plugin (the default is 0). &lt;br /&gt;
&lt;br /&gt;
Using sm_reserve_type 0 this is how many admins can join the server after it appears full to the public.&lt;br /&gt;
Using sm_reserve_type 1 this is how many slots are saved for swapping admins in (you shouldn't need more than one)&lt;br /&gt;
&lt;br /&gt;
==Hidden Slots==&lt;br /&gt;
&lt;br /&gt;
sm_hide_slots &amp;lt;0|1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This controls the plugin hides the reserved slots (the default is 0).&lt;br /&gt;
&lt;br /&gt;
If enabled (1) reserve slots are hidden in the server browser window when they are not in use. For example a 24 player server with 2 reserved slots will show as a 22 player server (until the reserved slots are occupied).&lt;br /&gt;
To connect to the reserved slot of a server that shows as full you will need to use 'connect ip:port' in console. (e.g. 'connect 192.168.1.100:27015')&lt;br /&gt;
&lt;br /&gt;
There is no possible way for the reserved slots to be visible to admins and hidden from normal users. Admin authentication can only happen after the user is fully connected to the server and their steam id is available to SourceMod. For this reason it is often better to hide the slots otherwise public users will attempt to join the server and will get kicked again (rendering the ‘autojoin’ feature useless)&lt;br /&gt;
&lt;br /&gt;
==Max Admins==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_maxadmins &amp;lt;#&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how many admins can join the server before the reserved slots are made public (only relevant to sm_reserve_type 2) &lt;br /&gt;
&lt;br /&gt;
==Kick Type==&lt;br /&gt;
&lt;br /&gt;
sm_reserve_kicktype &amp;lt;#&amp;gt; - Only available in SourceMod 1.1 branch&lt;br /&gt;
&lt;br /&gt;
This controls how a client is selected to be kicked (only relevant to sm_reserve_type 1/2)&lt;br /&gt;
&lt;br /&gt;
Clients with reserve slot access or the override 'sm_reskick_immunity' are always immune to being kicked. Spectating clients are chosen before playing clients.&lt;br /&gt;
&lt;br /&gt;
0 - Highest Ping&lt;br /&gt;
1 - Highest Connection Time&lt;br /&gt;
2 - Random Player &lt;br /&gt;
&lt;br /&gt;
==Immunity==&lt;br /&gt;
&lt;br /&gt;
To make players immune from being kicked by the reserved slots plugin they need to have access to the override 'sm_reskick_immunity' (users with root or reserved slot access are already immune).&lt;br /&gt;
&lt;br /&gt;
NB: This is only relevant when using sm_reserve_type 1.&lt;br /&gt;
&lt;br /&gt;
You can either assign this override to a flag using admin_overrides.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;o&amp;quot; - to give all users with flag 'o' (custom flag 1) immunity from being kicked)&lt;br /&gt;
&lt;br /&gt;
Or&lt;br /&gt;
&lt;br /&gt;
Give groups access to the overrides in admin_groups.cfg (e.g. &amp;quot;sm_reskick_immunity&amp;quot; &amp;quot;allow&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Then add your VIP members or other users you wish to be immune from being kicked as admins with either the flag you specified or as members of the group you gave access to. (You can create a group with 0 flags and ‘0’ normal immunity and only this override if you don't want them to have any other privileges) &lt;br /&gt;
&lt;br /&gt;
Full details on overriding command access can be found at [[Overriding Command Access (SourceMod)]]&lt;br /&gt;
&lt;br /&gt;
==Possible Future Additions==&lt;br /&gt;
&lt;br /&gt;
These are possible feature additions that have been requested and are under consideration for inclusion in later versions of SourceMod&lt;br /&gt;
&lt;br /&gt;
*More methods of selecting the player to be kicked - connection time, afk idle time etc&lt;br /&gt;
*Choice to redirect players instead of kicking.&lt;br /&gt;
*Extra reserve mode that works as per mode '1' but only lets a specified number of admins in.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation|Categories]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Custom_Admin_Menu_(SourceMod)&amp;diff=5729</id>
		<title>Custom Admin Menu (SourceMod)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Custom_Admin_Menu_(SourceMod)&amp;diff=5729"/>
		<updated>2008-04-16T11:04:23Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
The dynamic menu feature allows server admins to add new items to the SourceMod admin menu. It is designed to be used as a complement to plugins adding themselves to the menu. For more information see [[Admin Menu (SourceMod Scripting)]].&lt;br /&gt;
&lt;br /&gt;
Admins configure their menu using the config file (sourcemod/configs/dynamicmenu/menu.ini) and this is generated into a set of items and categories for the admin menu when the server starts.&lt;br /&gt;
&lt;br /&gt;
==Parameter List==&lt;br /&gt;
&lt;br /&gt;
These are all the paramters that can be specified to configure your menu. Most are optional and have a default value if they are not found. See the [[#Example Command|Example Command]] and/or the attached [[#Example Files|Example Files]] for information on how to lay out your config file.&lt;br /&gt;
&lt;br /&gt;
*cmd - command to be executed (#1,#2 etc for parameters - no limit on these) Use @num to have the parameter sent without being surrounded by &amp;quot;quotes&amp;quot;&lt;br /&gt;
*admin - admin level required to access the command - see [[#Admin Levels|Admin Levels]]&lt;br /&gt;
*execute - 'server' or 'player' - selects whether to execute as a client command or server command - defaults to 'player'&lt;br /&gt;
*1 - Information about parameter 1 (#1) - You need as many of these as you have parameters&lt;br /&gt;
**type - defaults to 'list' if not provided&lt;br /&gt;
***'groupplayer' 	- List of [[#Group Submenus|Groups]] + connected player &lt;br /&gt;
***'group' 			- List of [[#Group Submenus|Groups]]&lt;br /&gt;
***'player' 		- List of players&lt;br /&gt;
***'list'			- Custom Defined list of Options&lt;br /&gt;
***'mapcycle'		- Auto filled with the contents of your mapcycle file&lt;br /&gt;
***'onoff'			- On or Off menu that sends the numbers 1/0 (good for cvars etc)&lt;br /&gt;
**path - Only required for type mapcycle. Path (including file name and extension) to the file containing a list of maps (straight text formatting like mapcycle.txt) - defaults to 'mapcycle.txt'&lt;br /&gt;
**method - 'name', 'steamid', 'userid', 'userid2' (doesn't prepend the '#'), 'clientid', 'ip' - only needed for groupplayer/player menus - defaults to name&lt;br /&gt;
**title - To be shown for the parameter selection menu (optional)&lt;br /&gt;
**1-x	 - List parameters - only needed for 'list' type parameters&lt;br /&gt;
**1.-x. - Text to be shown for parameter - only needed for 'list' type parameters (optional, above will be used as text if ommited)&lt;br /&gt;
**1* - x* - Admin level required to see this option (same as the rest of the admin types)&lt;br /&gt;
&lt;br /&gt;
==Example Command==&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
&amp;quot;Commands&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;Fun Commands&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;Set Player Speed&amp;quot;&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;cmd&amp;quot;			&amp;quot;sm_speed #1 @2&amp;quot;&lt;br /&gt;
			&amp;quot;admin&amp;quot;			&amp;quot;sm_kick&amp;quot;&lt;br /&gt;
			&amp;quot;execute&amp;quot;		&amp;quot;player&amp;quot;&lt;br /&gt;
			&amp;quot;1&amp;quot;&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot; 		&amp;quot;groupplayer&amp;quot;&lt;br /&gt;
				&amp;quot;method&amp;quot;	&amp;quot;name&amp;quot;&lt;br /&gt;
				&amp;quot;title&amp;quot;		&amp;quot;Player/Team to Edit&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
			}&lt;br /&gt;
			&amp;quot;2&amp;quot;&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;type&amp;quot; 		&amp;quot;list&amp;quot;&lt;br /&gt;
				&amp;quot;title&amp;quot;		&amp;quot;Speed Multiplier&amp;quot;&lt;br /&gt;
				&amp;quot;1&amp;quot;		&amp;quot;1.0&amp;quot;&lt;br /&gt;
				&amp;quot;1.&amp;quot;		&amp;quot;Normal&amp;quot;&lt;br /&gt;
				&amp;quot;2&amp;quot;		&amp;quot;0.8&amp;quot;&lt;br /&gt;
				&amp;quot;2.&amp;quot;		&amp;quot;80%&amp;quot;&lt;br /&gt;
				&amp;quot;3&amp;quot;		&amp;quot;0.5&amp;quot;&lt;br /&gt;
				&amp;quot;3.&amp;quot;		&amp;quot;Half&amp;quot;&lt;br /&gt;
				&amp;quot;4&amp;quot;		&amp;quot;1.5&amp;quot;&lt;br /&gt;
				&amp;quot;4.&amp;quot;		&amp;quot;50% Boost&amp;quot;&lt;br /&gt;
				&amp;quot;5&amp;quot;		&amp;quot;2.0&amp;quot;&lt;br /&gt;
				&amp;quot;5.&amp;quot;		&amp;quot;Double&amp;quot;&lt;br /&gt;
				&amp;quot;5*&amp;quot;		&amp;quot;sm_ban&amp;quot; &lt;br /&gt;
				//restrict the double option to admins who have access to the 'sm_ban' override&lt;br /&gt;
			}&lt;br /&gt;
		&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Using the above as the contents of your menu.ini config file would create a new category option in the admin menu called 'Fun Commands'.&lt;br /&gt;
*This category would contain an option called : &amp;quot;Set Player Speed&amp;quot;.&lt;br /&gt;
*Selecting it would prompt another menu titled: &amp;quot;Player/Team to Edit&amp;quot; containing a list of Groups and Player Names.&lt;br /&gt;
*Selecting one of these would prompt a second menu titled &amp;quot;Speed Multiplier&amp;quot;.&lt;br /&gt;
*List of options like &amp;quot;Normal&amp;quot;, &amp;quot;80%&amp;quot; etc.&lt;br /&gt;
*Example command sent if the user selected &amp;quot;Double&amp;quot; (through the player using FakeClientCommand)  - 'sm_speed &amp;quot;@CT&amp;quot; 2.0'&lt;br /&gt;
&lt;br /&gt;
NB: You can use \ as an escape character. So \&amp;quot; will let you add quotes to your strings.&lt;br /&gt;
&lt;br /&gt;
==Admin Levels==&lt;br /&gt;
&lt;br /&gt;
	All 'admin' types now require a string command name. This command can be already existing (sm_ban) or completely imaginary (onlycrabscanusethis).&lt;br /&gt;
	&lt;br /&gt;
	If the command exists that section (or list option) will require the exact same access level as that command (including any overrides you have specified).&amp;lt;br&amp;gt;&lt;br /&gt;
	E.g. You use sm_ban as the admin level for a submenu, so anyone that can access sm_ban will also be able to access this menu option (By default this is admins with the 'ban' flag). However if you have overridden sm_ban in one of your lower groups (&amp;quot;override&amp;quot; &amp;quot;allow&amp;quot; - in admin_groups.cfg). This group will also have access.&lt;br /&gt;
	&lt;br /&gt;
	If the command doesn't exist you will need to add it to your overrides sections as if it was a normal command. This can be done in admin_overrides.cfg (to assign flag letters to this command),&lt;br /&gt;
	and/or in admin_groups.cfg (to give access to the command to a specified group or remove it from a group even though they have the flag)&lt;br /&gt;
&lt;br /&gt;
If no admin level is specified for a base command it will default to the first argument of the &amp;quot;cmd&amp;quot; string. For example having&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
&amp;quot;cmd&amp;quot;		&amp;quot;sm_ban #1 #2&amp;quot;&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would have a default admin override string of 'sm_ban'&lt;br /&gt;
	&lt;br /&gt;
For more information, see [[Overriding Command Access (SourceMod)|Overriding Command Access]]&lt;br /&gt;
&lt;br /&gt;
==Group Submenus==&lt;br /&gt;
&lt;br /&gt;
Types 'group' and 'groupplayer' auto-add pre configured options to the menu. These options are configured using sourcemod/configs/dynamicmenu/adminmenu_grouping.txt&lt;br /&gt;
&lt;br /&gt;
They are generally used to provide common commands like '@all' , '@t' etc to your menus.&lt;br /&gt;
&lt;br /&gt;
==Categories==&lt;br /&gt;
&lt;br /&gt;
If you wish to add items to an existing category you will need to specify it’s internal name. For the three categories provided by SourceMod base these are:&lt;br /&gt;
&lt;br /&gt;
*PlayerCommands&lt;br /&gt;
*ServerCommands&lt;br /&gt;
*VotingCommands&lt;br /&gt;
&lt;br /&gt;
==Sorting==&lt;br /&gt;
Categories and items added using the dynamic menu can be sorted in the same way as normal items. For more information, see [[Admin Menu Configuration (SourceMod)|Admin Menu Configuration]]&lt;br /&gt;
&lt;br /&gt;
You need to specify the name you gave the command in your configuration file. For the provided example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
&amp;quot;item&amp;quot;	&amp;quot;Set Player Speed&amp;quot;&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
==Extra Uses==&lt;br /&gt;
An example of using the dynamic menu to it's full potential: Giving admins access to some cvars while not letting them have general 'sm_cvar' access.&lt;br /&gt;
&lt;br /&gt;
Add the cvar you want to make available using the command directly and set the 'execute' parameter to 'server'&lt;br /&gt;
&amp;lt;pawn&amp;gt;&lt;br /&gt;
&amp;quot;cmd&amp;quot;		&amp;quot;mp_friendlyfire #1&amp;quot;&lt;br /&gt;
&amp;quot;execute&amp;quot;	&amp;quot;server&amp;quot;&lt;br /&gt;
&amp;quot;admin&amp;quot;		&amp;quot;sm_kick&amp;quot;&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This fires the command directly through rcon so it bypasses the normal SourceMod admin requirements and only checks what you set using the 'admin' parameter. This method can be used to create a list of commonly used (and low impact) cvars that your lower admins can change at will, without giving them access to everything. The same method works for rcon commands.&lt;br /&gt;
&lt;br /&gt;
==Example Files==&lt;br /&gt;
&lt;br /&gt;
Example Menu.ini setup with Super Commands examples:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/supercmdsmenu.ini menu.ini]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
A Full example setup thanks to uE|Tekniqal:&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/smsuper.ini menu.ini]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/admin_overrides.cfg admin_overrides.cfg]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://alliedmods.net/~pred/admin_groups.cfg admin_groups.cfg]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Documentation]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Documentation&amp;diff=5728</id>
		<title>Category:SourceMod Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Documentation&amp;diff=5728"/>
		<updated>2008-04-16T11:03:40Z</updated>

		<summary type="html">&lt;p&gt;PRED*: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Installation'''&lt;br /&gt;
*[[Installing SourceMod]]&lt;br /&gt;
*[[Upgrading SourceMod]]&lt;br /&gt;
&lt;br /&gt;
'''Configuration'''&lt;br /&gt;
*[[SourceMod Configuration|General Overview]]&lt;br /&gt;
*[[Adding Admins (SourceMod)|Adding Admins]]&lt;br /&gt;
*[[Adding Groups (SourceMod)|Adding Groups]]&lt;br /&gt;
*[[Overriding Command Access (SourceMod)|Overriding Command Access]]&lt;br /&gt;
*[[SQL Admins (SourceMod)|SQL Admins]]&lt;br /&gt;
*[[Admin Menu Configuration (SourceMod)|Admin Menu Configuration]]&lt;br /&gt;
*[[Dynamic Admin Menu (SourceMod) | Dynamic Admin Menu Configuration]]&lt;br /&gt;
*[[Reserved Slots (SourceMod)|Reserved Slots]]&lt;br /&gt;
&lt;br /&gt;
'''Information'''&lt;br /&gt;
*[[Admin Commands (SourceMod)|Admin Commands]]&lt;br /&gt;
*[[Public Commands (SourceMod)|Public Commands]]&lt;br /&gt;
*[[Base Plugins (SourceMod)|Base Plugin List]]&lt;br /&gt;
*[[War Mode (SourceMod)|War Mode]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=5727</id>
		<title>Writing Extensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=5727"/>
		<updated>2008-04-14T03:20:18Z</updated>

		<summary type="html">&lt;p&gt;PRED*: /* Managed Forwards */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SourceMod's Extension System is a powerful way to greatly enhance the flexibility of your SourceMod plugins.  You can take full advantage of SourceMod's Core, using the interfaces it provides, to create C++ plugins, plugin events, plugin native functions, and shared interfaces.  Extensions can also hook into Metamod:Source.&lt;br /&gt;
&lt;br /&gt;
This article goes into the details of creating a SourceMod Extension.  Knowledge of C++ is required.&lt;br /&gt;
&lt;br /&gt;
=SDK Structure=&lt;br /&gt;
First, download the [[SourceMod SDK]] from the [[SourceMod]] website.  The directory structure looks like this:&lt;br /&gt;
*&amp;lt;tt&amp;gt;extensions&amp;lt;/tt&amp;gt;&lt;br /&gt;
**&amp;lt;tt&amp;gt;geoip/&amp;lt;/tt&amp;gt; - Source code to the GeoIP extension&lt;br /&gt;
**&amp;lt;tt&amp;gt;mysql/&amp;lt;/tt&amp;gt; - Source code to the MySQL extension&lt;br /&gt;
**&amp;lt;tt&amp;gt;threader/&amp;lt;/tt&amp;gt; - Source code to the Threader extension&lt;br /&gt;
*&amp;lt;tt&amp;gt;plugins/&amp;lt;/tt&amp;gt; - Source code to all of SourceMod's plugins&lt;br /&gt;
**&amp;lt;tt&amp;gt;include/&amp;lt;/tt&amp;gt; - The include files which document plugin API&lt;br /&gt;
*&amp;lt;tt&amp;gt;public/&amp;lt;/tt&amp;gt; - Interface files for SourceMod's Core Interfaces&lt;br /&gt;
**&amp;lt;tt&amp;gt;extensions/&amp;lt;/tt&amp;gt; - Interfaces that are provided by extensions&lt;br /&gt;
**&amp;lt;tt&amp;gt;sample_ext/&amp;lt;/tt&amp;gt; - The Sample Extension SDK&lt;br /&gt;
**&amp;lt;tt&amp;gt;sourcepawn&amp;lt;/tt&amp;gt; - The include/interface files for SourcePawn&lt;br /&gt;
*&amp;lt;tt&amp;gt;sourcepawn/&amp;lt;/tt&amp;gt;&lt;br /&gt;
**&amp;lt;tt&amp;gt;compiler/&amp;lt;/tt&amp;gt; - The SourcePawn Compiler&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Starting an Extension=&lt;br /&gt;
For simplicity, this article will assume you are using the SDK base files.  These are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;sdk/smsdk_config.h&amp;lt;/tt&amp;gt; - Configuration settings (we will be editing this)&lt;br /&gt;
*&amp;lt;tt&amp;gt;sdk/smsdk_ext.h&amp;lt;/tt&amp;gt; - Header for SDK wrappers (usually never needs to be edited)&lt;br /&gt;
**''Note: Sometimes, this may be updated by the SourceMod Dev Team.  Using a newest version is recommended.'&lt;br /&gt;
*&amp;lt;tt&amp;gt;sdk/smsdk_ext.cpp&amp;lt;/tt&amp;gt; - Source for SDK wrappers (usually never needs to be edited)&lt;br /&gt;
**''Note: Sometimes, this may be updated by the SourceMod Dev Team.  Using a newest version is recommended.'&lt;br /&gt;
*&amp;lt;tt&amp;gt;extension.h&amp;lt;/tt&amp;gt; - User file for main extension header&lt;br /&gt;
*&amp;lt;tt&amp;gt;extension.cpp&amp;lt;/tt&amp;gt; - User file for main extension code&lt;br /&gt;
&lt;br /&gt;
''The &amp;lt;tt&amp;gt;extension.*&amp;lt;/tt&amp;gt; files are not technically part of the SDK.  However, they are provided to give users a starting point and some documentation.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Note:''' For help setting up Visual Studio, please see [[#Setting up Visual Studio|Setting up Visual Studio]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The first step of creating your extension is to configure it.  Open the &amp;lt;tt&amp;gt;smsdk_config.h&amp;lt;/tt&amp;gt; file and edit each of the following defines.  Use the information below to guide you.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_NAME&amp;lt;/tt&amp;gt; - The general name for your Extension (should be short).&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_DESCRIPTION&amp;lt;/tt&amp;gt; - A short description of what your extension does.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_VERSION&amp;lt;/tt&amp;gt; - A version number string.  By convention, SourceMod uses the four set build number notation.  I.e. for 1.2.3.4:&lt;br /&gt;
**&amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; is the &amp;quot;Major&amp;quot; release version.&lt;br /&gt;
**&amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; is the &amp;quot;Minor&amp;quot; release version.&lt;br /&gt;
**&amp;lt;tt&amp;gt;3&amp;lt;/tt&amp;gt; is the &amp;quot;Maintenance&amp;quot; or &amp;quot;Revision&amp;quot; version.&lt;br /&gt;
**&amp;lt;tt&amp;gt;4&amp;lt;/tt&amp;gt; is the &amp;quot;Build,&amp;quot; usually an internal source control number.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_AUTHOR&amp;lt;/tt&amp;gt; - Your name (or whoever/whatever authored the plugin).&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_URL&amp;lt;/tt&amp;gt; - The URL/homepage of this extension.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_LOGTAG&amp;lt;/tt&amp;gt; - The logtag your extension will use for SourceMod logging.  By convention, try to keep this under ten characters or so, and to make it all caps.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_LICENSE&amp;lt;/tt&amp;gt; - Right now, the SourceMod Dev Team mandates that 3rd party extensions must be under an Open Source license.  Putting a license abbreviation or very short message here is appropriate.  For more information, see [[SourceMod License]].&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_DATESTRING&amp;lt;/tt&amp;gt; - You do not need to modify this.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_CONF_METAMOD&amp;lt;/tt&amp;gt; - If your plugin requires using SourceHook or Metamod:Source, uncomment this line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, you may want to change the name of the default class that &amp;lt;tt&amp;gt;extension.h&amp;lt;/tt&amp;gt; declares.  To do this...&lt;br /&gt;
&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;Open &amp;lt;tt&amp;gt;extension.h&amp;lt;/tt&amp;gt; and change &amp;quot;Sample&amp;quot; in this line:&lt;br /&gt;
&amp;lt;cpp&amp;gt;class Sample : public SDKExtension&amp;lt;/cpp&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Open &amp;lt;tt&amp;gt;extension.cpp&amp;lt;/tt&amp;gt; and change the two lines to correspond to your new class name.  You can also change the global singleton that's declared, although you cannot remove the &amp;lt;tt&amp;gt;SMEXT_LINK&amp;lt;/tt&amp;gt; line (this lets SourceMod load your extension).&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Users==&lt;br /&gt;
Make sure you change the name of your &amp;lt;tt&amp;gt;.dll&amp;lt;/tt&amp;gt; file.  The naming convention for SourceMod extensions is &amp;lt;tt&amp;gt;name.ext.dll&amp;lt;/tt&amp;gt;, where &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; is a short name for your extension.  You are free to change this, but it is highly recommended that you keep the &amp;lt;tt&amp;gt;.ext.dll&amp;lt;/tt&amp;gt; intact.&lt;br /&gt;
&lt;br /&gt;
You can do this by going to &amp;lt;tt&amp;gt;Project&amp;lt;/tt&amp;gt; -&amp;gt; &amp;lt;tt&amp;gt;Properties&amp;lt;/tt&amp;gt; -&amp;gt; &amp;lt;tt&amp;gt;Configuration Properties&amp;lt;/tt&amp;gt; -&amp;gt; &amp;lt;tt&amp;gt;Linker&amp;lt;/tt&amp;gt; -&amp;gt; &amp;lt;tt&amp;gt;General&amp;lt;/tt&amp;gt;.  Set the &amp;lt;tt&amp;gt;Output File&amp;lt;/tt&amp;gt; option appropriately.&lt;br /&gt;
&lt;br /&gt;
==Linux Users==&lt;br /&gt;
Simply edit the &amp;lt;tt&amp;gt;Makefile&amp;lt;/tt&amp;gt; and change the &amp;lt;tt&amp;gt;BINARY&amp;lt;/tt&amp;gt; line near the top.  Make sure you do not add any trailing spaces at the end of the name, or the build won't come out right.&lt;br /&gt;
&lt;br /&gt;
You should now be able to compile a blank extension!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Creating Native Functions=&lt;br /&gt;
''Main article: [[Natives (SourceMod Development)]]''&lt;br /&gt;
&lt;br /&gt;
Most of the time, an extension exists to add &amp;quot;native functions&amp;quot; to the plugin system.  Native functions are simply the functions that plugins can use in SourceMod.  They are coded in C++ and have a short prototype declaration in an include file.&lt;br /&gt;
&lt;br /&gt;
==Prototyping==&lt;br /&gt;
The first step to creating a native is to &amp;lt;tt&amp;gt;spec it&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;prototype&amp;lt;/tt&amp;gt; it.  This is a simple but often time consuming process, but if you get in the habit of it, your documentation will be much better.  Let's first create a very simply native.  Here is a prototype for it, which we will place in &amp;lt;tt&amp;gt;sample.inc&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;pawn&amp;gt;/**&lt;br /&gt;
 * Returns the square of a number.&lt;br /&gt;
 *&lt;br /&gt;
 * @param num	Number to square.&lt;br /&gt;
 * @return	The square of num.&lt;br /&gt;
 */&lt;br /&gt;
native SquareNumber(num);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;native&amp;lt;/tt&amp;gt; keyword tells the compiler that this function exists in an outside source.  The comment style is similar to [http://www.stack.nl/~dimitri/doxygen/ doxygen] or [http://java.sun.com/j2se/javadoc/ Javadoc], and is preferred by the SourceMod Development Team.&lt;br /&gt;
&lt;br /&gt;
==Implementing==&lt;br /&gt;
Now that our function is documented, it's time to create it!  Each native function is bound to a C++ function.  The prototype for this function looks like:&lt;br /&gt;
&amp;lt;cpp&amp;gt;cell_t Function(IPluginContext *pContext, const cell_t *params);&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A quick explanation of these types:&lt;br /&gt;
*&amp;lt;tt&amp;gt;cell_t&amp;lt;/tt&amp;gt; - This is a 32bit signed integer, the generic data type for Pawn.&lt;br /&gt;
*&amp;lt;tt&amp;gt;IPluginContext&amp;lt;/tt&amp;gt; - This interface provides Virtual Machine functions for retrieving or modifying memory in the plugin.&lt;br /&gt;
*&amp;lt;tt&amp;gt;params&amp;lt;/tt&amp;gt; - This is the &amp;quot;stack&amp;quot; of parameters that the plugin passed.  It is an array from [0..N] where 0 contains N.  &lt;br /&gt;
**For example, if one parameter was passed, and the parameter is 25:&lt;br /&gt;
***&amp;lt;tt&amp;gt;params[0]&amp;lt;/tt&amp;gt; == 1&lt;br /&gt;
***&amp;lt;tt&amp;gt;params[1]&amp;lt;/tt&amp;gt; == 25&lt;br /&gt;
**Even though it tells you how many parameters are passed, you do not need to verify this number.  The compiler will always pass the correct number of parameters in.  The only time you need to verify it is for backwards compatibility or variable parameter lists, which will be discussed later.&lt;br /&gt;
&lt;br /&gt;
Now, let's write our native function:&lt;br /&gt;
&amp;lt;cpp&amp;gt;cell_t SquareNumber(IPluginContext *pContext, const cell_t *params)&lt;br /&gt;
{&lt;br /&gt;
	cell_t number = params[1];&lt;br /&gt;
	return number * number;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Binding==&lt;br /&gt;
Now, the final step is to bind our native.  Natives are bound in ''native lists''.  Each list must be terminated by a &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt; bind.  Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;const sp_nativeinfo_t MyNatives[] = &lt;br /&gt;
{&lt;br /&gt;
	{&amp;quot;SquareNumber&amp;quot;,	SquareNumber},&lt;br /&gt;
	{NULL,			NULL},&lt;br /&gt;
};&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first column/member is a string containing the name you've assigned to the native.  The second column/member is the C++ function you're binding to.  Here, both contain the same name, but it is certainly possible to bind a function to any valid Pawn function name, and likewise, you can bind one function to more than one name.&lt;br /&gt;
&lt;br /&gt;
Lastly, you must tell Core about your native list.  There are two places that are good to do this.  Whichever you choose, you must uncomment the function in &amp;lt;tt&amp;gt;extension.h&amp;lt;/tt&amp;gt; and implement it in &amp;lt;tt&amp;gt;extension.cpp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SDK_OnLoad&amp;lt;/tt&amp;gt; - This is called when your extension is first loaded.  If you do not require any outside interfaces, it is safe to add natives here.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SDK_OnAllLoaded&amp;lt;/tt&amp;gt; - This is called when all extensions have been loaded.  This is generally a better place to add natives.&lt;br /&gt;
&lt;br /&gt;
Let's say we choose &amp;lt;tt&amp;gt;SDK_OnAllLoaded&amp;lt;/tt&amp;gt;, we'd then have code like this:&lt;br /&gt;
&amp;lt;cpp&amp;gt;void Sample::SDK_OnAllLoaded()&lt;br /&gt;
{&lt;br /&gt;
	sharesys-&amp;gt;AddNatives(myself, MyNatives);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
''Note: &amp;lt;tt&amp;gt;myself&amp;lt;/tt&amp;gt; is a global variable declared in the SDK.  It is a pointer that identifies your extension.''&lt;br /&gt;
&lt;br /&gt;
For more information on writing natives, see [[Natives (SourceMod Development)]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Creating Events/Forwards=&lt;br /&gt;
Events are an integral part to SourceMod.  An Event is formally called a ''Forward''.  Forwards are functions inside a plugin which are not called by the plugin itself, but are triggered from an external source.  For example, &amp;lt;tt&amp;gt;OnClientConnect&amp;lt;/tt&amp;gt; is a forward which is triggered when a player connects to a server.&lt;br /&gt;
&lt;br /&gt;
There are two major types of forwards:&lt;br /&gt;
*'''Managed''': This forward is global and has a name.  To use this forward, the function must be declared as &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; inside the user's script.  Any plugin having this public function will receive the event.&lt;br /&gt;
*'''Unmanaged''': This forward is private in nature.  For example, the &amp;lt;tt&amp;gt;HookUserMessage&amp;lt;/tt&amp;gt; native lets users specify a function to be called when a specific user message is sent.  This is done with an unmanaged forward, and adding functions to this forward is not automatic.  In general, function calls for unmanaged forwards are not public, although they can be.&lt;br /&gt;
&lt;br /&gt;
==Managed Forwards==&lt;br /&gt;
Let's say we want to create a forward that will be called when a player uses say chat.  For simplicity, let's assume you already have a function that tells you when a player says say chat.  We will just be creating the forward for it.&lt;br /&gt;
&lt;br /&gt;
As we did before, first let's prototype our global forward.  In our include file, we add this:&lt;br /&gt;
&amp;lt;pawn&amp;gt;/**&lt;br /&gt;
 * @brief Called whenever a client says something in chat.&lt;br /&gt;
 *&lt;br /&gt;
 * @param client	Index of the client.&lt;br /&gt;
 * @param text		String containing the say text.&lt;br /&gt;
 * @return 		Pl_Handled to block text from printing, Pl_Continue otherwise.&lt;br /&gt;
 */&lt;br /&gt;
forward ResultType:OnPlayerSayChat(client, const String:text[]);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;forward&amp;lt;/tt&amp;gt; keyword tells the compiler that any function having this name must be declared exactly the same.  In a plugin, this would&lt;br /&gt;
&lt;br /&gt;
The next step is to declare your forward somewhere at the top of your &amp;lt;tt&amp;gt;extension.cpp&amp;lt;/tt&amp;gt; file.  This will look like:&lt;br /&gt;
&amp;lt;cpp&amp;gt;IForward *g_pSayChat = NULL&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next, re-using our code from above, let's create this forward in &amp;lt;tt&amp;gt;SDK_OnAllLoaded&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;cpp&amp;gt;void Sample::SDK_OnAllLoaded()&lt;br /&gt;
{&lt;br /&gt;
	sharesys-&amp;gt;AddNatives(myself, MyNatives);&lt;br /&gt;
	g_pSayChat = forwards-&amp;gt;CreateForward(&amp;quot;OnPlayerSayChat&amp;quot;, ET_Event, 2, NULL, Param_Cell, Param_String);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explanation of parameters:&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;quot;OnPlayerSayChat&amp;quot;&amp;lt;/tt&amp;gt; - The name of our forward.&lt;br /&gt;
*&amp;lt;tt&amp;gt;ET_Event&amp;lt;/tt&amp;gt; - Since forwards can execute multiple functions in multiple scripts, this is one of the ways of specifying what to do with the return value of each function.  &amp;lt;tt&amp;gt;ET_Event&amp;lt;/tt&amp;gt; means &amp;quot;return the highest value, do not allow stops.&amp;quot;  A stop refers to &amp;lt;tt&amp;gt;Pl_Stop&amp;lt;/tt&amp;gt;, which lets a plugin block the rest of the event chain.&lt;br /&gt;
*&amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; - This is the number of parameters our forward will have.&lt;br /&gt;
*&amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt; - Not used in our example.  This lets you pass parameters by array rather than variable arguments.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Param_Cell&amp;lt;/tt&amp;gt; - The first parameter is a cell (integer).&lt;br /&gt;
*&amp;lt;tt&amp;gt;Param_String&amp;lt;/tt&amp;gt; - The second parameter is a string.&lt;br /&gt;
&lt;br /&gt;
Now, we write a quick function in our module to call this forward:&lt;br /&gt;
&amp;lt;cpp&amp;gt;/** Fires the say chat event in plugins.  Returns true to allow the text, false to block. */&lt;br /&gt;
bool FireChatEvent(int client, const char *text)&lt;br /&gt;
{&lt;br /&gt;
	if (!g_pSayChat)&lt;br /&gt;
	{&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	cell_t result = 0;&lt;br /&gt;
	g_pSayChat-&amp;gt;PushCell(client);&lt;br /&gt;
	g_pSayChat-&amp;gt;PushString(text);&lt;br /&gt;
	g_pSayChat-&amp;gt;Execute(&amp;amp;result);&lt;br /&gt;
	&lt;br /&gt;
	if (result == Pl_Handled)&lt;br /&gt;
	{&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, this was pretty simple.  Each parameter is &amp;quot;pushed&amp;quot; one at a time, in ascending order.  First we push the client index as a cell, then the text as a string.  Once done, we execute, and the value will be returned by reference.&lt;br /&gt;
&lt;br /&gt;
Lastly, there is a caveat.  Unlike natives, SourceMod does not automatically clean up forwards for us when are done.  We have to make sure we destroy them.  Uncomment &amp;lt;tt&amp;gt;SDK_OnUnload&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;extension.h&amp;lt;/tt&amp;gt; and implement it like so:&lt;br /&gt;
&amp;lt;cpp&amp;gt;void Sample::SDK_OnUnload()&lt;br /&gt;
{&lt;br /&gt;
	forwards-&amp;gt;ReleaseForward(g_pSayChat);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Unmanaged Forwards==&lt;br /&gt;
Now things get a bit more complicated.  However, unmanaged forwards are essentially the same -- they just give you more flexibility.  Let's consider the managed example with a new twist.  We want to let users add and remove hooks from their plugins, rather than having one global forward.  The standard way to do this is with ''function IDs''.  &lt;br /&gt;
&lt;br /&gt;
Example prototype:&lt;br /&gt;
&amp;lt;pawn&amp;gt;funcenum SayChatHook&lt;br /&gt;
{&lt;br /&gt;
	forward(client, const String:text[]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
native AddSayChatHook(SayChatHook:hook);&lt;br /&gt;
native RemoveSayChatHook(SayChatHook:hook);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;funcenum&amp;lt;/tt&amp;gt; syntax lets you define all the valid prototypes for your hook.  In this example, the only valid method is a function declared like this (only MyHook can be changed):&lt;br /&gt;
&amp;lt;pawn&amp;gt;MyHook(client, const String:text[])&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
How do we make such a beast?  The first step is setting up our forward.&lt;br /&gt;
&amp;lt;cpp&amp;gt;IChangeableForward *g_pSayChat = NULL;&lt;br /&gt;
/* ... */&lt;br /&gt;
void Sample::SDK_OnAllLoaded()&lt;br /&gt;
{&lt;br /&gt;
	g_pSayChat = forwards-&amp;gt;CreateForwardEx(NULL, ET_Hook, 2, NULL, Param_Cell, Param_String); &lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice two big differences.  We now use &amp;lt;tt&amp;gt;IChangeableForward&amp;lt;/tt&amp;gt; instead of &amp;lt;tt&amp;gt;IForward&amp;lt;/tt&amp;gt;, and we use &amp;lt;tt&amp;gt;CreateForwardEx&amp;lt;/tt&amp;gt; instead.  The initial first parameter specifies a name for our forward - we're going to ignore this.&lt;br /&gt;
&lt;br /&gt;
Now, we need to create our natives.  These will be fairly simple:&lt;br /&gt;
&amp;lt;cpp&amp;gt;cell_t AddSayChatHook(IPluginContext *pContext, const cell_t *params)&lt;br /&gt;
{&lt;br /&gt;
	g_pSayChat-&amp;gt;AddFunction(pContext, static_cast&amp;lt;funcid_t&amp;gt;(params[1]));&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
cell_t RemoveSayChatHook(IPluginContext *pContext, const cell_t *params)&lt;br /&gt;
{&lt;br /&gt;
	IPluginFunction *pFunction = pContext-&amp;gt;GetFunctionById(static_cast&amp;lt;funcid_t&amp;gt;(params[1]));&lt;br /&gt;
	g_pSayChat-&amp;gt;RemoveFunction(pFunction);&lt;br /&gt;
	return 1;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
''Note: These natives must be added -- that step is removed here and explained earlier.''&lt;br /&gt;
&lt;br /&gt;
You do not need to worry about a plugin unloading - Core will automatically remove the functions for you.  Since an &amp;lt;tt&amp;gt;IChangeableForward&amp;lt;/tt&amp;gt; is also an &amp;lt;tt&amp;gt;IForward&amp;lt;/tt&amp;gt;, the &amp;lt;tt&amp;gt;FireChatEvent&amp;lt;/tt&amp;gt; function from earlier does not need to change.  We're done!&lt;br /&gt;
&lt;br /&gt;
==Creating Interfaces==&lt;br /&gt;
Do you want your extension to share an interface?  If so, first you should create an ''interface file''.  This file should contain everything your interface needs - this way other authors can easily reference it.  Your interface must inherit the &amp;lt;tt&amp;gt;SMInterface&amp;lt;/tt&amp;gt; class.  It must also declare two global macros that uniquely identify your interface.  It must also implement two functions: &amp;lt;tt&amp;gt;GetInterfaceName&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;GetInterfaceVersion&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The two defines must start with &amp;lt;tt&amp;gt;SMINTERFACE_&amp;lt;/tt&amp;gt; and end with &amp;lt;tt&amp;gt;_NAME&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;_VERSION&amp;lt;/tt&amp;gt; respectively.  The first must be a string and the second must be an unsigned integer.  This integer represents your interface's version number.  While you are free to use it however you please, by default it should be linearly increased.  If you make breaking changes or change the versioning scheme, you must overload the &amp;lt;tt&amp;gt;IsVersionCompat&amp;lt;/tt&amp;gt; function in &amp;lt;tt&amp;gt;SMInterface&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;cpp&amp;gt;#ifndef _INCLUDE_MYINTERFACE_FILE_H_&lt;br /&gt;
#define _INCLUDE_MYINTERFACE_FILE_H_&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;IShareSys.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SMINTERFACE_MYINTERFACE_NAME	&amp;quot;IMyInterface&amp;quot;&lt;br /&gt;
#define SMINTERFACE_MYINTERFACE_VERSION	1&lt;br /&gt;
&lt;br /&gt;
class IMyInterface : public SourceMod::SMInterface&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	virtual const char *GetInterfaceName()&lt;br /&gt;
	{&lt;br /&gt;
		return SMINTERFACE_MYINTERFACE_NAME;&lt;br /&gt;
	}&lt;br /&gt;
	virtual unsigned int GetInterfaceVersion()&lt;br /&gt;
	{&lt;br /&gt;
		return SMINTERFACE_MYINTERFACE_VERSION;&lt;br /&gt;
	}&lt;br /&gt;
public:&lt;br /&gt;
	/**&lt;br /&gt;
	 * @brief This function does nothing.&lt;br /&gt;
	 */&lt;br /&gt;
	virtual void DoNothingAtAll() =0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#endif //_INCLUDE_MYINTERFACE_FILE_H_&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notice, of course, that our interface is ''pure virtual''.  This means it must be implemented in the extension.  Assuming you know C++, this should be fairly straight forward, so let's skip right to how to add this interface to the SourceMod shared system:&lt;br /&gt;
&amp;lt;cpp&amp;gt;bool Sample::SDK_OnLoad(char *error, size_t err_max, bool late)&lt;br /&gt;
{&lt;br /&gt;
	sharesys-&amp;gt;AddInterface(myself, &amp;amp;g_MyInterface);&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
''Note: We do this in &amp;lt;tt&amp;gt;SDK_OnLoad()&amp;lt;/tT&amp;gt; instead of &amp;lt;tt&amp;gt;SDK_OnAllLoaded()&amp;lt;/tt&amp;gt;.  Otherwise, an extension might try to search for your interface during &amp;lt;tt&amp;gt;SDK_OnAllLoaded()&amp;lt;/tt&amp;gt;, and it might fail depending on the load order.''&lt;br /&gt;
&lt;br /&gt;
That simple?  Yup!  Now other extensions can use your interface.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Using Interfaces/Other Extensions=&lt;br /&gt;
There are a variety of interfaces that are available, but not loaded by default in the Extension SDK.  These interfaces can be retrieved and used in your extension.&lt;br /&gt;
&lt;br /&gt;
==Core Interfaces==&lt;br /&gt;
If they are provided by Core, getting them is very simple.  Many interfaces can simply be uncommented in &amp;lt;tt&amp;gt;smsdk_config.h&amp;lt;/tt&amp;gt; and they will become usable.  See the &amp;quot;Available Interfaces&amp;quot; list below for the exposure list.&lt;br /&gt;
&lt;br /&gt;
Otherwise, most of the &amp;lt;tt&amp;gt;.h&amp;lt;/tt&amp;gt; interface files in the root of the &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt; folder in the SDK are Core interfaces.  For example, code to use the IPluginManager interface might look like this:&lt;br /&gt;
&amp;lt;cpp&amp;gt;#include &amp;lt;IPluginSys.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IPluginManager *g_pPlugins = NULL;&lt;br /&gt;
&lt;br /&gt;
bool Sample::SDK_OnLoad(char *error, size_t err_max, bool late)&lt;br /&gt;
{&lt;br /&gt;
	SM_GET_IFACE(PLUGINSYSTEM, g_pPlugins);&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Where did we get &amp;lt;tt&amp;gt;PLUGINSYSTEM&amp;lt;/tt&amp;gt; from?  Observe the two lines in &amp;lt;tt&amp;gt;IPluginSys.h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&amp;lt;cpp&amp;gt;#define SMINTERFACE_PLUGINSYSTEM_NAME		&amp;quot;IPluginManager&amp;quot;&lt;br /&gt;
#define SMINTERFACE_PLUGINSYSTEM_VERSION	1&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;SM_GET_IFACE&amp;lt;/tt&amp;gt; macro uses the text in between the &amp;lt;tt&amp;gt;SMINTERFACE_&amp;lt;/tt&amp;gt; and the &amp;lt;tt&amp;gt;_NAME&amp;lt;/tt&amp;gt; characters.  It also uses the version for compatibility checking.  If it can't find the interface, it automatically prints to the error buffer and returns false.&lt;br /&gt;
&lt;br /&gt;
===Default Interfaces===&lt;br /&gt;
There are interfaces which are grabbed by the Extension SDK by default.  You do not need to query for them on load, or even check if they are valid or not.  They are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;IShareSys&amp;lt;/tt&amp;gt; - Exposed as &amp;lt;tt&amp;gt;sharesys&amp;lt;/tt&amp;gt;, found in &amp;lt;tt&amp;gt;IShareSys.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;HANDLESYSTEM&amp;lt;/tt&amp;gt; - Exposed as &amp;lt;tt&amp;gt;handlesys&amp;lt;/tt&amp;gt;, found in &amp;lt;tt&amp;gt;IHandleSys.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SOURCEMOD&amp;lt;/tt&amp;gt; - Exposed as &amp;lt;tt&amp;gt;g_pSM&amp;lt;/tt&amp;gt;, found in &amp;lt;tt&amp;gt;ISourceMod.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;FORWARDMANAGER&amp;lt;/tt&amp;gt; - Exposed as &amp;lt;tt&amp;gt;forwards&amp;lt;/tt&amp;gt;, found in &amp;lt;tt&amp;gt;IForwardSys.h&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Available Interfaces===&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_FORWARDSYS&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;forwards&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_HANDLESYS&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;handlesys&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_PLAYERHELPERS&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;playerhelpers&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_DBMANAGER&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;dbi&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_GAMECONF&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;gameconfs&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_MEMUTILS&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;memutils&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_GAMEHELPERS&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;gamehelpers&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_TIMERSYS&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;timersys&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SMEXT_ENABLE_THREADER&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;threader&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Interfaces==&lt;br /&gt;
The situation changes if your extension requires ''another extension'', since extensions may load in a completely random order.  The first step is to mark the other extension as a dependency.  Let's say you want to use the &amp;lt;tt&amp;gt;IThreader.h&amp;lt;/tt&amp;gt; interfaces from &amp;lt;tt&amp;gt;threader.ext.dll&amp;lt;/tt&amp;gt;.  First, we declare it as such:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;bool Sample::SDK_OnLoad(char *error, size_t err_max, bool late)&lt;br /&gt;
{&lt;br /&gt;
	sharesys-&amp;gt;AddDependency(myself, &amp;quot;thread.ext&amp;quot;, true, true);&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two boolean parameters to &amp;lt;tt&amp;gt;AddDependency&amp;lt;/tt&amp;gt; mean, respectively: &amp;quot;try to automatically load this extension&amp;quot; and &amp;quot;this extension cannot work without the dependency.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Second, we query for the interface in &amp;lt;tt&amp;gt;SDK_OnAllLoaded&amp;lt;/tt&amp;gt;.  Since we don't know when &amp;lt;tt&amp;gt;thread.ext&amp;lt;/tt&amp;gt; will actually be loaded, we have to wait until everything is definitely loaded.&lt;br /&gt;
&amp;lt;cpp&amp;gt;IThreader *g_pThreader = NULL;&lt;br /&gt;
/* ... */&lt;br /&gt;
void Sample::SDK_OnAllLoaded()&lt;br /&gt;
{&lt;br /&gt;
	SM_GET_LATE_IFACE(THREADER, g_pThreader);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Third, we need to find a way to fail if this interface was never found.  The way to do this is by uncommenting &amp;lt;tt&amp;gt;QueryRunning&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;extension.h&amp;lt;/tt&amp;gt; and implementing it:&lt;br /&gt;
&amp;lt;cpp&amp;gt;bool Sample::QueryRunning(char *error, size_t err_max)&lt;br /&gt;
{&lt;br /&gt;
	SM_CHECK_IFACE(THREADER, g_pThreader);&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When SourceMod queries your extension, the macro above will either validate the pointer or return false.  If it returns false, SourceMod marks your extension as failed.&lt;br /&gt;
&lt;br /&gt;
==Caveats==&lt;br /&gt;
===NULL Interfaces===&lt;br /&gt;
There are a few ways that external interfaces can make your code complicated.  The first is simple but a common oversight.  Don't assume interfaces will be okay.  For example, say we want to create a thread once we get the &amp;lt;tt&amp;gt;IThreader&amp;lt;/tt&amp;gt; interface.  Our code should something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;void Sample::SDK_OnAllLoaded()&lt;br /&gt;
{&lt;br /&gt;
	SM_GET_IFACE(THREADER, g_pThreader);&lt;br /&gt;
	&lt;br /&gt;
	if (QueryRunning(NULL, 0))&lt;br /&gt;
	{&lt;br /&gt;
		g_pThreader-&amp;gt;MakeThread(/* stuff */);&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we ''query ourself'' in order to find if it's safe to continue executing code.  We could also have simply checked if &amp;lt;tt&amp;gt;g_pThreader&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt;, but self-querying has a bonus: if your extension continues to do things like hook events or add listeners, you will be preventing your extension from entirely initializing itself while one interface is bad.  Always make sure you have sanity checks like this where needed.&lt;br /&gt;
&lt;br /&gt;
===Dynamic Unloading===&lt;br /&gt;
The second major caveat is that extensions can be dynamically unloaded.  If you specified yourself as having a dependency and that each dependency is required, you will have no problem.  Your extension will be unloaded before the interface is removed, and you can clean up memory/hooks in your &amp;lt;tt&amp;gt;SDK_OnUnload()&amp;lt;/tt&amp;gt; code.  There are two situations where this is a different story.&lt;br /&gt;
&lt;br /&gt;
====Optional Interfaces====&lt;br /&gt;
The first situation is if you are not requiring an extension that contains an interface.  Now, when the extension unloads, your extension will not be unloaded first.  This creates a small problem, as you must clean up without being unloaded.  There are two functions you can implement in your extension class to resolve this, both documented in &amp;lt;tt&amp;gt;IExtensionSys.h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
*&amp;lt;tt&amp;gt;QueryInterfaceDrop&amp;lt;/tt&amp;gt; - Allows you to request unloading when a specific interface is unloaded.  This is the default behavior for all interfaces.  If you want to block this functionality, continue reading.&lt;br /&gt;
*&amp;lt;tt&amp;gt;NotifyInterfaceDrop&amp;lt;/tt&amp;gt; - This is called when an interface is dropped.  If your plugin will not be unloaded, you can use this to clean up any resources on a specific interface being removed.&lt;br /&gt;
&lt;br /&gt;
====Circular Dependencies====&lt;br /&gt;
The second situation is a bit more complicated.  It is possible for two extensions to have circular dependencies.  For example:&lt;br /&gt;
*Extension &amp;quot;A&amp;quot; requires extension &amp;quot;B.&amp;quot;&lt;br /&gt;
*Extension &amp;quot;B&amp;quot; requires extension &amp;quot;A.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If either extension is unloaded, the opposite extension is unloaded normally.  The first extension then receives the interface drop callbacks.  In this situation, it is essential that the &amp;lt;tt&amp;gt;NotifyInterfaceDrop&amp;lt;/tt&amp;gt; function be implemented and used with the circular interface.  Otherwise, you risk crashing when your extension unloads (or at the very least, leaking memory).  Since the actual drop order is undefined, it means both extensions must implement this function to be safe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Automatic Loading=&lt;br /&gt;
There are two types of automatic loading: Dynamic and Global.  Dynamic loading means your extension is only loaded when a plugin requires it.  Global loading means your extension loads no matter what.&lt;br /&gt;
&lt;br /&gt;
==Dynamic Autoloading==&lt;br /&gt;
Dynamic loading requires that you create an include file for plugins.  Plugins that include your file will automatically load your extension.  This requires implementing the &amp;lt;tt&amp;gt;Extension&amp;lt;/tt&amp;gt; structure found in &amp;lt;tt&amp;gt;core.inc&amp;lt;/tt&amp;gt;.  You must expose the structure as &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt;, and the name must start with &amp;quot;&amp;lt;tt&amp;gt;__ext_&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;/**&lt;br /&gt;
 * Do not edit below this line!&lt;br /&gt;
 */&lt;br /&gt;
public Extension:__ext_geoip = &lt;br /&gt;
{&lt;br /&gt;
	name = &amp;quot;GeoIP&amp;quot;,&lt;br /&gt;
	file = &amp;quot;geoip.ext&amp;quot;,&lt;br /&gt;
#if defined AUTOLOAD_EXTENSIONS&lt;br /&gt;
	autoload = 1,&lt;br /&gt;
#else&lt;br /&gt;
	autoload = 0,&lt;br /&gt;
#endif&lt;br /&gt;
#if defined REQUIRE_EXTENSIONS&lt;br /&gt;
	required = 1,&lt;br /&gt;
#else&lt;br /&gt;
	required = 0,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explanations:&lt;br /&gt;
*&amp;lt;b&amp;gt;name&amp;lt;/b&amp;gt;: The name of your module as written in &amp;lt;tt&amp;gt;SMEXT_CONF_NAME&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;b&amp;gt;file&amp;lt;/b&amp;gt;: The platform-inspecific portion of your extension's file name.&lt;br /&gt;
*&amp;lt;b&amp;gt;autoload&amp;lt;/b&amp;gt;: Specifies that your module should always dynamically autoload by default.  You can tweak this to either never autoload or always autoload (without letting the user toggle).&lt;br /&gt;
*&amp;lt;b&amp;gt;required&amp;lt;/b&amp;gt;: Specifies whether or not this extension is '''required''' by your plugin.  If for some reason your extension fails to load (or is not found), the plugin will also fail to load.  This is changeable if you wish to override the default behavior.&lt;br /&gt;
&lt;br /&gt;
You can copy and paste this example, but remember to modify the following portions:&lt;br /&gt;
*&amp;lt;b&amp;gt;__ext_geoip&amp;lt;/b&amp;gt;: Change the &amp;quot;geoip&amp;quot; portion to your own unique variable name.&lt;br /&gt;
*&amp;lt;b&amp;gt;&amp;quot;GeoIP&amp;lt;/b&amp;gt;: Change the GeoIP portion to your extension's name.  This should match the name you chose as &amp;lt;tt&amp;gt;SMEXT_CONF_NAME&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;b&amp;gt;&amp;quot;geoip.ext&amp;quot;&amp;lt;/b&amp;gt;: Change this to your extension's file name, without the .dll/.so portion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Global Autoloading==&lt;br /&gt;
To have your extension always autoload, you must create a ''.autoload'' file in the &amp;lt;tt&amp;gt;extensions&amp;lt;/tt&amp;gt; folder.  For example, to have the &amp;lt;tt&amp;gt;threader.ext.dll&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;threader.ext.so&amp;lt;/tt&amp;gt; extensions autoload, you'd create the following file in &amp;lt;tt&amp;gt;extensions&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;threader.autoload&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A few notes:&lt;br /&gt;
*This only works for extensions using the .ext.&amp;lt;platform&amp;gt; convention.  SourceMod cuts off the &amp;quot;.autoload&amp;quot; portion of the file, then adds on &amp;quot;.ext.dll&amp;quot; or &amp;quot;.ext.so&amp;quot; which will not work on custom files.&lt;br /&gt;
*The file does not need to contain anything, it simply needs to exist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Conventions=&lt;br /&gt;
&lt;br /&gt;
==Designing API/Natives==&lt;br /&gt;
*Start interface names with the capital letter 'I'.&lt;br /&gt;
*Use a consistent naming convention.  SourceMod uses [http://msdn2.microsoft.com/en-us/library/ms229002.aspx Microsoft/Pascal] naming.  Avoid Java/Camel casing for both API and natives.&lt;br /&gt;
*When exposing interfaces, make sure your exposure defines start with &amp;lt;tt&amp;gt;SMINTERFACE_&amp;lt;/tt&amp;gt; and end with &amp;lt;tt&amp;gt;_NAME&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;_VERSION&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Naming==&lt;br /&gt;
*Logtags (&amp;lt;tt&amp;gt;SMEXT_CONF_LOGTAG&amp;lt;/tt&amp;gt;) should be short names (under 10 characters or so) in all capital letters.&lt;br /&gt;
*Your extension file name should never have &amp;lt;tt&amp;gt;_i486&amp;lt;/tt&amp;gt; or other unnecessary platform-specific notations in its name.&lt;br /&gt;
*Your extension file name should always end in &amp;lt;tt&amp;gt;.ext.so&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;.ext.dll&amp;lt;/tt&amp;gt; depending on the platform.  The &amp;lt;tt&amp;gt;.ext.&amp;lt;/tt&amp;gt; is SourceMod convention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Setting up Visual Studio=&lt;br /&gt;
==Paths==&lt;br /&gt;
'''Visual Studio 2003''': Tools -&amp;gt; Options -&amp;gt; Projects, VC++ Directories&lt;br /&gt;
&lt;br /&gt;
'''Visual Studio 2005''': Tools -&amp;gt; Options -&amp;gt; Projects and Solutions -&amp;gt; VC++ Directories&lt;br /&gt;
&lt;br /&gt;
===Include Paths===&lt;br /&gt;
*SourceMod only:&lt;br /&gt;
**sdk\public\extensions&lt;br /&gt;
**sdk\public\sourcepawn&lt;br /&gt;
**sdk\public&lt;br /&gt;
*SourceMM (Note that sourcemm might be 'trunk' for you):&lt;br /&gt;
**sourcemm\sourcemm&lt;br /&gt;
**sourcemm\sourcehook&lt;br /&gt;
**sourcemm&lt;br /&gt;
*HL2SDK:&lt;br /&gt;
**game_shared&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;
**public&lt;br /&gt;
**dlls&lt;br /&gt;
&lt;br /&gt;
===Link Paths===&lt;br /&gt;
*HL2SDK:&lt;br /&gt;
**lib\public for version 2005&lt;br /&gt;
**lib-vc7\public for version 2003&lt;br /&gt;
&lt;br /&gt;
==Compiler Options==&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; These options are set by default in the sample Extension SDK.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; These options should be set for every build (Release/Debug/others).&lt;br /&gt;
&lt;br /&gt;
*General&lt;br /&gt;
**&amp;lt;tt&amp;gt;Character Set&amp;lt;/tt&amp;gt;: '''Use Multi-Byte Character Set'''&lt;br /&gt;
*C/C++&lt;br /&gt;
**General&lt;br /&gt;
***&amp;lt;tt&amp;gt;Detect 64-bit Portability Issues&amp;lt;/tt&amp;gt;: '''No'''&lt;br /&gt;
**Preprocessor&lt;br /&gt;
***&amp;lt;tt&amp;gt;Preprocessor Defines&amp;lt;/tt&amp;gt;: Add &amp;lt;tt&amp;gt;_CRT_SECURE_NO_DEPRECATE&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;_CRT_NONSTDC_NO_DEPRECATE&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SOURCEMOD_BUILD&amp;lt;/tt&amp;gt;&lt;br /&gt;
**Code Generation&lt;br /&gt;
***&amp;lt;tt&amp;gt;Runtime Library&amp;lt;/tt&amp;gt;: Multi-threaded or /MT (for Release), Multi-threaded Debug or /MTd (for Debug)&lt;br /&gt;
*Linker&lt;br /&gt;
**General&lt;br /&gt;
***&amp;lt;tt&amp;gt;Output File&amp;lt;/tt&amp;gt;: Change &amp;lt;tt&amp;gt;$(ProjectName)&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;$(ProjectName).ext&amp;lt;/tt&amp;gt;, or use your own custom string.&lt;br /&gt;
**Input&lt;br /&gt;
***&amp;lt;tt&amp;gt;Additional Dependencies&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;tier0.lib tier1.lib vstdlib.lib&amp;lt;/tt&amp;gt; (for SourceMM attached extensions only)&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>PRED*</name></author>
		
	</entry>
</feed>