<?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=Pheadxdll</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=Pheadxdll"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/Pheadxdll"/>
	<updated>2026-04-18T10:27:02Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Development&amp;diff=10032</id>
		<title>Category:SourceMod Development</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:SourceMod_Development&amp;diff=10032"/>
		<updated>2015-10-06T21:12:44Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This category contains articles about developing for SourceMod extensions.  [[:Category:SourceMod_Scripting|Click here for the scripting category]].&lt;br /&gt;
&lt;br /&gt;
==Scripting==&lt;br /&gt;
*[[:Category:SourceMod_Scripting|Scripting Tutorials]]&lt;br /&gt;
*[https://sm.alliedmods.net/new-api/ Scripting Reference]&lt;br /&gt;
&lt;br /&gt;
==Introductions==&lt;br /&gt;
*[[SourceMod SDK]]&lt;br /&gt;
*[[Writing Extensions]]&lt;br /&gt;
*[[Writing Extensions from Metamod:Source Plugins]]&lt;br /&gt;
*[http://docs.sourcemod.net/dox Doxygen of SourceMod API]&lt;br /&gt;
&lt;br /&gt;
==Detailed Tutorials==&lt;br /&gt;
*[[Admin API (SourceMod)|Administration API]]&lt;br /&gt;
*[[Compiling SourceMod]]&lt;br /&gt;
*[[Handle API (SourceMod)|Handle System API]]&lt;br /&gt;
*[[Menu API (SourceMod)|Menu System API]]&lt;br /&gt;
*[[Natives (SourceMod Development)|Writing Native Functions]]&lt;br /&gt;
*[[Finding Virtual Offsets]]&lt;br /&gt;
&lt;br /&gt;
==Resources==&lt;br /&gt;
&lt;br /&gt;
*[[Virtual_Offsets_(Source_Mods)|Virtual Offsets List]]&lt;br /&gt;
*[[Entity Properties]]&lt;br /&gt;
*[[Game Events (Source)|Game Events]]&lt;br /&gt;
*[[Mod TempEnt List (Source)|Temporary Entity Lists]]&lt;br /&gt;
*[[Useful Signatures (Source)|Useful Signatures]]&lt;br /&gt;
*[[:Category:Metamod:Source Development|Metamod:Source Development]]&lt;br /&gt;
*[[:Category:Game_Resources|Mod Specific Resources]]&lt;br /&gt;
*[[User_Messages|User Messages]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod]]&lt;/div&gt;</summary>
		<author><name>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Item_Definition_Indexes&amp;diff=7848</id>
		<title>Team Fortress 2 Item Definition Indexes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Item_Definition_Indexes&amp;diff=7848"/>
		<updated>2010-09-13T04:08:14Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of the item definition indexes in TF2, these are useful for distinguishing an unlockable weapon from its original (for example: The Backburner from an ordinary Flamethrower.)&lt;br /&gt;
&lt;br /&gt;
This list is divided in to Weapons, Hats and Crafting Items.&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pawn&amp;gt;SetEntProp(edict, Prop_Send, &amp;quot;m_iItemDefinitionIndex&amp;quot;, index);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weapons ==&lt;br /&gt;
&lt;br /&gt;
These are all of the weapons currently in TF2 and their item definition indexes.&lt;br /&gt;
&lt;br /&gt;
'''0''' - Bat&amp;lt;br&amp;gt;&lt;br /&gt;
'''1''' - Bottle&amp;lt;br&amp;gt;&lt;br /&gt;
'''2''' - Fire Axe&amp;lt;br&amp;gt;&lt;br /&gt;
'''3''' - Kukri&amp;lt;br&amp;gt;&lt;br /&gt;
'''4''' - Knife&amp;lt;br&amp;gt;&lt;br /&gt;
'''5''' - Fists&amp;lt;br&amp;gt;&lt;br /&gt;
'''6''' - Shovel&amp;lt;br&amp;gt;&lt;br /&gt;
'''7''' - Wrench&amp;lt;br&amp;gt;&lt;br /&gt;
'''8''' - Bonesaw&amp;lt;br&amp;gt;&lt;br /&gt;
'''9''' - Engineer's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''10''' - Soldier's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''11''' - Heavy's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''12''' - Pyro's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''13''' - Scattergun&amp;lt;br&amp;gt;&lt;br /&gt;
'''14''' - Sniper Rifle&amp;lt;br&amp;gt;&lt;br /&gt;
'''15''' - Minigun&amp;lt;br&amp;gt;&lt;br /&gt;
'''16''' - SMG&amp;lt;br&amp;gt;&lt;br /&gt;
'''17''' - Syringe Gun&amp;lt;br&amp;gt;&lt;br /&gt;
'''18''' - Rocket Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''19''' - Pipe Grenade Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''20''' - Sticky Bomb Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''21''' - Flamethrower&amp;lt;br&amp;gt;&lt;br /&gt;
'''22''' - Engineer's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''23''' - Scout's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''24''' - Spy's Revolver&amp;lt;br&amp;gt;&lt;br /&gt;
'''25''' - Builder PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''26''' - Demolisher PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''27''' - Disguise Kit PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''29''' - Medigun&amp;lt;br&amp;gt;&lt;br /&gt;
'''30''' - Cloak Watch&amp;lt;br&amp;gt;&lt;br /&gt;
'''35''' - The Kritzkrieg&amp;lt;br&amp;gt;&lt;br /&gt;
'''36''' - The Blutsauger&amp;lt;br&amp;gt;&lt;br /&gt;
'''37''' - The Ubersaw&amp;lt;br&amp;gt;&lt;br /&gt;
'''38''' - The Axtinguisher&amp;lt;br&amp;gt;&lt;br /&gt;
'''39''' - The Flaregun&amp;lt;br&amp;gt;&lt;br /&gt;
'''40''' - The Backburner&amp;lt;br&amp;gt;&lt;br /&gt;
'''41''' - Natascha&amp;lt;br&amp;gt;&lt;br /&gt;
'''42''' - Sandvich&amp;lt;br&amp;gt;&lt;br /&gt;
'''43''' - The Killer Gloves Of Boxing&amp;lt;br&amp;gt;&lt;br /&gt;
'''44''' - Sandman (Wooden Bat)&amp;lt;br&amp;gt;&lt;br /&gt;
'''45''' - Force-A-Nature&amp;lt;br&amp;gt;&lt;br /&gt;
'''46''' - Bonk! Atomic Punch&amp;lt;br&amp;gt;&lt;br /&gt;
'''56''' - Huntsman&amp;lt;br&amp;gt;&lt;br /&gt;
'''57''' - Razorback&amp;lt;br&amp;gt;&lt;br /&gt;
'''58''' - Jarate&amp;lt;br&amp;gt;&lt;br /&gt;
'''59''' - Dead Ringer&amp;lt;br&amp;gt;&lt;br /&gt;
'''60''' - Cloak And Dagger&amp;lt;br&amp;gt;&lt;br /&gt;
'''61''' - The Ambassador&amp;lt;br&amp;gt;&lt;br /&gt;
'''127''' - The Direct Hit&amp;lt;br&amp;gt;&lt;br /&gt;
'''128''' - The Equalizer&amp;lt;br&amp;gt;&lt;br /&gt;
'''129''' - The Buff Banner&amp;lt;br&amp;gt;&lt;br /&gt;
'''130''' - The Scottish Resistance&amp;lt;br&amp;gt;&lt;br /&gt;
'''131''' - Chargin' Targe&amp;lt;br&amp;gt;&lt;br /&gt;
'''132''' - The Eyelander&amp;lt;br&amp;gt;&lt;br /&gt;
'''133''' - The Gunboats&amp;lt;br&amp;gt;&lt;br /&gt;
'''140''' - The Wrangler&amp;lt;br&amp;gt;&lt;br /&gt;
'''141''' - The Frontier Justice&amp;lt;br&amp;gt;&lt;br /&gt;
'''142''' - The Gunslinger&amp;lt;br&amp;gt;&lt;br /&gt;
'''153''' - Homewrecker&amp;lt;br&amp;gt;&lt;br /&gt;
'''154''' - Pain Train&amp;lt;br&amp;gt;&lt;br /&gt;
'''155''' - The Southern Hospitality&amp;lt;br&amp;gt;&lt;br /&gt;
'''159''' - Dalokohs Bar&amp;lt;br&amp;gt;&lt;br /&gt;
'''160''' - Lugermorph&amp;lt;br&amp;gt;&lt;br /&gt;
'''161''' - Big Kill&amp;lt;br&amp;gt;&lt;br /&gt;
'''163''' - Crit-a-Cola&amp;lt;br&amp;gt;&lt;br /&gt;
'''169''' - Golden Wrench&amp;lt;br&amp;gt;&lt;br /&gt;
'''171''' - Tribalman's Shiv&amp;lt;br&amp;gt;&lt;br /&gt;
'''172''' - Scotsman's Skullcutter&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hats ==&lt;br /&gt;
&lt;br /&gt;
These are all of the hats and wearables available in the game.&lt;br /&gt;
&lt;br /&gt;
'''47''' - Demoman's 'Fro&amp;lt;br&amp;gt;&lt;br /&gt;
'''48''' - Mining Light&amp;lt;br&amp;gt;&lt;br /&gt;
'''49''' - Football Helmet&amp;lt;br&amp;gt;&lt;br /&gt;
'''50''' - Prussian Pickelhaube&amp;lt;br&amp;gt;&lt;br /&gt;
'''51''' - Pyro's Beanie&amp;lt;br&amp;gt;&lt;br /&gt;
'''52''' - Batter's Helmet&amp;lt;br&amp;gt;&lt;br /&gt;
'''53''' - Trophy Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''54''' - Soldier's Stash&amp;lt;br&amp;gt;&lt;br /&gt;
'''55''' - Fancy Fedora&amp;lt;br&amp;gt;&lt;br /&gt;
'''94''' - Texas Ten Gallon&amp;lt;br&amp;gt;&lt;br /&gt;
'''95''' - Engineer's Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''96''' - Officer's Ushanka&amp;lt;br&amp;gt;&lt;br /&gt;
'''97''' - Tough Guy's Tuque&amp;lt;br&amp;gt;&lt;br /&gt;
'''98''' - Stainless Pot&amp;lt;br&amp;gt;&lt;br /&gt;
'''99''' - Tyrant's Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''100''' - Glengarry Bonnet&amp;lt;br&amp;gt;&lt;br /&gt;
'''101''' - Vintage Tyrolean&amp;lt;br&amp;gt;&lt;br /&gt;
'''102''' - Respectless Rubber Glove&amp;lt;br&amp;gt;&lt;br /&gt;
'''103''' - Camera Beard&amp;lt;br&amp;gt;&lt;br /&gt;
'''104''' - Otolaryngologist's Mirror&amp;lt;br&amp;gt;&lt;br /&gt;
'''105''' - Brigade Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''106''' - Bonk Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''107''' - Ye Olde Baker Boy&amp;lt;br&amp;gt;&lt;br /&gt;
'''108''' - Backbiter's Billycock&amp;lt;br&amp;gt;&lt;br /&gt;
'''109''' - Professional's Panama&amp;lt;br&amp;gt;&lt;br /&gt;
'''110''' - Master's Yellow Belt&amp;lt;br&amp;gt;&lt;br /&gt;
'''111''' - Baseball Bill's Sports Shine (Hatless Scout)&amp;lt;br&amp;gt;&lt;br /&gt;
'''115''' - Halloween Hat (Only appears on Halloween)&amp;lt;br&amp;gt;&lt;br /&gt;
'''116''' - Ghastly Gibus&amp;lt;br&amp;gt;&lt;br /&gt;
'''117''' - Ritzy Rick's Hair Fixative (Hatless Sniper)&amp;lt;br&amp;gt;&lt;br /&gt;
'''118''' - Texas Slim's Dome Shine (Hatless Engineer)&amp;lt;br&amp;gt;&lt;br /&gt;
'''120''' - Scottsman's Stove Pipe&amp;lt;br&amp;gt;&lt;br /&gt;
'''121''' - Service Medal&amp;lt;br&amp;gt;&lt;br /&gt;
'''125''' - Cheater's Lament&amp;lt;br&amp;gt;&lt;br /&gt;
'''126''' - Bill's Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''134''' - J.Axer's Dapper Topper&amp;lt;br&amp;gt;&lt;br /&gt;
'''135''' - Towering Pillar of Hats&amp;lt;br&amp;gt;&lt;br /&gt;
'''136''' - Amber's Rad As All Hell Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''137''' - Noble Amassment of Hats&amp;lt;br&amp;gt;&lt;br /&gt;
'''138''' - Uncle Sam&amp;lt;br&amp;gt;&lt;br /&gt;
'''139''' - Modest Pile of Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''143''' - Earbuds&amp;lt;br&amp;gt;&lt;br /&gt;
'''144''' - Physician's Procedure Mask&amp;lt;br&amp;gt;&lt;br /&gt;
'''145''' - Hound Dog&amp;lt;br&amp;gt;&lt;br /&gt;
'''146''' - Hustler's Hallmark&amp;lt;br&amp;gt;&lt;br /&gt;
'''147''' - Magistrate's Mullet&amp;lt;br&amp;gt;&lt;br /&gt;
'''148''' - Hotrod&amp;lt;br&amp;gt;&lt;br /&gt;
'''150''' - Troublemaker's Tossle Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''151''' - Triboniophorus Tyrannus&amp;lt;br&amp;gt;&lt;br /&gt;
'''152''' - Killer's Kabuto&amp;lt;br&amp;gt;&lt;br /&gt;
'''158''' - Shooter's Sola Topi&amp;lt;br&amp;gt;&lt;br /&gt;
'''162''' - Max's Severed Head&amp;lt;br&amp;gt;&lt;br /&gt;
'''164''' - Grizzled Veteran&amp;lt;br&amp;gt;&lt;br /&gt;
'''165''' - Soldier of Fortune&amp;lt;br&amp;gt;&lt;br /&gt;
'''166''' - Mercenary&amp;lt;br&amp;gt;&lt;br /&gt;
'''170''' - Primeval Warrior&amp;lt;br&amp;gt;&lt;br /&gt;
'''174''' - Whoopee Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''175''' - Whiskered Gentleman&amp;lt;br&amp;gt;&lt;br /&gt;
'''177''' - Ze Goggles&amp;lt;br&amp;gt;&lt;br /&gt;
'''178''' - Safe'n'Sound&amp;lt;br&amp;gt;&lt;br /&gt;
'''179''' - Tippler's Tricorne&amp;lt;br&amp;gt;&lt;br /&gt;
'''180''' - Frenchman's Beret&amp;lt;br&amp;gt;&lt;br /&gt;
'''181''' - Bloke's Bucket Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''182''' - Vintage Merryweather&amp;lt;br&amp;gt;&lt;br /&gt;
'''183''' - Sergeant's Drill Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''184''' - Gentleman's Gatsby&amp;lt;br&amp;gt;&lt;br /&gt;
'''185''' - Heavy Duty Rag&amp;lt;br&amp;gt;&lt;br /&gt;
'''189''' - Alien Swarm Parasite&amp;lt;br&amp;gt;&lt;br /&gt;
'''240''' - Lumbricus Lid&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Craft Items ==&lt;br /&gt;
&lt;br /&gt;
These are the items obtained and used primarily through crafting.&lt;br /&gt;
&lt;br /&gt;
'''5000''' - Scrap Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5001''' - Reclaimed Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5002''' - Refined Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5003''' - Scout Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5004''' - Sniper Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5005''' - Soldier Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5006''' - Demoman Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5007''' - Heavy Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5008''' - Medic Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5009''' - Pyro Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5010''' - Spy Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5011''' - Engineer Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5012''' - Primary Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5013''' - Secondary Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5014''' - Melee Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5015''' - Grenade Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5016''' - Building Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5017''' - PDA Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5018''' - PDA2 Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5019''' - Head Slot Token&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Events&amp;diff=7793</id>
		<title>Team Fortress 2 Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Events&amp;diff=7793"/>
		<updated>2010-08-03T14:50:00Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:''Refer back to [[Game Events (Source)]] for more events.''&lt;br /&gt;
=== intro_finish ===&lt;br /&gt;
{{begin-hl2msg|intro_finish|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== intro_nextcamera ===&lt;br /&gt;
{{begin-hl2msg|intro_nextcamera|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_changeclass ===&lt;br /&gt;
{{qnotice|When a player changes their class}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_changeclass|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID who changed class}}&lt;br /&gt;
{{hl2msg|short|class|class that they changed to}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_death ===&lt;br /&gt;
{{qnotice|When a player dies}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_death|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID who died}}&lt;br /&gt;
{{hl2msg|long|victim_entindex|}}&lt;br /&gt;
{{hl2msg|long|inflictor_entindex|ent index of inflictor (a sentry, for example)}}&lt;br /&gt;
{{hl2msg|short|attacker|user ID who killed}}&lt;br /&gt;
{{hl2msg|string|weapon|weapon name killer used}}&lt;br /&gt;
{{hl2msg|short|weaponid|ID of weapon killed used}}&lt;br /&gt;
{{hl2msg|long|damagebits|bits of type of damage}}&lt;br /&gt;
{{hl2msg|short|customkill|type of custom kill}}&lt;br /&gt;
{{hl2msg|short|assister|user ID of assister}}&lt;br /&gt;
{{hl2msg|string|weapon_logclassname|weapon name that should be printed on the log}}&lt;br /&gt;
{{hl2msg|short|stun_flags|victim's stun flags at the moment of death}}&lt;br /&gt;
{{hl2msg|short|death_flags|death flags.}}&lt;br /&gt;
{{hl2msg|short|dominated|did killer dominate victim with this kill}}&lt;br /&gt;
{{hl2msg|short|assister_dominated|did assister dominate victim with this kill}}&lt;br /&gt;
{{hl2msg|short|revenge|did killer get revenge on victim with this kill}}&lt;br /&gt;
{{hl2msg|short|assister_revenge|did assister get revenge on victim with this kill}}&lt;br /&gt;
{{hl2msg|bool|first_blood|was this a first blood kill}}&lt;br /&gt;
{{hl2msg|bool|feign_death|the victim is feign death}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== object_removed ===&lt;br /&gt;
{{begin-hl2msg|object_removed|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID of the object owner}}&lt;br /&gt;
{{hl2msg|short|objecttype|type of object removed}}&lt;br /&gt;
{{hl2msg|short|index|index of the object removed}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== object_destroyed ===&lt;br /&gt;
{{qnotice|When a player destroys an object}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|object_destroyed|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID who died}}&lt;br /&gt;
{{hl2msg|short|attacker|user ID who killed}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|assister|user ID of assister}}&lt;br /&gt;
{{hl2msg|string|weapon|weapon name killer used}}&lt;br /&gt;
{{hl2msg|short|weaponid|id of the weapon used}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|objecttype|type of object destroyed}}&lt;br /&gt;
{{hl2msg|short|index|index of the object destroyed}}&lt;br /&gt;
{{hl2msg|bool|was_building|object was being built when it died}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== tf_map_time_remaining ===&lt;br /&gt;
{{begin-hl2msg|tf_map_time_remaining|string}}&lt;br /&gt;
{{hl2msg|long|seconds|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== tf_game_over ===&lt;br /&gt;
{{qnotice|When a tf game ends}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|tf_game_over|string}}&lt;br /&gt;
{{hl2msg|string|reason|why the game is over ( timelimit, winlimit )}}&lt;br /&gt;
&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== ctf_flag_captured ===&lt;br /&gt;
{{qnotice|When a flag is captured by a player}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|ctf_flag_captured|string}}&lt;br /&gt;
{{hl2msg|short|capping_team|}}&lt;br /&gt;
{{hl2msg|short|capping_team_score|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_initialized ===&lt;br /&gt;
{{qnotice|When a player begins to capture a control point}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|controlpoint_initialized|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_updateimages ===&lt;br /&gt;
{{begin-hl2msg|controlpoint_updateimages|string}}&lt;br /&gt;
{{hl2msg|short|index|index of the cap being updated}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_updatelayout ===&lt;br /&gt;
{{begin-hl2msg|controlpoint_updatelayout|string}}&lt;br /&gt;
{{hl2msg|short|index|index of the cap being updated}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_updatecapping ===&lt;br /&gt;
{{begin-hl2msg|controlpoint_updatecapping|string}}&lt;br /&gt;
{{hl2msg|short|index|index of the cap being updated}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_updateowner ===&lt;br /&gt;
{{begin-hl2msg|controlpoint_updateowner|string}}&lt;br /&gt;
{{hl2msg|short|index|index of the cap being updated}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_starttouch ===&lt;br /&gt;
{{qnotice|When a player enters a capture point zone}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|controlpoint_starttouch|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{hl2msg|short|area|index of the control point area}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_endtouch ===&lt;br /&gt;
{{qnotice|When a player leaves a capture point zone}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|controlpoint_endtouch|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{hl2msg|short|area|index of the control point area}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_pulse_element ===&lt;br /&gt;
{{begin-hl2msg|controlpoint_pulse_element|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_fake_capture ===&lt;br /&gt;
{{begin-hl2msg|controlpoint_fake_capture|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{hl2msg|short|int_data|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_fake_capture_mult ===&lt;br /&gt;
{{begin-hl2msg|controlpoint_fake_capture_mult|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{hl2msg|short|int_data|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_round_selected ===&lt;br /&gt;
{{qnotice|When a round is selected.}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_round_selected|string}}&lt;br /&gt;
{{hl2msg|string|round|name of the round selected}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_round_start ===&lt;br /&gt;
{{qnotice|round restart}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|teamplay_round_start|string}}&lt;br /&gt;
{{hl2msg|bool|full_reset|is this a full reset of the map}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_round_active ===&lt;br /&gt;
{{qnotice|called when round is active, players can move}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|teamplay_round_active|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_waiting_begins ===&lt;br /&gt;
{{qnotice|When the &amp;quot;waiting for players&amp;quot; pre-round begins}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_waiting_begins|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_waiting_ends ===&lt;br /&gt;
{{qnotice|When the &amp;quot;waiting for players&amp;quot; pre-round ends}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_waiting_ends|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_waiting_abouttoend ===&lt;br /&gt;
{{qnotice|When the &amp;quot;waiting for players&amp;quot; pre-round is about to end}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_waiting_abouttoend|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_restart_round ===&lt;br /&gt;
{{qnotice|When a round is restarted}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_restart_round|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_ready_restart ===&lt;br /&gt;
{{begin-hl2msg|teamplay_ready_restart|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_round_restart_seconds ===&lt;br /&gt;
{{begin-hl2msg|teamplay_round_restart_seconds|string}}&lt;br /&gt;
{{hl2msg|short|seconds|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_team_ready ===&lt;br /&gt;
{{begin-hl2msg|teamplay_team_ready|string}}&lt;br /&gt;
{{hl2msg|byte|team|which team is ready}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_round_win ===&lt;br /&gt;
{{qnotice|When a team wins a round}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_round_win|string}}&lt;br /&gt;
{{hl2msg|byte|team|which team won the round}}&lt;br /&gt;
{{hl2msg|byte|winreason|the reason the team won}}&lt;br /&gt;
{{hl2msg|short|flagcaplimit|if win reason was flag cap limit, the value of the flag cap limit}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|full_round|was this a full round or a mini-round}}&lt;br /&gt;
{{hl2msg|float|round_time|elapsed time of this round}}&lt;br /&gt;
{{hl2msg|short|losing_team_num_caps|# of caps this round by losing team}}&lt;br /&gt;
{{hl2msg|byte|was_sudden_death|did a team win this after entering sudden death}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_update_timer ===&lt;br /&gt;
{{begin-hl2msg|teamplay_update_timer|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_round_stalemate ===&lt;br /&gt;
{{qnotice|When a game ends in a stalemate}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_round_stalemate|string}}&lt;br /&gt;
{{hl2msg|byte|reason|why the stalemate is occuring}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_overtime_begin ===&lt;br /&gt;
{{qnotice|When an overtime round begins}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_overtime_begin|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_overtime_end ===&lt;br /&gt;
{{qnotice|When an overtime round ends}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_overtime_end|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_suddendeath_begin ===&lt;br /&gt;
{{qnotice|When a sudden death round begins}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_suddendeath_begin|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_suddendeath_end ===&lt;br /&gt;
{{qnotice|When a sudden death round ends}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_suddendeath_end|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_game_over ===&lt;br /&gt;
{{qnotice|When a teamplay game ends}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_game_over|string}}&lt;br /&gt;
{{hl2msg|string|reason|why the game is over ( timelimit, winlimit )}}&lt;br /&gt;
&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_map_time_remaining ===&lt;br /&gt;
{{begin-hl2msg|teamplay_map_time_remaining|string}}&lt;br /&gt;
{{hl2msg|short|seconds|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_broadcast_audio ===&lt;br /&gt;
{{qnotice|Broadcast an audio file.}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_broadcast_audio|string}}&lt;br /&gt;
{{hl2msg|byte|team|which team should hear the broadcast. 0 will make everyone hear it.}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|string|sound|sound to play}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_timer_flash ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|teamplay_timer_flash|string}}&lt;br /&gt;
{{hl2msg|short|time_remaining|how many seconds until the round ends}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_timer_time_added ===&lt;br /&gt;
{{begin-hl2msg|teamplay_timer_time_added|string}}&lt;br /&gt;
{{hl2msg|short|timer|entindex of the timer}}&lt;br /&gt;
{{hl2msg|short|seconds_added|how many seconds were added to the round timer}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_point_startcapture ===&lt;br /&gt;
{{qnotice|When a point is beginning to be captured}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_point_startcapture|string}}&lt;br /&gt;
{{hl2msg|byte|cp|index of the point being captured}}&lt;br /&gt;
{{hl2msg|string|cpname|name of the point}}&lt;br /&gt;
{{hl2msg|byte|team|which team currently owns the point}}&lt;br /&gt;
{{hl2msg|byte|capteam|which team is capping}}&lt;br /&gt;
{{hl2msg|string|cappers|string where each character is a player index of someone capping}}&lt;br /&gt;
{{hl2msg|float|captime|time between when this cap started and when the point last changed hands}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_point_captured ===&lt;br /&gt;
{{qnotice|When a control point is captured by a team}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_point_captured|string}}&lt;br /&gt;
{{hl2msg|byte|cp|index of the point that was captured}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|string|cpname|name of the point}}&lt;br /&gt;
{{hl2msg|byte|team|which team capped}}&lt;br /&gt;
{{hl2msg|string|cappers|string where each character is a player index of someone that capped}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_point_locked ===&lt;br /&gt;
{{begin-hl2msg|teamplay_point_locked|string}}&lt;br /&gt;
{{hl2msg|byte|cp|index of the point being captured}}&lt;br /&gt;
{{hl2msg|string|cpname|name of the point}}&lt;br /&gt;
{{hl2msg|byte|team|which team currently owns the point}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_point_unlocked ===&lt;br /&gt;
{{begin-hl2msg|teamplay_point_unlocked|string}}&lt;br /&gt;
{{hl2msg|byte|cp|index of the point being captured}}&lt;br /&gt;
{{hl2msg|string|cpname|name of the point}}&lt;br /&gt;
{{hl2msg|byte|team|which team currently owns the point}}&lt;br /&gt;
&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_capture_broken ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|teamplay_capture_broken|string}}&lt;br /&gt;
{{hl2msg|byte|cp|}}&lt;br /&gt;
{{hl2msg|string|cpname|}}&lt;br /&gt;
{{hl2msg|float|time_remaining|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_capture_blocked ===&lt;br /&gt;
{{qnotice|When a player blocks the capture of a control point}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_capture_blocked|string}}&lt;br /&gt;
{{hl2msg|byte|cp|index of the point that was blocked}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|string|cpname|name of the point}}&lt;br /&gt;
{{hl2msg|byte|blocker|index of the player that blocked the cap}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_flag_event ===&lt;br /&gt;
{{begin-hl2msg|teamplay_flag_event|string}}&lt;br /&gt;
{{hl2msg|short|player|player this event involves}}&lt;br /&gt;
{{hl2msg|short|carrier|the carrier if needed}}&lt;br /&gt;
{{hl2msg|short|eventtype|pick up, capture, defend, dropped}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_win_panel ===&lt;br /&gt;
{{qnotice|When the win-game panel is displayed}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_win_panel|string}}&lt;br /&gt;
{{hl2msg|byte|panel_style|for client to determine layout}}&lt;br /&gt;
{{hl2msg|byte|winning_team|}}&lt;br /&gt;
{{hl2msg|byte|winreason|the reason the team won}}&lt;br /&gt;
{{hl2msg|string|cappers|string where each character is a player index of someone that capped}}&lt;br /&gt;
{{hl2msg|short|flagcaplimit|if win reason was flag cap limit, the value of the flag cap limit}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|blue_score|red team score}}&lt;br /&gt;
{{hl2msg|short|red_score|blue team score}}&lt;br /&gt;
{{hl2msg|short|blue_score_prev|previous red team score}}&lt;br /&gt;
{{hl2msg|short|red_score_prev|previous blue team score}}&lt;br /&gt;
{{hl2msg|short|round_complete|is this a complete round, or the end of a mini-round}}&lt;br /&gt;
{{hl2msg|short|rounds_remaining|# of rounds remaining for wining team, if mini-round}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|player_1|}}&lt;br /&gt;
{{hl2msg|short|player_1_points|}}&lt;br /&gt;
{{hl2msg|short|player_2|}}&lt;br /&gt;
{{hl2msg|short|player_2_points|}}&lt;br /&gt;
{{hl2msg|short|player_3|}}&lt;br /&gt;
{{hl2msg|short|player_3_points|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_teambalanced_player ===&lt;br /&gt;
{{qnotice|When a player is balanced to another team}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_teambalanced_player|string}}&lt;br /&gt;
{{hl2msg|short|player|entindex of the player}}&lt;br /&gt;
{{hl2msg|byte|team|which team the player is being moved to}}&lt;br /&gt;
&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teamplay_setup_finished ===&lt;br /&gt;
{{qnotice|When the setup round ends}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|teamplay_setup_finished|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== show_freezepanel ===&lt;br /&gt;
{{qnotice|When the death-snapshot panel is shown}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|show_freezepanel|string}}&lt;br /&gt;
{{hl2msg|short|killer|entindex of the killer entity}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== hide_freezepanel ===&lt;br /&gt;
{{qnotice|When the death-snapshot panel is hidden}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|hide_freezepanel|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== freezecam_started ===&lt;br /&gt;
{{qnotice|When a player enters the death-snapshot view}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|freezecam_started|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_changeteam ===&lt;br /&gt;
{{qnotice|When a LAN player changes team}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|localplayer_changeteam|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_score_changed ===&lt;br /&gt;
{{begin-hl2msg|localplayer_score_changed|string}}&lt;br /&gt;
{{hl2msg|short|score|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_changeclass ===&lt;br /&gt;
{{qnotice|When a LAN player changes class}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|localplayer_changeclass|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_respawn ===&lt;br /&gt;
{{qnotice|When a LAN player respawns}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|localplayer_respawn|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== building_info_changed ===&lt;br /&gt;
{{begin-hl2msg|building_info_changed|string}}&lt;br /&gt;
{{hl2msg|byte|building_type|}}&lt;br /&gt;
{{hl2msg|byte|object_mode|}}&lt;br /&gt;
{{hl2msg|byte|remove|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_changedisguise ===&lt;br /&gt;
{{qnotice|Whena LAN player changes their disguise as a spy}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|localplayer_changedisguise|string}}&lt;br /&gt;
{{hl2msg|bool|disguised|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_account_changed ===&lt;br /&gt;
{{begin-hl2msg|player_account_changed|string}}&lt;br /&gt;
{{hl2msg|short|old_value|}}&lt;br /&gt;
{{hl2msg|short|new_value|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== spy_pda_reset ===&lt;br /&gt;
{{begin-hl2msg|spy_pda_reset|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== flagstatus_update ===&lt;br /&gt;
{{begin-hl2msg|flagstatus_update|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_stats_updated ===&lt;br /&gt;
{{qnotice|When a players stats are updated}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_stats_updated|string}}&lt;br /&gt;
{{hl2msg|bool|forceupload|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== playing_commentary ===&lt;br /&gt;
{{qnotice|When a commentary is being played}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|playing_commentary|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_chargedeployed ===&lt;br /&gt;
{{qnotice|When an uber is deployed}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_chargedeployed|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID of medic who deployed charge}}&lt;br /&gt;
{{hl2msg|short|targetid|user ID of who the medic charged}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_builtobject ===&lt;br /&gt;
{{qnotice|When a player builds an object}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_builtobject|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID of the builder}}&lt;br /&gt;
{{hl2msg|byte|object|}}&lt;br /&gt;
{{hl2msg|short|index|index of the object}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_upgradedobject ===&lt;br /&gt;
{{begin-hl2msg|player_upgradedobject|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{hl2msg|byte|object|}}&lt;br /&gt;
{{hl2msg|short|index|}}&lt;br /&gt;
{{hl2msg|bool|isbuilder|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== achievement_earned ===&lt;br /&gt;
{{qnotice|When a player earns an achievement}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|achievement_earned|string}}&lt;br /&gt;
{{hl2msg|byte|player|entindex of the player}}&lt;br /&gt;
{{hl2msg|short|achievement|achievement ID}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== spec_target_updated ===&lt;br /&gt;
{{begin-hl2msg|spec_target_updated|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== tournament_stateupdate ===&lt;br /&gt;
{{begin-hl2msg|tournament_stateupdate|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID on server}}&lt;br /&gt;
{{hl2msg|bool|namechange|}}&lt;br /&gt;
{{hl2msg|short|readystate|}}&lt;br /&gt;
{{hl2msg|string|newname|players new name}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_calledformedic ===&lt;br /&gt;
{{qnotice|When a player calls for a medic}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_calledformedic|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_becameobserver ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|localplayer_becameobserver|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_ignited_inv ===&lt;br /&gt;
{{qnotice|sent when a player is ignited by a pyro who is being invulned, only to the medic who's doing the invulning}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|player_ignited_inv|string}}&lt;br /&gt;
{{hl2msg|byte|pyro_entindex|entindex of the pyro who ignited the victim}}&lt;br /&gt;
{{hl2msg|byte|victim_entindex|entindex of the player ignited by the pyro}}&lt;br /&gt;
{{hl2msg|byte|medic_entindex|entindex of the medic releasing the invuln}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_ignited ===&lt;br /&gt;
{{qnotice|sent when a player is ignited, only to the two players involved}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|player_ignited|string}}&lt;br /&gt;
{{hl2msg|byte|pyro_entindex|entindex of the pyro who ignited the victim}}&lt;br /&gt;
{{hl2msg|byte|victim_entindex|entindex of the player ignited by the pyro}}&lt;br /&gt;
{{hl2msg|byte|weaponid|weaponid of the weapon used}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_extinguished ===&lt;br /&gt;
{{qnotice|sent when a burning player is extinguished by a medic}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|player_extinguished|string}}&lt;br /&gt;
{{hl2msg|byte|victim|entindex of the player that was extinguished}}&lt;br /&gt;
{{hl2msg|byte|healer|entindex of the player who did the extinguishing}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_teleported ===&lt;br /&gt;
{{qnotice|Sent when a player is teleported}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_teleported|string}}&lt;br /&gt;
{{hl2msg|short|userid|userid of the player}}&lt;br /&gt;
{{hl2msg|short|builderid|userid of the player who built the teleporter}}&lt;br /&gt;
{{hl2msg|float|dist|distance the player was teleported}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_healedmediccall ===&lt;br /&gt;
{{qnotice|local player heals someone who called for medic.}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|player_healedmediccall|string}}&lt;br /&gt;
{{hl2msg|short|userid|userid of person who got healed}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_chargeready ===&lt;br /&gt;
{{qnotice|local player has full medic charge}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|localplayer_chargeready|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_winddown ===&lt;br /&gt;
{{qnotice|local player minigun winddown}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|localplayer_winddown|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_invulned ===&lt;br /&gt;
{{qnotice|Send when a player is made invulnerable}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_invulned|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{hl2msg|short|medic_userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== escort_speed ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|escort_speed|string}}&lt;br /&gt;
{{hl2msg|byte|team|which team}}&lt;br /&gt;
{{hl2msg|byte|speed|}}&lt;br /&gt;
{{hl2msg|byte|players|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== escort_progress ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|escort_progress|string}}&lt;br /&gt;
{{hl2msg|byte|team|which team}}&lt;br /&gt;
{{hl2msg|float|progress|}}&lt;br /&gt;
{{hl2msg|bool|reset|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== escort_recede ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|escort_recede|string}}&lt;br /&gt;
{{hl2msg|byte|team|which team}}&lt;br /&gt;
{{hl2msg|float|recedetime|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== client_loadout_changed ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|client_loadout_changed|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== gameui_activated ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|gameui_activated|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== gameui_hidden ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|gameui_hidden|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_escort_score ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_escort_score|string}}&lt;br /&gt;
{{hl2msg|byte|player|}}&lt;br /&gt;
{{hl2msg|byte|points|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_healonhit ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_healonhit|string}}&lt;br /&gt;
{{hl2msg|short|amount|}}&lt;br /&gt;
{{hl2msg|byte|entindex|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_stealsandvich ===&lt;br /&gt;
{{begin-hl2msg|player_stealsandvich|string}}&lt;br /&gt;
{{hl2msg|short|owner|}}&lt;br /&gt;
{{hl2msg|short|target|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== show_class_layout ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|show_class_layout|string}}&lt;br /&gt;
{{hl2msg|bool|show|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== show_vs_panel ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|show_vs_panel|string}}&lt;br /&gt;
{{hl2msg|bool|show|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_damaged ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_damaged|string}}&lt;br /&gt;
{{hl2msg|short|amount|}}&lt;br /&gt;
{{hl2msg|long|type|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_hurt ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_hurt|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{hl2msg|short|health|}}&lt;br /&gt;
{{hl2msg|short|attacker|}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|damageamount|}}&lt;br /&gt;
{{hl2msg|bool|crit|}}&lt;br /&gt;
{{hl2msg|bool|minicrit|}}&lt;br /&gt;
{{hl2msg|bool|allseecrit|}}&lt;br /&gt;
{{hl2msg|short|weaponid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== arena_player_notification ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|arena_player_notification|string}}&lt;br /&gt;
{{hl2msg|byte|player|}}&lt;br /&gt;
{{hl2msg|byte|message|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== arena_match_maxstreak ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|arena_match_maxstreak|string}}&lt;br /&gt;
{{hl2msg|byte|team|}}&lt;br /&gt;
{{hl2msg|byte|streak|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== arena_round_start ===&lt;br /&gt;
{{qnotice|called when round is active, players can move}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|arena_round_start|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== arena_win_panel ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|arena_win_panel|string}}&lt;br /&gt;
{{hl2msg|byte|panel_style|for client to determine layout}}&lt;br /&gt;
{{hl2msg|byte|winning_team|}}&lt;br /&gt;
{{hl2msg|byte|winreason|the reason the team won - 1 (someone capped) 2 (entire team was killed)}}&lt;br /&gt;
{{hl2msg|string|cappers|string where each character is a player index of someone that capped}}&lt;br /&gt;
{{hl2msg|short|flagcaplimit|if win reason was flag cap limit, the value of the flag cap limit}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|blue_score|red team score}}&lt;br /&gt;
{{hl2msg|short|red_score|blue team score}}&lt;br /&gt;
{{hl2msg|short|blue_score_prev|previous red team score}}&lt;br /&gt;
{{hl2msg|short|red_score_prev|previous blue team score}}&lt;br /&gt;
{{hl2msg|short|round_complete|is this a complete round, or the end of a mini-round}}&lt;br /&gt;
{{hl2msg|short|player_1|}}&lt;br /&gt;
{{hl2msg|short|player_1_damage|}}&lt;br /&gt;
{{hl2msg|short|player_1_healing|}}&lt;br /&gt;
{{hl2msg|short|player_1_lifetime|}}&lt;br /&gt;
{{hl2msg|short|player_1_kills|}}&lt;br /&gt;
{{hl2msg|short|player_2|}}&lt;br /&gt;
{{hl2msg|short|player_2_damage|}}&lt;br /&gt;
{{hl2msg|short|player_2_healing|}}&lt;br /&gt;
{{hl2msg|short|player_2_lifetime|}}&lt;br /&gt;
{{hl2msg|short|player_2_kills|}}&lt;br /&gt;
{{hl2msg|short|player_3|}}&lt;br /&gt;
{{hl2msg|short|player_3_damage|}}&lt;br /&gt;
{{hl2msg|short|player_3_healing|}}&lt;br /&gt;
{{hl2msg|short|player_3_lifetime|}}&lt;br /&gt;
{{hl2msg|short|player_3_kills|}}&lt;br /&gt;
{{hl2msg|short|player_4|}}&lt;br /&gt;
{{hl2msg|short|player_4_damage|}}&lt;br /&gt;
{{hl2msg|short|player_4_healing|}}&lt;br /&gt;
{{hl2msg|short|player_4_lifetime|}}&lt;br /&gt;
{{hl2msg|short|player_4_kills|}}&lt;br /&gt;
{{hl2msg|short|player_5|}}&lt;br /&gt;
{{hl2msg|short|player_5_damage|}}&lt;br /&gt;
{{hl2msg|short|player_5_healing|}}&lt;br /&gt;
{{hl2msg|short|player_5_lifetime|}}&lt;br /&gt;
{{hl2msg|short|player_5_kills|}}&lt;br /&gt;
{{hl2msg|short|player_6|}}&lt;br /&gt;
{{hl2msg|short|player_6_damage|}}&lt;br /&gt;
{{hl2msg|short|player_6_healing|}}&lt;br /&gt;
{{hl2msg|short|player_6_lifetime|}}&lt;br /&gt;
{{hl2msg|short|player_6_kills|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== inventory_updated ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|inventory_updated|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== air_dash ===&lt;br /&gt;
{{qnotice|Called when a scout Performs Double Jump}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|air_dash|string}}&lt;br /&gt;
{{hl2msg|byte|player|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== landed ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|landed|string}}&lt;br /&gt;
{{hl2msg|byte|player|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_damage_dodged ===&lt;br /&gt;
{{qnotice|When a Player Evades Damage}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_damage_dodged|string}}&lt;br /&gt;
{{hl2msg|short|damage|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_stunned ===&lt;br /&gt;
{{qnotice|When a Player is Stunned}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_stunned|string}}&lt;br /&gt;
{{hl2msg|short|stunner|}}&lt;br /&gt;
{{hl2msg|short|victim|}}&lt;br /&gt;
{{hl2msg|bool|victim_capping|}}&lt;br /&gt;
{{hl2msg|bool|big_stun|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== scout_grand_slam ===&lt;br /&gt;
{{qnotice|When a Player is Killed by the Scout Taunt}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|scout_grand_slam|string}}&lt;br /&gt;
{{hl2msg|short|scout_id|}}&lt;br /&gt;
{{hl2msg|short|target_id|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== scout_slamdoll_landed ===&lt;br /&gt;
{{begin-hl2msg|scout_slamdoll_landed|string}}&lt;br /&gt;
{{hl2msg|short|target_index|}}&lt;br /&gt;
{{hl2msg|float|x|}}&lt;br /&gt;
{{hl2msg|float|y|}}&lt;br /&gt;
{{hl2msg|float|z|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== scout_slamdoll_landed ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|scout_slamdoll_landed|string}}&lt;br /&gt;
{{hl2msg|short|target_index|}}&lt;br /&gt;
{{hl2msg|float|x|}}&lt;br /&gt;
{{hl2msg|float|y|}}&lt;br /&gt;
{{hl2msg|float|z|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== arrow_impact ===&lt;br /&gt;
{{qnotice|When a player is hit by a Sniper's Huntsman arrow}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|arrow_impact|string}}&lt;br /&gt;
{{hl2msg|short|attachedEntity|}}&lt;br /&gt;
{{hl2msg|short|shooter|}}&lt;br /&gt;
{{hl2msg|short|boneIndexAttached|}}&lt;br /&gt;
{{hl2msg|float|bonePositionX|}}&lt;br /&gt;
{{hl2msg|float|bonePositionY|}}&lt;br /&gt;
{{hl2msg|float|bonePositionZ|}}&lt;br /&gt;
{{hl2msg|float|boneAnglesX|}}&lt;br /&gt;
{{hl2msg|float|boneAnglesY|}}&lt;br /&gt;
{{hl2msg|float|boneAnglesZ|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_jarated ===&lt;br /&gt;
{{qnotice|sent when a player is jarated, only to the two players involved}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|player_jarated|string}}&lt;br /&gt;
{{hl2msg|byte|thrower_entindex|entindex of the player who threw the jarate}}&lt;br /&gt;
{{hl2msg|byte|victim_entindex|entindex of the player receiving it}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_jarated_fade ===&lt;br /&gt;
{{qnotice|sent when a player is jarated, only to the two players involved}}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_jarated_fade|string}}&lt;br /&gt;
{{hl2msg|byte|thrower_entindex|entindex of the player who threw the jarate}}&lt;br /&gt;
{{hl2msg|byte|victim_entindex|entindex of the player receiving it}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_shield_blocked ===&lt;br /&gt;
{{qnotice|sent when a player is jarated, only to the two players involved}}&amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_shield_blocked|string}}&lt;br /&gt;
{{hl2msg|byte|attacker_entindex|entindex of the player who threw the jarate}}&lt;br /&gt;
{{hl2msg|byte|blocker_entindex|entindex of the player receiving it}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_pinned ===&lt;br /&gt;
{{qnotice|When a player is pinned to a wall}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|player_pinned|string}}&lt;br /&gt;
{{hl2msg|byte|pinned|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_healedbymedic ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_healedbymedic|string}}&lt;br /&gt;
{{hl2msg|byte|medic|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_spawn ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_spawn|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID who spawned}}&lt;br /&gt;
{{hl2msg|short|team|team they spawned on}}&lt;br /&gt;
{{hl2msg|short|class|class they spawned as}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_sapped_object ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_sapped_object|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID of the spy}}&lt;br /&gt;
{{hl2msg|short|ownerid|user ID of the building owner}}&lt;br /&gt;
{{hl2msg|byte|object|}}&lt;br /&gt;
{{hl2msg|short|sapperid|index of the sapper}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== item_found ===&lt;br /&gt;
{{qnotice|When a player finds an item}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|item_found|string}}&lt;br /&gt;
{{hl2msg|byte|player|entindex of the player}}&lt;br /&gt;
{{hl2msg|byte|quality|quality of the item}}&lt;br /&gt;
{{hl2msg|string|item|item name (unlocalized)}}&lt;br /&gt;
{{hl2msg|bool|crafted|}}&lt;br /&gt;
{{hl2msg|bool|propername|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== show_annotations ===&lt;br /&gt;
{{begin-hl2msg|show_annotations|string}}&lt;br /&gt;
{{hl2msg|float|worldPosX|}}&lt;br /&gt;
{{hl2msg|float|worldPosY|}}&lt;br /&gt;
{{hl2msg|float|worldPosZ|}}&lt;br /&gt;
{{hl2msg|long|id|}}&lt;br /&gt;
{{hl2msg|string|text|item name (unlocalized)}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== hide_annotations ===&lt;br /&gt;
{{begin-hl2msg|hide_annotations|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== post_inventory_application ===&lt;br /&gt;
{{qnotice|sent when a player gets a whole new set of items}}&amp;lt;br&amp;gt; &lt;br /&gt;
{{begin-hl2msg|post_inventory_application|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== controlpoint_unlock_updated ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|controlpoint_unlock_updated|string}}&lt;br /&gt;
{{hl2msg|short|index|index of the cap being updated}}&lt;br /&gt;
{{hl2msg|float|time|time}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== deploy_buff_banner ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|deploy_buff_banner|string}}&lt;br /&gt;
{{hl2msg|byte|buff_type|type of buff (skin index)}}&lt;br /&gt;
{{hl2msg|short|buff_owner|user ID of the person who gets the banner}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_buff ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_buff|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID of the player the buff is being applied to}}&lt;br /&gt;
&lt;br /&gt;
{{hl2msg|short|buff_owner|user ID of the player with the banner}}&lt;br /&gt;
{{hl2msg|byte|buff_type|type of buff}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== medic_death ===&lt;br /&gt;
{{qnotice|When a medic dies}}&amp;lt;br&amp;gt;&lt;br /&gt;
{{begin-hl2msg|medic_death|string}}&lt;br /&gt;
{{hl2msg|short|userid|user ID who died}}&lt;br /&gt;
{{hl2msg|short|attacker|user ID who killed}}&lt;br /&gt;
{{hl2msg|short|healing|amount healed in this life}}&lt;br /&gt;
{{hl2msg|bool|charged|had a full ubercharge?}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== overtime_nag ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|overtime_nag|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== teams_changed ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|teams_changed|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== halloween_pumpkin_grab ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|halloween_pumpkin_grab|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== rocket_jump ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|rocket_jump|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== rocket_jump_landed ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|rocket_jump_landed|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== sticky_jump ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|sticky_jump|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== sticky_jump_landed ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|sticky_jump_landed|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== medic_defended ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|medic_defended|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{hl2msg|short|medic|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== localplayer_healed ===&lt;br /&gt;
{{begin-hl2msg|localplayer_healed|string}}&lt;br /&gt;
{{hl2msg|short|amount|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_destroyed_pipebomb ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_destroyed_pipebomb|string}}&lt;br /&gt;
{{hl2msg|short|userid|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== object_deflected ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|object_deflected|string}}&lt;br /&gt;
{{hl2msg|short|userid|player who deflected the object}}&lt;br /&gt;
{{hl2msg|short|ownerid|owner of the object}}&lt;br /&gt;
{{hl2msg|short|weaponid|weapon id (0 means the player in ownerid was pushed)}}&lt;br /&gt;
&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_mvp ===&lt;br /&gt;
&lt;br /&gt;
{{begin-hl2msg|player_mvp|string}}&lt;br /&gt;
{{hl2msg|short|player|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== raid_spawn_mob ===&lt;br /&gt;
{{begin-hl2msg|raid_spawn_mob|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== raid_spawn_squad ===&lt;br /&gt;
{{begin-hl2msg|raid_spawn_squad|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== nav_blocked ===&lt;br /&gt;
{{begin-hl2msg|nav_blocked|string}}&lt;br /&gt;
{{hl2msg|long|area|}}&lt;br /&gt;
{{hl2msg|bool|blocked|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== path_track_passed ===&lt;br /&gt;
{{begin-hl2msg|path_track_passed|string}}&lt;br /&gt;
{{hl2msg|short|index|index of the node being passed}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== num_cappers_changed ===&lt;br /&gt;
{{begin-hl2msg|num_cappers_changed|string}}&lt;br /&gt;
{{hl2msg|short|index|index of the trigger}}&lt;br /&gt;
{{hl2msg|byte|count|number of cappers (-1 for blocked)}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== player_regenerate ===&lt;br /&gt;
{{begin-hl2msg|player_regenerate|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== update_status_item ===&lt;br /&gt;
{{begin-hl2msg|update_status_item|string}}&lt;br /&gt;
{{hl2msg|byte|index|}}&lt;br /&gt;
{{hl2msg|byte|object|}}&lt;br /&gt;
{{end-hl2msg}}&lt;br /&gt;
 &lt;br /&gt;
=== cart_updated ===&lt;br /&gt;
{{begin-hl2msg|cart_updated|string}}&lt;br /&gt;
{{end-hl2msg}}&lt;/div&gt;</summary>
		<author><name>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Item_Definition_Indexes&amp;diff=7767</id>
		<title>Team Fortress 2 Item Definition Indexes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Item_Definition_Indexes&amp;diff=7767"/>
		<updated>2010-07-11T01:53:32Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of the item definition indexes in TF2, these are useful for distinguishing an unlockable weapon from its original (for example: The Backburner from an ordinary Flamethrower.)&lt;br /&gt;
&lt;br /&gt;
This list is divided in to Weapons, Hats and Crafting Items.&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pawn&amp;gt;SetEntProp(edict, Prop_Send, &amp;quot;m_iItemDefinitionIndex&amp;quot;, index);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weapons ==&lt;br /&gt;
&lt;br /&gt;
These are all of the weapons currently in TF2 and their item definition indexes.&lt;br /&gt;
&lt;br /&gt;
'''0''' - Bat&amp;lt;br&amp;gt;&lt;br /&gt;
'''1''' - Bottle&amp;lt;br&amp;gt;&lt;br /&gt;
'''2''' - Fire Axe&amp;lt;br&amp;gt;&lt;br /&gt;
'''3''' - Kukri&amp;lt;br&amp;gt;&lt;br /&gt;
'''4''' - Knife&amp;lt;br&amp;gt;&lt;br /&gt;
'''5''' - Fists&amp;lt;br&amp;gt;&lt;br /&gt;
'''6''' - Shovel&amp;lt;br&amp;gt;&lt;br /&gt;
'''7''' - Wrench&amp;lt;br&amp;gt;&lt;br /&gt;
'''8''' - Bonesaw&amp;lt;br&amp;gt;&lt;br /&gt;
'''9''' - Engineer's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''10''' - Soldier's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''11''' - Heavy's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''12''' - Pyro's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''13''' - Scattergun&amp;lt;br&amp;gt;&lt;br /&gt;
'''14''' - Sniper Rifle&amp;lt;br&amp;gt;&lt;br /&gt;
'''15''' - Minigun&amp;lt;br&amp;gt;&lt;br /&gt;
'''16''' - SMG&amp;lt;br&amp;gt;&lt;br /&gt;
'''17''' - Syringe Gun&amp;lt;br&amp;gt;&lt;br /&gt;
'''18''' - Rocket Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''19''' - Pipe Grenade Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''20''' - Sticky Bomb Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''21''' - Flamethrower&amp;lt;br&amp;gt;&lt;br /&gt;
'''22''' - Engineer's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''23''' - Scout's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''24''' - Spy's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''25''' - Builder PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''26''' - Demolisher PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''27''' - Disguise Kit PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''29''' - Medigun&amp;lt;br&amp;gt;&lt;br /&gt;
'''30''' - Cloak Watch&amp;lt;br&amp;gt;&lt;br /&gt;
'''35''' - The Kritzkrieg&amp;lt;br&amp;gt;&lt;br /&gt;
'''36''' - The Blutsauger&amp;lt;br&amp;gt;&lt;br /&gt;
'''37''' - The Ubersaw&amp;lt;br&amp;gt;&lt;br /&gt;
'''38''' - The Axtinguisher&amp;lt;br&amp;gt;&lt;br /&gt;
'''39''' - The Flaregun&amp;lt;br&amp;gt;&lt;br /&gt;
'''40''' - The Backburner&amp;lt;br&amp;gt;&lt;br /&gt;
'''41''' - Natascha&amp;lt;br&amp;gt;&lt;br /&gt;
'''42''' - Sandvich&amp;lt;br&amp;gt;&lt;br /&gt;
'''43''' - The Killer Gloves Of Boxing&amp;lt;br&amp;gt;&lt;br /&gt;
'''44''' - Sandman (Wooden Bat)&amp;lt;br&amp;gt;&lt;br /&gt;
'''45''' - Force-A-Nature&amp;lt;br&amp;gt;&lt;br /&gt;
'''46''' - Bonk! Atomic Punch&amp;lt;br&amp;gt;&lt;br /&gt;
'''56''' - Huntsman&amp;lt;br&amp;gt;&lt;br /&gt;
'''57''' - Razorback&amp;lt;br&amp;gt;&lt;br /&gt;
'''58''' - Jarate&amp;lt;br&amp;gt;&lt;br /&gt;
'''59''' - Dead Ringer&amp;lt;br&amp;gt;&lt;br /&gt;
'''60''' - Cloak And Dagger&amp;lt;br&amp;gt;&lt;br /&gt;
'''61''' - The Ambassador&amp;lt;br&amp;gt;&lt;br /&gt;
'''127''' - The Direct Hit&amp;lt;br&amp;gt;&lt;br /&gt;
'''128''' - The Equalizer&amp;lt;br&amp;gt;&lt;br /&gt;
'''129''' - The Buff Banner&amp;lt;br&amp;gt;&lt;br /&gt;
'''130''' - The Scottish Resistance&amp;lt;br&amp;gt;&lt;br /&gt;
'''131''' - Chargin' Targe&amp;lt;br&amp;gt;&lt;br /&gt;
'''132''' - The Eyelander&amp;lt;br&amp;gt;&lt;br /&gt;
'''133''' - The Gunboats&amp;lt;br&amp;gt;&lt;br /&gt;
'''140''' - The Wrangler&amp;lt;br&amp;gt;&lt;br /&gt;
'''141''' - The Frontier Justice&amp;lt;br&amp;gt;&lt;br /&gt;
'''142''' - The Gunslinger&amp;lt;br&amp;gt;&lt;br /&gt;
'''153''' - Homewrecker&amp;lt;br&amp;gt;&lt;br /&gt;
'''154''' - Pain Train&amp;lt;br&amp;gt;&lt;br /&gt;
'''155''' - The Southern Hospitality&amp;lt;br&amp;gt;&lt;br /&gt;
'''159''' - Dalokohs Bar&amp;lt;br&amp;gt;&lt;br /&gt;
'''160''' - Lugermorph&amp;lt;br&amp;gt;&lt;br /&gt;
'''161''' - Big Kill&amp;lt;br&amp;gt;&lt;br /&gt;
'''163''' - Crit-a-Cola&amp;lt;br&amp;gt;&lt;br /&gt;
'''169''' - Golden Wrench&amp;lt;br&amp;gt;&lt;br /&gt;
'''171''' - Tribalman's Shiv&amp;lt;br&amp;gt;&lt;br /&gt;
'''172''' - Scotsman's Skullcutter&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hats ==&lt;br /&gt;
&lt;br /&gt;
These are all of the hats and wearables available in the game.&lt;br /&gt;
&lt;br /&gt;
'''47''' - Demoman's 'Fro&amp;lt;br&amp;gt;&lt;br /&gt;
'''48''' - Mining Light&amp;lt;br&amp;gt;&lt;br /&gt;
'''49''' - Football Helmet&amp;lt;br&amp;gt;&lt;br /&gt;
'''50''' - Prussian Pickelhaube&amp;lt;br&amp;gt;&lt;br /&gt;
'''51''' - Pyro's Beanie&amp;lt;br&amp;gt;&lt;br /&gt;
'''52''' - Batter's Helmet&amp;lt;br&amp;gt;&lt;br /&gt;
'''53''' - Trophy Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''54''' - Soldier's Stash&amp;lt;br&amp;gt;&lt;br /&gt;
'''55''' - Fancy Fedora&amp;lt;br&amp;gt;&lt;br /&gt;
'''94''' - Texas Ten Gallon&amp;lt;br&amp;gt;&lt;br /&gt;
'''95''' - Engineer's Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''96''' - Officer's Ushanka&amp;lt;br&amp;gt;&lt;br /&gt;
'''97''' - Tough Guy's Tuque&amp;lt;br&amp;gt;&lt;br /&gt;
'''98''' - Stainless Pot&amp;lt;br&amp;gt;&lt;br /&gt;
'''99''' - Tyrant's Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''100''' - Glengarry Bonnet&amp;lt;br&amp;gt;&lt;br /&gt;
'''101''' - Vintage Tyrolean&amp;lt;br&amp;gt;&lt;br /&gt;
'''102''' - Respectless Rubber Glove&amp;lt;br&amp;gt;&lt;br /&gt;
'''103''' - Camera Beard&amp;lt;br&amp;gt;&lt;br /&gt;
'''104''' - Otolaryngologist's Mirror&amp;lt;br&amp;gt;&lt;br /&gt;
'''105''' - Brigade Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''106''' - Bonk Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''107''' - Ye Olde Baker Boy&amp;lt;br&amp;gt;&lt;br /&gt;
'''108''' - Backbiter's Billycock&amp;lt;br&amp;gt;&lt;br /&gt;
'''109''' - Professional's Panama&amp;lt;br&amp;gt;&lt;br /&gt;
'''110''' - Master's Yellow Belt&amp;lt;br&amp;gt;&lt;br /&gt;
'''111''' - Baseball Bill's Sports Shine (Hatless Scout)&amp;lt;br&amp;gt;&lt;br /&gt;
'''115''' - Halloween Hat (Only appears on Halloween)&amp;lt;br&amp;gt;&lt;br /&gt;
'''116''' - Ghastly Gibus&amp;lt;br&amp;gt;&lt;br /&gt;
'''117''' - Ritzy Rick's Hair Fixative (Hatless Sniper)&amp;lt;br&amp;gt;&lt;br /&gt;
'''118''' - Texas Slim's Dome Shine (Hatless Engineer)&amp;lt;br&amp;gt;&lt;br /&gt;
'''120''' - Scottsman's Stove Pipe&amp;lt;br&amp;gt;&lt;br /&gt;
'''121''' - Service Medal&amp;lt;br&amp;gt;&lt;br /&gt;
'''125''' - Cheater's Lament&amp;lt;br&amp;gt;&lt;br /&gt;
'''126''' - Bill's Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''134''' - J.Axer's Dapper Topper&amp;lt;br&amp;gt;&lt;br /&gt;
'''135''' - Towering Pillar of Hats&amp;lt;br&amp;gt;&lt;br /&gt;
'''136''' - Amber's Rad As All Hell Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''137''' - Noble Amassment of Hats&amp;lt;br&amp;gt;&lt;br /&gt;
'''138''' - Uncle Sam&amp;lt;br&amp;gt;&lt;br /&gt;
'''139''' - Modest Pile of Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''143''' - Earbuds&amp;lt;br&amp;gt;&lt;br /&gt;
'''144''' - Physician's Procedure Mask&amp;lt;br&amp;gt;&lt;br /&gt;
'''145''' - Hound Dog&amp;lt;br&amp;gt;&lt;br /&gt;
'''146''' - Hustler's Hallmark&amp;lt;br&amp;gt;&lt;br /&gt;
'''147''' - Magistrate's Mullet&amp;lt;br&amp;gt;&lt;br /&gt;
'''148''' - Hotrod&amp;lt;br&amp;gt;&lt;br /&gt;
'''150''' - Troublemaker's Tossle Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''151''' - Triboniophorus Tyrannus&amp;lt;br&amp;gt;&lt;br /&gt;
'''152''' - Killer's Kabuto&amp;lt;br&amp;gt;&lt;br /&gt;
'''158''' - Shooter's Sola Topi&amp;lt;br&amp;gt;&lt;br /&gt;
'''162''' - Max's Severed Head&amp;lt;br&amp;gt;&lt;br /&gt;
'''164''' - Grizzled Veteran&amp;lt;br&amp;gt;&lt;br /&gt;
'''165''' - Soldier of Fortune&amp;lt;br&amp;gt;&lt;br /&gt;
'''166''' - Mercenary&amp;lt;br&amp;gt;&lt;br /&gt;
'''170''' - Primeval Warrior&amp;lt;br&amp;gt;&lt;br /&gt;
'''174''' - Whoopee Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''175''' - Whiskered Gentleman&amp;lt;br&amp;gt;&lt;br /&gt;
'''177''' - Ze Goggles&amp;lt;br&amp;gt;&lt;br /&gt;
'''178''' - Safe'n'Sound&amp;lt;br&amp;gt;&lt;br /&gt;
'''179''' - Tippler's Tricorne&amp;lt;br&amp;gt;&lt;br /&gt;
'''180''' - Frenchman's Beret&amp;lt;br&amp;gt;&lt;br /&gt;
'''181''' - Bloke's Bucket Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''182''' - Vintage Merryweather&amp;lt;br&amp;gt;&lt;br /&gt;
'''183''' - Sergeant's Drill Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''184''' - Gentleman's Gatsby&amp;lt;br&amp;gt;&lt;br /&gt;
'''185''' - Heavy Duty Rag&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Craft Items ==&lt;br /&gt;
&lt;br /&gt;
These are the items obtained and used primarily through crafting.&lt;br /&gt;
&lt;br /&gt;
'''5000''' - Scrap Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5001''' - Reclaimed Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5002''' - Refined Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5003''' - Scout Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5004''' - Sniper Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5005''' - Soldier Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5006''' - Demoman Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5007''' - Heavy Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5008''' - Medic Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5009''' - Pyro Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5010''' - Spy Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5011''' - Engineer Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5012''' - Primary Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5013''' - Secondary Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5014''' - Melee Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5015''' - Grenade Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5016''' - Building Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5017''' - PDA Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5018''' - PDA2 Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5019''' - Head Slot Token&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Item_Definition_Indexes&amp;diff=7766</id>
		<title>Team Fortress 2 Item Definition Indexes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Team_Fortress_2_Item_Definition_Indexes&amp;diff=7766"/>
		<updated>2010-07-11T01:53:10Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: Engineer weaps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of the item definition indexes in TF2, these are useful for distinguishing an unlockable weapon from its original (for example: The Backburner from an ordinary Flamethrower.)&lt;br /&gt;
&lt;br /&gt;
This list is divided in to Weapons, Hats and Crafting Items.&lt;br /&gt;
&lt;br /&gt;
Usage: &amp;lt;pawn&amp;gt;SetEntProp(edict, Prop_Send, &amp;quot;m_iItemDefinitionIndex&amp;quot;, index);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weapons ==&lt;br /&gt;
&lt;br /&gt;
These are all of the weapons currently in TF2 and their item definition indexes.&lt;br /&gt;
&lt;br /&gt;
'''0''' - Bat&amp;lt;br&amp;gt;&lt;br /&gt;
'''1''' - Bottle&amp;lt;br&amp;gt;&lt;br /&gt;
'''2''' - Fire Axe&amp;lt;br&amp;gt;&lt;br /&gt;
'''3''' - Kukri&amp;lt;br&amp;gt;&lt;br /&gt;
'''4''' - Knife&amp;lt;br&amp;gt;&lt;br /&gt;
'''5''' - Fists&amp;lt;br&amp;gt;&lt;br /&gt;
'''6''' - Shovel&amp;lt;br&amp;gt;&lt;br /&gt;
'''7''' - Wrench&amp;lt;br&amp;gt;&lt;br /&gt;
'''8''' - Bonesaw&amp;lt;br&amp;gt;&lt;br /&gt;
'''9''' - Engineer's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''10''' - Soldier's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''11''' - Heavy's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''12''' - Pyro's Shotgun&amp;lt;br&amp;gt;&lt;br /&gt;
'''13''' - Scattergun&amp;lt;br&amp;gt;&lt;br /&gt;
'''14''' - Sniper Rifle&amp;lt;br&amp;gt;&lt;br /&gt;
'''15''' - Minigun&amp;lt;br&amp;gt;&lt;br /&gt;
'''16''' - SMG&amp;lt;br&amp;gt;&lt;br /&gt;
'''17''' - Syringe Gun&amp;lt;br&amp;gt;&lt;br /&gt;
'''18''' - Rocket Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''19''' - Pipe Grenade Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''20''' - Sticky Bomb Launcher&amp;lt;br&amp;gt;&lt;br /&gt;
'''21''' - Flamethrower&amp;lt;br&amp;gt;&lt;br /&gt;
'''22''' - Engineer's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''23''' - Scout's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''24''' - Spy's Pistol&amp;lt;br&amp;gt;&lt;br /&gt;
'''25''' - Builder PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''26''' - Demolisher PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''27''' - Disguise Kit PDA&amp;lt;br&amp;gt;&lt;br /&gt;
'''29''' - Medigun&amp;lt;br&amp;gt;&lt;br /&gt;
'''30''' - Cloak Watch&amp;lt;br&amp;gt;&lt;br /&gt;
'''35''' - The Kritzkrieg&amp;lt;br&amp;gt;&lt;br /&gt;
'''36''' - The Blutsauger&amp;lt;br&amp;gt;&lt;br /&gt;
'''37''' - The Ubersaw&amp;lt;br&amp;gt;&lt;br /&gt;
'''38''' - The Axtinguisher&amp;lt;br&amp;gt;&lt;br /&gt;
'''39''' - The Flaregun&amp;lt;br&amp;gt;&lt;br /&gt;
'''40''' - The Backburner&amp;lt;br&amp;gt;&lt;br /&gt;
'''41''' - Natascha&amp;lt;br&amp;gt;&lt;br /&gt;
'''42''' - Sandvich&amp;lt;br&amp;gt;&lt;br /&gt;
'''43''' - The Killer Gloves Of Boxing&amp;lt;br&amp;gt;&lt;br /&gt;
'''44''' - Sandman (Wooden Bat)&amp;lt;br&amp;gt;&lt;br /&gt;
'''45''' - Force-A-Nature&amp;lt;br&amp;gt;&lt;br /&gt;
'''46''' - Bonk! Atomic Punch&amp;lt;br&amp;gt;&lt;br /&gt;
'''56''' - Huntsman&amp;lt;br&amp;gt;&lt;br /&gt;
'''57''' - Razorback&amp;lt;br&amp;gt;&lt;br /&gt;
'''58''' - Jarate&amp;lt;br&amp;gt;&lt;br /&gt;
'''59''' - Dead Ringer&amp;lt;br&amp;gt;&lt;br /&gt;
'''60''' - Cloak And Dagger&amp;lt;br&amp;gt;&lt;br /&gt;
'''61''' - The Ambassador&amp;lt;br&amp;gt;&lt;br /&gt;
'''127''' - The Direct Hit&amp;lt;br&amp;gt;&lt;br /&gt;
'''128''' - The Equalizer&amp;lt;br&amp;gt;&lt;br /&gt;
'''129''' - The Buff Banner&amp;lt;br&amp;gt;&lt;br /&gt;
'''130''' - The Scottish Resistance&amp;lt;br&amp;gt;&lt;br /&gt;
'''131''' - Chargin' Targe&amp;lt;br&amp;gt;&lt;br /&gt;
'''132''' - The Eyelander&amp;lt;br&amp;gt;&lt;br /&gt;
'''133''' - The Gunboats&amp;lt;br&amp;gt;&lt;br /&gt;
'''140''' - The Wrangler&amp;lt;br&amp;gt;&lt;br /&gt;
'''141''' - The Frontier Justice&amp;lt;br&amp;gt;&lt;br /&gt;
'''142''' - The Gunslinger&lt;br /&gt;
'''153''' - Homewrecker&amp;lt;br&amp;gt;&lt;br /&gt;
'''154''' - Pain Train&amp;lt;br&amp;gt;&lt;br /&gt;
'''155''' - The Southern Hospitality&amp;lt;br&amp;gt;&lt;br /&gt;
'''159''' - Dalokohs Bar&amp;lt;br&amp;gt;&lt;br /&gt;
'''160''' - Lugermorph&amp;lt;br&amp;gt;&lt;br /&gt;
'''161''' - Big Kill&amp;lt;br&amp;gt;&lt;br /&gt;
'''163''' - Crit-a-Cola&amp;lt;br&amp;gt;&lt;br /&gt;
'''169''' - Golden Wrench&amp;lt;br&amp;gt;&lt;br /&gt;
'''171''' - Tribalman's Shiv&amp;lt;br&amp;gt;&lt;br /&gt;
'''172''' - Scotsman's Skullcutter&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hats ==&lt;br /&gt;
&lt;br /&gt;
These are all of the hats and wearables available in the game.&lt;br /&gt;
&lt;br /&gt;
'''47''' - Demoman's 'Fro&amp;lt;br&amp;gt;&lt;br /&gt;
'''48''' - Mining Light&amp;lt;br&amp;gt;&lt;br /&gt;
'''49''' - Football Helmet&amp;lt;br&amp;gt;&lt;br /&gt;
'''50''' - Prussian Pickelhaube&amp;lt;br&amp;gt;&lt;br /&gt;
'''51''' - Pyro's Beanie&amp;lt;br&amp;gt;&lt;br /&gt;
'''52''' - Batter's Helmet&amp;lt;br&amp;gt;&lt;br /&gt;
'''53''' - Trophy Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''54''' - Soldier's Stash&amp;lt;br&amp;gt;&lt;br /&gt;
'''55''' - Fancy Fedora&amp;lt;br&amp;gt;&lt;br /&gt;
'''94''' - Texas Ten Gallon&amp;lt;br&amp;gt;&lt;br /&gt;
'''95''' - Engineer's Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''96''' - Officer's Ushanka&amp;lt;br&amp;gt;&lt;br /&gt;
'''97''' - Tough Guy's Tuque&amp;lt;br&amp;gt;&lt;br /&gt;
'''98''' - Stainless Pot&amp;lt;br&amp;gt;&lt;br /&gt;
'''99''' - Tyrant's Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''100''' - Glengarry Bonnet&amp;lt;br&amp;gt;&lt;br /&gt;
'''101''' - Vintage Tyrolean&amp;lt;br&amp;gt;&lt;br /&gt;
'''102''' - Respectless Rubber Glove&amp;lt;br&amp;gt;&lt;br /&gt;
'''103''' - Camera Beard&amp;lt;br&amp;gt;&lt;br /&gt;
'''104''' - Otolaryngologist's Mirror&amp;lt;br&amp;gt;&lt;br /&gt;
'''105''' - Brigade Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''106''' - Bonk Helm&amp;lt;br&amp;gt;&lt;br /&gt;
'''107''' - Ye Olde Baker Boy&amp;lt;br&amp;gt;&lt;br /&gt;
'''108''' - Backbiter's Billycock&amp;lt;br&amp;gt;&lt;br /&gt;
'''109''' - Professional's Panama&amp;lt;br&amp;gt;&lt;br /&gt;
'''110''' - Master's Yellow Belt&amp;lt;br&amp;gt;&lt;br /&gt;
'''111''' - Baseball Bill's Sports Shine (Hatless Scout)&amp;lt;br&amp;gt;&lt;br /&gt;
'''115''' - Halloween Hat (Only appears on Halloween)&amp;lt;br&amp;gt;&lt;br /&gt;
'''116''' - Ghastly Gibus&amp;lt;br&amp;gt;&lt;br /&gt;
'''117''' - Ritzy Rick's Hair Fixative (Hatless Sniper)&amp;lt;br&amp;gt;&lt;br /&gt;
'''118''' - Texas Slim's Dome Shine (Hatless Engineer)&amp;lt;br&amp;gt;&lt;br /&gt;
'''120''' - Scottsman's Stove Pipe&amp;lt;br&amp;gt;&lt;br /&gt;
'''121''' - Service Medal&amp;lt;br&amp;gt;&lt;br /&gt;
'''125''' - Cheater's Lament&amp;lt;br&amp;gt;&lt;br /&gt;
'''126''' - Bill's Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''134''' - J.Axer's Dapper Topper&amp;lt;br&amp;gt;&lt;br /&gt;
'''135''' - Towering Pillar of Hats&amp;lt;br&amp;gt;&lt;br /&gt;
'''136''' - Amber's Rad As All Hell Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''137''' - Noble Amassment of Hats&amp;lt;br&amp;gt;&lt;br /&gt;
'''138''' - Uncle Sam&amp;lt;br&amp;gt;&lt;br /&gt;
'''139''' - Modest Pile of Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''143''' - Earbuds&amp;lt;br&amp;gt;&lt;br /&gt;
'''144''' - Physician's Procedure Mask&amp;lt;br&amp;gt;&lt;br /&gt;
'''145''' - Hound Dog&amp;lt;br&amp;gt;&lt;br /&gt;
'''146''' - Hustler's Hallmark&amp;lt;br&amp;gt;&lt;br /&gt;
'''147''' - Magistrate's Mullet&amp;lt;br&amp;gt;&lt;br /&gt;
'''148''' - Hotrod&amp;lt;br&amp;gt;&lt;br /&gt;
'''150''' - Troublemaker's Tossle Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''151''' - Triboniophorus Tyrannus&amp;lt;br&amp;gt;&lt;br /&gt;
'''152''' - Killer's Kabuto&amp;lt;br&amp;gt;&lt;br /&gt;
'''158''' - Shooter's Sola Topi&amp;lt;br&amp;gt;&lt;br /&gt;
'''162''' - Max's Severed Head&amp;lt;br&amp;gt;&lt;br /&gt;
'''164''' - Grizzled Veteran&amp;lt;br&amp;gt;&lt;br /&gt;
'''165''' - Soldier of Fortune&amp;lt;br&amp;gt;&lt;br /&gt;
'''166''' - Mercenary&amp;lt;br&amp;gt;&lt;br /&gt;
'''170''' - Primeval Warrior&amp;lt;br&amp;gt;&lt;br /&gt;
'''174''' - Whoopee Cap&amp;lt;br&amp;gt;&lt;br /&gt;
'''175''' - Whiskered Gentleman&amp;lt;br&amp;gt;&lt;br /&gt;
'''177''' - Ze Goggles&amp;lt;br&amp;gt;&lt;br /&gt;
'''178''' - Safe'n'Sound&amp;lt;br&amp;gt;&lt;br /&gt;
'''179''' - Tippler's Tricorne&amp;lt;br&amp;gt;&lt;br /&gt;
'''180''' - Frenchman's Beret&amp;lt;br&amp;gt;&lt;br /&gt;
'''181''' - Bloke's Bucket Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''182''' - Vintage Merryweather&amp;lt;br&amp;gt;&lt;br /&gt;
'''183''' - Sergeant's Drill Hat&amp;lt;br&amp;gt;&lt;br /&gt;
'''184''' - Gentleman's Gatsby&amp;lt;br&amp;gt;&lt;br /&gt;
'''185''' - Heavy Duty Rag&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Craft Items ==&lt;br /&gt;
&lt;br /&gt;
These are the items obtained and used primarily through crafting.&lt;br /&gt;
&lt;br /&gt;
'''5000''' - Scrap Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5001''' - Reclaimed Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5002''' - Refined Metal&amp;lt;br&amp;gt;&lt;br /&gt;
'''5003''' - Scout Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5004''' - Sniper Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5005''' - Soldier Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5006''' - Demoman Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5007''' - Heavy Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5008''' - Medic Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5009''' - Pyro Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5010''' - Spy Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5011''' - Engineer Class Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5012''' - Primary Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5013''' - Secondary Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5014''' - Melee Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5015''' - Grenade Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5016''' - Building Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5017''' - PDA Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5018''' - PDA2 Slot Token&amp;lt;br&amp;gt;&lt;br /&gt;
'''5019''' - Head Slot Token&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Achievement_IDs&amp;diff=7459</id>
		<title>Achievement IDs</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Achievement_IDs&amp;diff=7459"/>
		<updated>2009-12-18T08:14:24Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Achievement Identification Numbers ==&lt;br /&gt;
&lt;br /&gt;
VALVe uses :&lt;br /&gt;
&lt;br /&gt;
'''CTFPlayer::AwardAchievement(int iAchievementID, int iIterator)''' &lt;br /&gt;
&lt;br /&gt;
in order to award a player an achievement. Each achievement has a specific ID number. The list below is a (hopefully) complete list of ID numbers.&lt;br /&gt;
&lt;br /&gt;
Format: &amp;lt;ID Number&amp;gt;: &amp;lt;Name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Special Thanks to '''CShadowRun''' and '''predcrab''' for all their help!&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== General Achievements ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;127: Sentry Gunner&lt;br /&gt;
128: Nemesis&lt;br /&gt;
129: Hard To Kill&lt;br /&gt;
130: Master of Disguise&lt;br /&gt;
131: With Friends Like These&lt;br /&gt;
132: Dynasty&lt;br /&gt;
133: Hardcore&lt;br /&gt;
134: Powerhouse Offense&lt;br /&gt;
135: Lightning Offense&lt;br /&gt;
136: Relentless Offense&lt;br /&gt;
137: Impenetrable Defense&lt;br /&gt;
138: Impossible Defense&lt;br /&gt;
139: Head of the Class&lt;br /&gt;
140: World Traveler&lt;br /&gt;
141: Team Doctor&lt;br /&gt;
142: Flamethrower&lt;br /&gt;
145: Grey Matter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Medic Achievements ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1401: First Do No Harm&lt;br /&gt;
1402: Quadruple Bypass&lt;br /&gt;
1403: Group Health&lt;br /&gt;
1404: Surgical Prep&lt;br /&gt;
1405: Trauma Queen&lt;br /&gt;
1406: Double Blind Trial&lt;br /&gt;
1407: Play Doctor&lt;br /&gt;
1408: Triage&lt;br /&gt;
1409: Preventative Medicine&lt;br /&gt;
1410: Consultation&lt;br /&gt;
1411: Does It Hurt When I Do This?&lt;br /&gt;
1412: Peer Review&lt;br /&gt;
1413: Big Pharma&lt;br /&gt;
1414: You'll Feel a Little Prick&lt;br /&gt;
1415: Autoclave&lt;br /&gt;
1416: Blunt Trauma&lt;br /&gt;
1417: Medical Breakthrough&lt;br /&gt;
1418: Blast Assist&lt;br /&gt;
1419: Midwife Crisis&lt;br /&gt;
1420: Ubi concordia, ibi victoria&lt;br /&gt;
1421: Grand Rounds&lt;br /&gt;
1422: Infernal Medicine&lt;br /&gt;
1423: Doctor Assisted Homicide&lt;br /&gt;
1424: Placebo Effect&lt;br /&gt;
1425: Sawbones&lt;br /&gt;
1426: Intern&lt;br /&gt;
1427: Specialist&lt;br /&gt;
1428: Chief of Staff&lt;br /&gt;
1429: Hypocritical Oath&lt;br /&gt;
1430: Medical Intervention&lt;br /&gt;
1431: Second Opinion&lt;br /&gt;
1432: Autopsy Report&lt;br /&gt;
1433: FYI I am A Medic&lt;br /&gt;
1434: Family Practice&lt;br /&gt;
1435: House Call&lt;br /&gt;
1436: Bedside Manner&lt;br /&gt;
1437: Milestone 1&lt;br /&gt;
1438: Milestone 2&lt;br /&gt;
1439: Milestone 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pyro Achievements ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1601: Combined Fire&lt;br /&gt;
1602: Weenie Roast&lt;br /&gt;
1603: Baptism By Fire&lt;br /&gt;
1604: Fire and Forget&lt;br /&gt;
1605: Firewall&lt;br /&gt;
1606: Cooking the Books&lt;br /&gt;
1607: Spontaneous Combustion&lt;br /&gt;
1608: Trailblazer&lt;br /&gt;
1609: Camp Fire&lt;br /&gt;
1610: Lumberjack&lt;br /&gt;
1611: Clearcutter&lt;br /&gt;
1612: Hot on Your Heels&lt;br /&gt;
1613: I Fry&lt;br /&gt;
1614: Firewatch&lt;br /&gt;
1615: Burn Ward&lt;br /&gt;
1616: Hot Potato&lt;br /&gt;
1617: Makin' Bacon&lt;br /&gt;
1618: Plan B&lt;br /&gt;
1619: Pyrotechnics&lt;br /&gt;
1620: Arsonist&lt;br /&gt;
1621: Controlled Burn&lt;br /&gt;
1622: Firefighter&lt;br /&gt;
1623: Pyromancer&lt;br /&gt;
1624: Next of Kindling&lt;br /&gt;
1625: OMGWTFBBQ&lt;br /&gt;
1626: Second Degree Burn&lt;br /&gt;
1627: Got A Light?&lt;br /&gt;
1628: BarbeQueQ&lt;br /&gt;
1629: Hotshot&lt;br /&gt;
1630: Dance Dance Immolation&lt;br /&gt;
1631: Dead Heat&lt;br /&gt;
1632: Pilot Light&lt;br /&gt;
1633: Freezer Burn&lt;br /&gt;
1634: Fire Chief&lt;br /&gt;
1635: Attention Getter&lt;br /&gt;
1637: Milestone 1&lt;br /&gt;
1638: Milestone 2&lt;br /&gt;
1639: Milestone 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heavy Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;1501: Iron Kurtain&lt;br /&gt;
1502: Party Loyalty&lt;br /&gt;
1503: Division of Labor&lt;br /&gt;
1504: Red Oktoberfest&lt;br /&gt;
1505: Show Trial&lt;br /&gt;
1506: Crime and Punishment&lt;br /&gt;
1507: Class Struggle&lt;br /&gt;
1508: Soviet Block&lt;br /&gt;
1509: Stalin the Kart&lt;br /&gt;
1510: Supreme Soviet&lt;br /&gt;
1511: Factory Worker&lt;br /&gt;
1512: Soviet Union&lt;br /&gt;
1513: Own the Means of Production&lt;br /&gt;
1514: Krazy Ivan&lt;br /&gt;
1515: Rasputin&lt;br /&gt;
1516: Icing on the Cake&lt;br /&gt;
1517: Crock Block&lt;br /&gt;
1518: Kollectivization&lt;br /&gt;
1519: Spyalectical Materialism&lt;br /&gt;
1520: Permanent Revolution&lt;br /&gt;
1521: Heavy Industry&lt;br /&gt;
1522: Communist Mani-Fisto&lt;br /&gt;
1523: Redistribution of Health&lt;br /&gt;
1524: Rationing&lt;br /&gt;
1525: Vanguard Party&lt;br /&gt;
1527: Pushkin the Kart&lt;br /&gt;
1528: Marxman&lt;br /&gt;
1529: Gorky Parked&lt;br /&gt;
1530: Purge&lt;br /&gt;
1531: Lenin A Hand&lt;br /&gt;
1532: Five Second Plan&lt;br /&gt;
1533: Photostroika&lt;br /&gt;
1534: Konspicuous Konsumption&lt;br /&gt;
1535: Don't Touch Sandvich&lt;br /&gt;
1536: Borscht Belt&lt;br /&gt;
1537: Milestone 1&lt;br /&gt;
1538: Milestone 2&lt;br /&gt;
1539: Milestone 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Scout Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;1001: First Blood&lt;br /&gt;
1002: First Blood, Part 2&lt;br /&gt;
1003: Quick Hook&lt;br /&gt;
1004: A Year to Remember&lt;br /&gt;
1005: The Cycle&lt;br /&gt;
1006: Closer&lt;br /&gt;
1007: If You Build it&lt;br /&gt;
1008: Gun Down&lt;br /&gt;
1009: Butter Up&lt;br /&gt;
1010: Doctoring the ball&lt;br /&gt;
1011: Dodgers 1, Giants 0&lt;br /&gt;
1012: Batting the Doctor&lt;br /&gt;
1013: I'm Bat Man&lt;br /&gt;
1014: Triple Steal&lt;br /&gt;
1015: Pop Fly&lt;br /&gt;
1016: Round-Tripper&lt;br /&gt;
1017: Artful Dodger&lt;br /&gt;
1018: Fall Classic&lt;br /&gt;
1019: Strike Zone&lt;br /&gt;
1020: Foul Territory&lt;br /&gt;
1021: The Big Hurt&lt;br /&gt;
1022: Brushback&lt;br /&gt;
1023: Moon Shot&lt;br /&gt;
1024: Beanball&lt;br /&gt;
1025: Retire the Runner&lt;br /&gt;
1026: Caught Napping&lt;br /&gt;
1027: Side Retired&lt;br /&gt;
1028: Triple Play&lt;br /&gt;
1029: Stealing Home&lt;br /&gt;
1030: Set the Table&lt;br /&gt;
1031: Block the Plate&lt;br /&gt;
1032: Belittled Beleaguer&lt;br /&gt;
1033: No-Hitter&lt;br /&gt;
1034: Race for the Pennant&lt;br /&gt;
1035: Out of the Park&lt;br /&gt;
1036: Milestone 1&lt;br /&gt;
1037: Milestone 2&lt;br /&gt;
1038: Milestone 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sniper Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1101: Rode Hard, Put Away Wet&lt;br /&gt;
1102: Be polite&lt;br /&gt;
1103: Be Efficient&lt;br /&gt;
1104: Have a Plan&lt;br /&gt;
1105: Kill Everyone You Meet&lt;br /&gt;
1106: Triple Prey&lt;br /&gt;
1107: Self-Destruct Sequence&lt;br /&gt;
1108: De-sentry-lized&lt;br /&gt;
1109: Shoot the Breeze&lt;br /&gt;
1110: Dropped Dead&lt;br /&gt;
1111: the last wave&lt;br /&gt;
1112: australian rules&lt;br /&gt;
1113: Kook the Spook&lt;br /&gt;
1114: Socket to Him&lt;br /&gt;
1115: Jumper Stumper&lt;br /&gt;
1116: Not a Crazed Gunman, Dad&lt;br /&gt;
1117: Trust Your Feelings&lt;br /&gt;
1118: Überectomy&lt;br /&gt;
1119: Consolation Prize&lt;br /&gt;
1120: Enemy at the Gate&lt;br /&gt;
1121: Parting Shot&lt;br /&gt;
1122: My Brilliant Career&lt;br /&gt;
1123: Shock Treatment&lt;br /&gt;
1124: Saturation Bombing&lt;br /&gt;
1125: Rain on Their Parade&lt;br /&gt;
1126: Jarring Transition&lt;br /&gt;
1127: Friendship is Golden&lt;br /&gt;
1128: William Tell Overkill&lt;br /&gt;
1129: Beaux and Arrows&lt;br /&gt;
1130: Robbin’ Hood&lt;br /&gt;
1131: Pincushion&lt;br /&gt;
1132: Number One Assistant&lt;br /&gt;
1133: Jarate Chop&lt;br /&gt;
1134: Shafted&lt;br /&gt;
1135: Dead Reckoning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Spy Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1701: Triplecrossed&lt;br /&gt;
1702: For Your Eyes Only&lt;br /&gt;
1703: Counter Espionage&lt;br /&gt;
1704: Identity Theft&lt;br /&gt;
1705: The Man from P.U.N.C.T.U.R.E.&lt;br /&gt;
1706: FYI I am a Spy&lt;br /&gt;
1707: The Man with the Broken Guns&lt;br /&gt;
1708: Sapsucker&lt;br /&gt;
1709: May I Cut In?&lt;br /&gt;
1710: Agent Provocateur&lt;br /&gt;
1711: The Melbourne Supremacy&lt;br /&gt;
1712: Spies Like Us&lt;br /&gt;
1713: A Cut Above&lt;br /&gt;
1714: Burn Notice&lt;br /&gt;
1715: Die Another Way&lt;br /&gt;
1716: Constructus Interruptus&lt;br /&gt;
1717: On Her Majesty’s Secret Surface&lt;br /&gt;
1718: Insurance Fraud&lt;br /&gt;
1719: Point Breaker&lt;br /&gt;
1720: High Value Target&lt;br /&gt;
1721: Come in From the Cold&lt;br /&gt;
1722: Wetwork&lt;br /&gt;
1723: You Only Shiv Thrice&lt;br /&gt;
1724: Spymaster&lt;br /&gt;
1725: Sap Auteur&lt;br /&gt;
1726: Joint Operation&lt;br /&gt;
1727: Dr. Nooooo&lt;br /&gt;
1728: Is It Safe?&lt;br /&gt;
1729: Slash and Burn&lt;br /&gt;
1730: Biplomacy&lt;br /&gt;
1731: Skullpluggery&lt;br /&gt;
1732: Sleeper Agent&lt;br /&gt;
1733: Who's Your Daddy?&lt;br /&gt;
1734: Deep Undercover&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Halloween Event Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1901: Candy Cornoner&lt;br /&gt;
1902: Ghastly Gibus Grab&lt;br /&gt;
1903: Scared Stiff&lt;br /&gt;
1904: Attack 'o Latern&lt;br /&gt;
1905: Costume Contest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Soldier Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1201: Duty Bound&lt;br /&gt;
1202: The Boostie Boys&lt;br /&gt;
1203: Out, Damned Scot!&lt;br /&gt;
1204: Engineer to Eternity&lt;br /&gt;
1205: Backdraft Dodger&lt;br /&gt;
1206: Trench Warfare&lt;br /&gt;
1207: Bomb Squaddie&lt;br /&gt;
1208: Where Eagles Dare&lt;br /&gt;
1209: Ain't Got Time to Bleed&lt;br /&gt;
1210: Banner of Brothers&lt;br /&gt;
1211: Tri-Splatteral Damage&lt;br /&gt;
1212: Death from Above&lt;br /&gt;
1213: Spray of Defeat&lt;br /&gt;
1214: War Crime and Punishment&lt;br /&gt;
1215: Near Death Experience&lt;br /&gt;
1216: Wings of Glory&lt;br /&gt;
1217: For Whom the Shell Trolls&lt;br /&gt;
1218: Death From Below&lt;br /&gt;
1219: Mutually Assured Destruction&lt;br /&gt;
1220: Guns of the Navar0wned&lt;br /&gt;
1221: Brothers in Harms&lt;br /&gt;
1222: Medals of Honor&lt;br /&gt;
1223: S*M*A*S*H&lt;br /&gt;
1224: Crockets Are Such B.S.&lt;br /&gt;
1225: Geneva Contravention&lt;br /&gt;
1226: Semper Fry&lt;br /&gt;
1227: Worth a Thousand Words&lt;br /&gt;
1228: Gore-a! Gore-a! Gore-a!&lt;br /&gt;
1229: War Crime Spybunal&lt;br /&gt;
1230: Frags of our Fathers&lt;br /&gt;
1231: Dominator&lt;br /&gt;
1232: Ride of the Valkartie&lt;br /&gt;
1233: Screamin' Eagle&lt;br /&gt;
1234: The Longest Daze&lt;br /&gt;
1235: Hamburger Hill&lt;br /&gt;
1236: Soldier Milestone 1&lt;br /&gt;
1237: Soldier Milestone 2&lt;br /&gt;
1238: Soldier Milestone 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Demoman Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1301: Kilt in Action&lt;br /&gt;
1302: Tam O'Shatter&lt;br /&gt;
1303: Shorn Connery&lt;br /&gt;
1304: Laddy Macdeth&lt;br /&gt;
1305: Caber Toss&lt;br /&gt;
1306: Double Mauled Scotch&lt;br /&gt;
1307: Loch Ness Bombster&lt;br /&gt;
1308: Three Times a Laddy&lt;br /&gt;
1309: Blind Fire&lt;br /&gt;
1310: Brainspotting&lt;br /&gt;
1311: Left 4 Heads&lt;br /&gt;
1312: Well Plaid!&lt;br /&gt;
1313: The Scottish Play&lt;br /&gt;
1314: The Argyle Sap&lt;br /&gt;
1315: Slammy Slayvis Woundya&lt;br /&gt;
1316: There Can Be Only One&lt;br /&gt;
1317: Tartan Spartan&lt;br /&gt;
1318: Scotch Guard&lt;br /&gt;
1319: Bravehurt&lt;br /&gt;
1320: Cry Some Moor!&lt;br /&gt;
1321: The Stickening&lt;br /&gt;
1322: Glasg0wned&lt;br /&gt;
1323: Scotch Tap&lt;br /&gt;
1324: The Targe Charge&lt;br /&gt;
1325: Beat Me Up, Scotty&lt;br /&gt;
1326: Something Stickied This Way Comes&lt;br /&gt;
1327: The High Road&lt;br /&gt;
1328: Bloody Merry&lt;br /&gt;
1329: Second Eye&lt;br /&gt;
1330: He Who Celt It&lt;br /&gt;
1331: Robbed Royal&lt;br /&gt;
1332: Highland Fling&lt;br /&gt;
1333: Pipebagger&lt;br /&gt;
1334: Spynal Tap&lt;br /&gt;
1335: Sticky Thump&lt;br /&gt;
1336: Demoman Milestone 1&lt;br /&gt;
1337: Demoman Milestone 2&lt;br /&gt;
1338: Demoman Milestone 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Achievement_IDs&amp;diff=7440</id>
		<title>Achievement IDs</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Achievement_IDs&amp;diff=7440"/>
		<updated>2009-10-30T15:27:08Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: Fixed incorrect IDs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Achievement Identification Numbers ==&lt;br /&gt;
&lt;br /&gt;
VALVe uses :&lt;br /&gt;
&lt;br /&gt;
'''CTFPlayer::AwardAchievement(int iAchievementID)''' &lt;br /&gt;
&lt;br /&gt;
in order to award a player an achievement. Each achievement has a specific ID number. The list below is a (hopefully) complete list of ID numbers.&lt;br /&gt;
&lt;br /&gt;
Format: &amp;lt;ID Number&amp;gt;: &amp;lt;Name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Special Thanks to '''CShadowRun''' and '''predcrab''' for all their help!&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== General Achievements ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;127: Sentry Gunner&lt;br /&gt;
128: Nemesis&lt;br /&gt;
129: Hard To Kill&lt;br /&gt;
130: Master of Disguise&lt;br /&gt;
131: With Friends Like These&lt;br /&gt;
132: Dynasty&lt;br /&gt;
133: Hardcore&lt;br /&gt;
134: Powerhouse Offense&lt;br /&gt;
135: Lightning Offense&lt;br /&gt;
136: Relentless Offense&lt;br /&gt;
137: Impenetrable Defense&lt;br /&gt;
138: Impossible Defense&lt;br /&gt;
139: Head of the Class&lt;br /&gt;
140: World Traveler&lt;br /&gt;
141: Team Doctor&lt;br /&gt;
142: Flamethrower&lt;br /&gt;
145: Grey Matter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Medic Achievements ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1401: First Do No Harm&lt;br /&gt;
1402: Quadruple Bypass&lt;br /&gt;
1403: Group Health&lt;br /&gt;
1404: Surgical Prep&lt;br /&gt;
1405: Trauma Queen&lt;br /&gt;
1406: Double Blind Trial&lt;br /&gt;
1407: Play Doctor&lt;br /&gt;
1408: Triage&lt;br /&gt;
1409: Preventative Medicine&lt;br /&gt;
1410: Consultation&lt;br /&gt;
1411: Does It Hurt When I Do This?&lt;br /&gt;
1412: Peer Review&lt;br /&gt;
1413: Big Pharma&lt;br /&gt;
1414: You'll Feel a Little Prick&lt;br /&gt;
1415: Autoclave&lt;br /&gt;
1416: Blunt Trauma&lt;br /&gt;
1417: Medical Breakthrough&lt;br /&gt;
1418: Blast Assist&lt;br /&gt;
1419: Midwife Crisis&lt;br /&gt;
1420: Ubi concordia, ibi victoria&lt;br /&gt;
1421: Grand Rounds&lt;br /&gt;
1422: Infernal Medicine&lt;br /&gt;
1423: Doctor Assisted Homicide&lt;br /&gt;
1424: Placebo Effect&lt;br /&gt;
1425: Sawbones&lt;br /&gt;
1426: Intern&lt;br /&gt;
1427: Specialist&lt;br /&gt;
1428: Chief of Staff&lt;br /&gt;
1429: Hypocritical Oath&lt;br /&gt;
1430: Medical Intervention&lt;br /&gt;
1431: Second Opinion&lt;br /&gt;
1432: Autopsy Report&lt;br /&gt;
1433: FYI I am A Medic&lt;br /&gt;
1434: Family Practice&lt;br /&gt;
1435: House Call&lt;br /&gt;
1436: Bedside Manner&lt;br /&gt;
1437: Milestone 1&lt;br /&gt;
1438: Milestone 2&lt;br /&gt;
1439: Milestone 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pyro Achievements ===&lt;br /&gt;
&amp;lt;pre&amp;gt;1601: Combined Fire&lt;br /&gt;
1602: Weenie Roast&lt;br /&gt;
1603: Baptism By Fire&lt;br /&gt;
1604: Fire and Forget&lt;br /&gt;
1605: Firewall&lt;br /&gt;
1606: Cooking the Books&lt;br /&gt;
1607: Spontaneous Combustion&lt;br /&gt;
1608: Trailblazer&lt;br /&gt;
1609: Camp Fire&lt;br /&gt;
1610: Lumberjack&lt;br /&gt;
1611: Clearcutter&lt;br /&gt;
1612: Hot on Your Heels&lt;br /&gt;
1613: I Fry&lt;br /&gt;
1614: Firewatch&lt;br /&gt;
1615: Burn Ward&lt;br /&gt;
1616: Hot Potato&lt;br /&gt;
1617: Makin' Bacon&lt;br /&gt;
1618: Plan B&lt;br /&gt;
1619: Pyrotechnics&lt;br /&gt;
1620: Arsonist&lt;br /&gt;
1621: Controlled Burn&lt;br /&gt;
1622: Firefighter&lt;br /&gt;
1623: Pyromancer&lt;br /&gt;
1624: Next of Kindling&lt;br /&gt;
1625: OMGWTFBBQ&lt;br /&gt;
1626: Second Degree Burn&lt;br /&gt;
1627: Got A Light?&lt;br /&gt;
1628: BarbeQueQ&lt;br /&gt;
1629: Hotshot&lt;br /&gt;
1630: Dance Dance Immolation&lt;br /&gt;
1631: Dead Heat&lt;br /&gt;
1632: Pilot Light&lt;br /&gt;
1633: Freezer Burn&lt;br /&gt;
1634: Fire Chief&lt;br /&gt;
1635: Attention Getter&lt;br /&gt;
1637: Milestone 1&lt;br /&gt;
1638: Milestone 2&lt;br /&gt;
1639: Milestone 3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Heavy Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;1501: Iron Kurtain&lt;br /&gt;
1502: Party Loyalty&lt;br /&gt;
1503: Division of Labor&lt;br /&gt;
1504: Red Oktoberfest&lt;br /&gt;
1505: Show Trial&lt;br /&gt;
1506: Crime and Punishment&lt;br /&gt;
1507: Class Struggle&lt;br /&gt;
1508: Soviet Block&lt;br /&gt;
1509: Stalin the Kart&lt;br /&gt;
1510: Supreme Soviet&lt;br /&gt;
1511: Factory Worker&lt;br /&gt;
1512: Soviet Union&lt;br /&gt;
1513: Own the Means of Production&lt;br /&gt;
1514: Krazy Ivan&lt;br /&gt;
1515: Rasputin&lt;br /&gt;
1516: Icing on the Cake&lt;br /&gt;
1517: Crock Block&lt;br /&gt;
1518: Kollectivization&lt;br /&gt;
1519: Spyalectical Materialism&lt;br /&gt;
1520: Permanent Revolution&lt;br /&gt;
1521: Heavy Industry&lt;br /&gt;
1522: Communist Mani-Fisto&lt;br /&gt;
1523: Redistribution of Health&lt;br /&gt;
1524: Rationing&lt;br /&gt;
1525: Vanguard Party&lt;br /&gt;
1527: Pushkin the Kart&lt;br /&gt;
1528: Marxman&lt;br /&gt;
1529: Gorky Parked&lt;br /&gt;
1530: Purge&lt;br /&gt;
1531: Lenin A Hand&lt;br /&gt;
1532: Five Second Plan&lt;br /&gt;
1533: Photostroika&lt;br /&gt;
1534: Konspicuous Konsumption&lt;br /&gt;
1535: Don't Touch Sandvich&lt;br /&gt;
1536: Borscht Belt&lt;br /&gt;
1537: Milestone 1&lt;br /&gt;
1538: Milestone 2&lt;br /&gt;
1539: Milestone 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Scout Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;1001: First Blood&lt;br /&gt;
1002: First Blood, Part 2&lt;br /&gt;
1003: Quick Hook&lt;br /&gt;
1004: A Year to Remember&lt;br /&gt;
1005: The Cycle&lt;br /&gt;
1006: Closer&lt;br /&gt;
1007: If You Build it&lt;br /&gt;
1008: Gun Down&lt;br /&gt;
1009: Butter Up&lt;br /&gt;
1010: Doctoring the ball&lt;br /&gt;
1011: Dodgers 1, Giants 0&lt;br /&gt;
1012: Batting the Doctor&lt;br /&gt;
1013: I'm Bat Man&lt;br /&gt;
1014: Triple Steal&lt;br /&gt;
1015: Pop Fly&lt;br /&gt;
1016: Round-Tripper&lt;br /&gt;
1017: Artful Dodger&lt;br /&gt;
1018: Fall Classic&lt;br /&gt;
1019: Strike Zone&lt;br /&gt;
1020: Foul Territory&lt;br /&gt;
1021: The Big Hurt&lt;br /&gt;
1022: Brushback&lt;br /&gt;
1023: Moon Shot&lt;br /&gt;
1024: Beanball&lt;br /&gt;
1025: Retire the Runner&lt;br /&gt;
1026: Caught Napping&lt;br /&gt;
1027: Side Retired&lt;br /&gt;
1028: Triple Play&lt;br /&gt;
1029: Stealing Home&lt;br /&gt;
1030: Set the Table&lt;br /&gt;
1031: Block the Plate&lt;br /&gt;
1032: Belittled Beleaguer&lt;br /&gt;
1033: No-Hitter&lt;br /&gt;
1034: Race for the Pennant&lt;br /&gt;
1035: Out of the Park&lt;br /&gt;
1036: Milestone 1&lt;br /&gt;
1037: Milestone 2&lt;br /&gt;
1038: Milestone 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Sniper Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1101: Rode Hard, Put Away Wet&lt;br /&gt;
1102: Be polite&lt;br /&gt;
1103: Be Efficient&lt;br /&gt;
1104: Have a Plan&lt;br /&gt;
1105: Kill Everyone You Meet&lt;br /&gt;
1106: Triple Prey&lt;br /&gt;
1107: Self-Destruct Sequence&lt;br /&gt;
1108: De-sentry-lized&lt;br /&gt;
1109: Shoot the Breeze&lt;br /&gt;
1110: Dropped Dead&lt;br /&gt;
1111: the last wave&lt;br /&gt;
1112: australian rules&lt;br /&gt;
1113: Kook the Spook&lt;br /&gt;
1114: Socket to Him&lt;br /&gt;
1115: Jumper Stumper&lt;br /&gt;
1116: Not a Crazed Gunman, Dad&lt;br /&gt;
1117: Trust Your Feelings&lt;br /&gt;
1118: Überectomy&lt;br /&gt;
1119: Consolation Prize&lt;br /&gt;
1120: Enemy at the Gate&lt;br /&gt;
1121: Parting Shot&lt;br /&gt;
1122: My Brilliant Career&lt;br /&gt;
1123: Shock Treatment&lt;br /&gt;
1124: Saturation Bombing&lt;br /&gt;
1125: Rain on Their Parade&lt;br /&gt;
1126: Jarring Transition&lt;br /&gt;
1127: Friendship is Golden&lt;br /&gt;
1128: William Tell Overkill&lt;br /&gt;
1129: Beaux and Arrows&lt;br /&gt;
1130: Robbin’ Hood&lt;br /&gt;
1131: Pincushion&lt;br /&gt;
1132: Number One Assistant&lt;br /&gt;
1133: Jarate Chop&lt;br /&gt;
1134: Shafted&lt;br /&gt;
1135: Dead Reckoning&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Spy Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1701: Triplecrossed&lt;br /&gt;
1702: For Your Eyes Only&lt;br /&gt;
1703: Counter Espionage&lt;br /&gt;
1704: Identity Theft&lt;br /&gt;
1705: The Man from P.U.N.C.T.U.R.E.&lt;br /&gt;
1706: FYI I am a Spy&lt;br /&gt;
1707: The Man with the Broken Guns&lt;br /&gt;
1708: Sapsucker&lt;br /&gt;
1709: May I Cut In?&lt;br /&gt;
1710: Agent Provocateur&lt;br /&gt;
1711: The Melbourne Supremacy&lt;br /&gt;
1712: Spies Like Us&lt;br /&gt;
1713: A Cut Above&lt;br /&gt;
1714: Burn Notice&lt;br /&gt;
1715: Die Another Way&lt;br /&gt;
1716: Constructus Interruptus&lt;br /&gt;
1717: On Her Majesty’s Secret Surface&lt;br /&gt;
1718: Insurance Fraud&lt;br /&gt;
1719: Point Breaker&lt;br /&gt;
1720: High Value Target&lt;br /&gt;
1721: Come in From the Cold&lt;br /&gt;
1722: Wetwork&lt;br /&gt;
1723: You Only Shiv Thrice&lt;br /&gt;
1724: Spymaster&lt;br /&gt;
1725: Sap Auteur&lt;br /&gt;
1726: Joint Operation&lt;br /&gt;
1727: Dr. Nooooo&lt;br /&gt;
1728: Is It Safe?&lt;br /&gt;
1729: Slash and Burn&lt;br /&gt;
1730: Biplomacy&lt;br /&gt;
1731: Skullpluggery&lt;br /&gt;
1732: Sleeper Agent&lt;br /&gt;
1733: Who's Your Daddy?&lt;br /&gt;
1734: Deep Undercover&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Halloween Event Achievements===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1901: Candy Cornoner&lt;br /&gt;
1902: Ghastly Gibus Grab&lt;br /&gt;
1903: Scared Stiff&lt;br /&gt;
1904: Attack 'o Latern&lt;br /&gt;
1905: Costume Contest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=7320</id>
		<title>Writing Extensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=7320"/>
		<updated>2009-07-14T17:31:14Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: &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;
''Note: To enable the Forward interface, you must uncomment the definition &amp;lt;tt&amp;gt;SMEXT_ENABLE_FORWARDSYS&amp;lt;/tt&amp;gt; in smsdk_config.h.''&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;
For VS 2005, goto Project-&amp;gt;Properties.&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;, &amp;lt;tt&amp;gt;_CRT_NONSTDC_NO_DEPRECATE&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SOURCEMOD_BUILD&amp;lt;/tt&amp;gt;  and &amp;lt;tt&amp;gt;WIN32&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>Pheadxdll</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=6999</id>
		<title>Writing Extensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=6999"/>
		<updated>2009-03-06T03:54:47Z</updated>

		<summary type="html">&lt;p&gt;Pheadxdll: /* Compiler Options */&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;
For VS 2005, goto Project-&amp;gt;Properties.&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>Pheadxdll</name></author>
		
	</entry>
</feed>