<?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=Teame06</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=Teame06"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/Teame06"/>
	<updated>2026-04-29T01:08:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Translations_(SourceMod_Scripting)&amp;diff=5001</id>
		<title>Translations (SourceMod Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Translations_(SourceMod_Scripting)&amp;diff=5001"/>
		<updated>2007-08-03T17:21:44Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* Usage in a Plugin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__FORCETOC__&lt;br /&gt;
[[SourceMod]], like its AMX Mod X predecessor, contains a built-in Multi-Lingual Translation layer (&amp;quot;ML&amp;quot;).  The ML system is one of the secondary SourceMod systems designed to make the platform as flexible as possible.  It fully supports UTF-8.&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
The SourceMod ML System is based off the following terms:&lt;br /&gt;
*'''Languages''': Preset languages defined in &amp;lt;tt&amp;gt;configs\languages.cfg&amp;lt;/tt&amp;gt;.  If a language is not in this file, it &amp;lt;b&amp;gt;cannot be translated&amp;lt;/b&amp;gt; until it is added and the in-memory translation cache rebuilt.&lt;br /&gt;
*'''Phrases'''/'''Translation Keys''': Short, generic key phrases used to identify a set of translations.  These reside in configuration files in the &amp;lt;tt&amp;gt;translations&amp;lt;/tt&amp;gt; folder.  These are called &amp;lt;tt&amp;gt;translation files&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*'''Translations''': A given text translation of a phrase for a given language.  These reside in a &amp;lt;tt&amp;gt;translation file&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Note''': Languages and Phrases are both case sensitive.&lt;br /&gt;
&lt;br /&gt;
==File Format==&lt;br /&gt;
The ML Translation File format is in standard Valve configuration form.  It is comprised of one master section, &amp;lt;tt&amp;gt;&amp;quot;Phrases&amp;lt;/tt&amp;gt;,&amp;lt;tt&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt; which contains any number of named sub-sections.  Each sub-section defines one named &amp;lt;tt&amp;gt;Phrase&amp;lt;/tt&amp;gt;, which cannot itself have sub-sections.  It allows the following properties:&lt;br /&gt;
*'''Key''': &amp;quot;#format&amp;quot;&lt;br /&gt;
**'''Value''': Comma-delimited, ordered pairs of indexes and format strings.&lt;br /&gt;
*'''Key''': Two-letter language code.&lt;br /&gt;
**'''Value''': Language translation string.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Phrases&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;Welcome&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;en&amp;quot;		&amp;quot;Welcome to SourceMod&amp;quot;&lt;br /&gt;
		&amp;quot;es&amp;quot;		&amp;quot;Bienvenidos a SourceMod&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, two translations are defined for the &amp;quot;Welcome&amp;quot; phrase - one for English, and one for Spanish.  However, consider a phrase which needs certain words inserted, as in this contrived example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Phrases&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;Pants&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;en&amp;quot;		&amp;quot;pants&amp;quot;&lt;br /&gt;
		&amp;quot;es&amp;quot;		&amp;quot;pantalones&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	//INVALID EXAMPLE: &amp;quot;Bail's pants are on fire&amp;quot;&lt;br /&gt;
	&amp;quot;OnFire_plural&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;en&amp;quot;		&amp;quot;%s's %s are on fire!&amp;quot;&lt;br /&gt;
		&amp;quot;es&amp;quot;		&amp;quot;¡Los %s de %s están en llamas!&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the above example, the word orders have changed.  English inserts the subject first, and the direct object second.  Spanish associates ownership differently -- literally, ''the pants of Bail are on fire.''  This poses a problem for scripters, who always pass format parameters in one order.  To solve this, the &amp;lt;tt&amp;gt;#format&amp;lt;/tt&amp;gt; property was introduced.  This pre-defines the order of format parameters.  Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;quot;Phrases&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	//Example: &amp;quot;Bail's pants are on fire&amp;quot;&lt;br /&gt;
	&amp;quot;OnFire_plural&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;#format&amp;quot;	&amp;quot;{1:s},{2:s}&amp;quot;&lt;br /&gt;
		&amp;quot;en&amp;quot;		&amp;quot;{1}'s {2} are on fire!&amp;quot;&lt;br /&gt;
		&amp;quot;es&amp;quot;		&amp;quot;¡Los {2} de {1} están en llamas&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	//Example: &amp;quot;Hello, Bail!&amp;quot;&lt;br /&gt;
	&amp;quot;Hello&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;#format&amp;quot;	&amp;quot;{1:s}&amp;quot;&lt;br /&gt;
		&amp;quot;en&amp;quot;		&amp;quot;Hello, {1}&amp;quot;&lt;br /&gt;
		&amp;quot;es&amp;quot;		&amp;quot;Hola, {1}&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The format string is comprised of comma delimited sections, each section enclosed in brackets.  Each section has an ''index'' and a ''format specifier'', which are separated with a colon.  Format specifiers follow the general rules of [[Format Class Functions (SourceMod Scripting)|formatting]], however, only the following types are currently allowed:&lt;br /&gt;
*'''d'''/'''i''': Digits/Integer display&lt;br /&gt;
*'''x''': Hexadecimal display&lt;br /&gt;
*'''f''': Floating point display&lt;br /&gt;
*'''s''': String display&lt;br /&gt;
*'''c''': Character display (UTF-8 compatible)&lt;br /&gt;
&lt;br /&gt;
Note that currently, the special &amp;quot;%T&amp;quot; format type is not allowed inside a language translation string.  &lt;br /&gt;
&lt;br /&gt;
=Usage in a Plugin=&lt;br /&gt;
Plugins must call &amp;lt;tt&amp;gt;LoadTranslations&amp;lt;/tt&amp;gt; on each translation file they wish to use.  Failure to do so will cause any translations to fail, even if another plugin loads the same file.  This is to help prevent phrase-clashes between plugins.  &lt;br /&gt;
&lt;br /&gt;
Inline translation works in any [[Format Class Functions (SourceMod Scripting)|format-class]] of functions.  A new format specifier, '%T', is introduced, which instructs the format routine to insert a translated phrase.  Unlike all other format specifiers, this requires a minimum of two parameters:&lt;br /&gt;
*'''1st Parameter''': A string containing the phrase to be translated.&lt;br /&gt;
*'''2nd Parameter''': One of the following:&lt;br /&gt;
**The &amp;lt;tt&amp;gt;LANG_SERVER&amp;lt;/tt&amp;gt; constant, which specifies a translation to the default language.&lt;br /&gt;
**A player ID constant, which specifies a translation to the player's set language.&lt;br /&gt;
*'''3rd Parameter and higher''': Inputs into the phrase's format specifiers, if necessary.&lt;br /&gt;
&lt;br /&gt;
Examples of this are:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new String:name[32], String:buffer[128];&lt;br /&gt;
GetClientName(client, name, sizeof(name));&lt;br /&gt;
PrintToChat(client, &amp;quot;[SourceMod] %T&amp;quot;, &amp;quot;Hello&amp;quot;, client, name);&lt;br /&gt;
Format(buffer, sizeof(buffer), &amp;quot;[SourceMod] %T&amp;quot;, &amp;quot;Hello&amp;quot;, LANG_SERVER, name);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A breakdown of the format parameters:&lt;br /&gt;
*&amp;lt;tt&amp;gt;&amp;quot;Hello&amp;quot;&amp;lt;/tt&amp;gt;: The phrase to translate.&lt;br /&gt;
*&amp;lt;tt&amp;gt;client/LANG_SERVER&amp;lt;/tt&amp;gt;: Who to translate the phrase to.&lt;br /&gt;
*&amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt;: The &amp;quot;Hello&amp;quot; phrase requires one string, so this will appear in the translated phrase.&lt;br /&gt;
&lt;br /&gt;
Lastly, there is a second form of inline translation, using '%t'.  This is only allowed in functions which act directly on one or more clients.  It eliminates the second parameter, and uses the original client specified.  Example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;PrintToChat(client, &amp;quot;[SourceMod] %t&amp;quot;, &amp;quot;Hello&amp;quot;, name);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As you can see from this example, we did not have to specify the client index more than once.  Thus, it is usually more convenient to use the limited '%t' version in functions such as &amp;lt;tt&amp;gt;PrintToChat&amp;lt;/tt&amp;gt;.  However, in functions which are not &amp;quot;player directed,&amp;quot; such as &amp;lt;tt&amp;gt;Format&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;PrintToServer&amp;lt;/tt&amp;gt;, only '%T' can be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Development]][[Category:SourceMod Scripting]]&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=SDKTools_(SourceMod_Scripting)&amp;diff=4793</id>
		<title>SDKTools (SourceMod Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=SDKTools_(SourceMod_Scripting)&amp;diff=4793"/>
		<updated>2007-06-16T22:28:49Z</updated>

		<summary type="html">&lt;p&gt;Teame06: OnPluginInit to OnPluginStart&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The SDKTools extension is an extension for various functions provided by the Source SDK.  Additionally, it has the ability to dynamically call many C++ functions in the SDK, for example, from CBaseEntity or any derived class.&lt;br /&gt;
&lt;br /&gt;
SDKTools contains simplified versions of SDK functions pre-written for ease of use.  These can be found in the additional include files:&lt;br /&gt;
*&amp;lt;tt&amp;gt;sdktools_functions.inc&amp;lt;/tt&amp;gt; - Popular functions from the SDK.&lt;br /&gt;
&lt;br /&gt;
SDKTools is powered by &amp;quot;BinTools,&amp;quot; a powerful extension for creating dynamic C/C++ calls.  BinTools is automatically loaded by SDKTools.&lt;br /&gt;
&lt;br /&gt;
=GameConfigs=&lt;br /&gt;
GameConfig files go into the &amp;quot;gamedata&amp;quot; folder under &amp;quot;sourcemod.&amp;quot;  In older revisions it was under &amp;quot;sourcemod/configs&amp;quot; which is now deprecated.&lt;br /&gt;
&lt;br /&gt;
==Virtual Offsets==&lt;br /&gt;
For adding virtual offsets, add sub-sections to the &amp;quot;Offsets&amp;quot; section of your game config file.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Games&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;cstrike&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;Offsets&amp;quot;&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;GiveNamedItem&amp;quot;&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;windows&amp;quot;	&amp;quot;329&amp;quot;&lt;br /&gt;
				&amp;quot;linux&amp;quot;		&amp;quot;330&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
			&amp;quot;EyePosition&amp;quot;&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;windows&amp;quot;	&amp;quot;117&amp;quot;&lt;br /&gt;
				&amp;quot;linux&amp;quot;		&amp;quot;118&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Signature Scans==&lt;br /&gt;
For automated signature scans, add sub-sections to the &amp;quot;Signatures&amp;quot; section of your game config file.  There are three properties for a signature:&lt;br /&gt;
*&amp;lt;tt&amp;gt;library&amp;lt;/tt&amp;gt;: Must be &amp;quot;server&amp;quot; right now.&lt;br /&gt;
*&amp;lt;tt&amp;gt;windows&amp;lt;/tt&amp;gt;: A signature written in binary; for example, &amp;quot;\x56&amp;quot; instead of &amp;quot;0x56&amp;quot; -- the '*' character is a single byte wildcard.&lt;br /&gt;
*&amp;lt;tt&amp;gt;linux&amp;lt;/tt&amp;gt;: Either a signature as with &amp;lt;tt&amp;gt;windows&amp;lt;/tt&amp;gt;, or a named symbol.  To use a named symbol, start the string with the '@' character.  If a signature begins with '@', write the character in hexadecimal as above.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Games&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;cstrike&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;Signatures&amp;quot;&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;RoundRespawn&amp;quot;&lt;br /&gt;
			{&lt;br /&gt;
				&amp;quot;library&amp;quot;	&amp;quot;server&amp;quot;&lt;br /&gt;
				&amp;quot;windows&amp;quot;	&amp;quot;\x56\x8B\xF1\x8B\x06\xFF\x90*\x04\x00\x00\x8B\x86*\x0D\x00&amp;quot;&lt;br /&gt;
				&amp;quot;linux&amp;quot;		&amp;quot;@_ZN9CCSPlayer12RoundRespawnEv&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Inheritance==&lt;br /&gt;
If you wish for multiple mods to inherit from one block, you can add a special &amp;quot;#supported&amp;quot; section under a &amp;quot;#default&amp;quot; section.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;quot;Games&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;#default&amp;quot;&lt;br /&gt;
	{&lt;br /&gt;
		&amp;quot;#supported&amp;quot;&lt;br /&gt;
		{&lt;br /&gt;
			&amp;quot;game&amp;quot;		&amp;quot;dod&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This specifies that the given block will be read for Day of Defeat as well.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Calling Functions=&lt;br /&gt;
Calling functions is complicated and requires strict attention to the C++ API you are trying to use.  If you make a mistake, something bad '''will''' happen (and if not, you got lucky!)  SDKTools is more complicated than PimpinJuice's &amp;quot;Hacks&amp;quot; extension because it precompiles all of the information needed to convert from Plugin memory to C++ types.  This precompilation step ensures better safety and speed, but it lengthens the preparation process.&lt;br /&gt;
&lt;br /&gt;
With that said, let's look at an overview of the call creation process.  Before making calls, we must ''prepare'' the call.  This will give us a &amp;lt;tt&amp;gt;Handle&amp;lt;/tt&amp;gt; which will let us make as many calls as we like.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Init&amp;lt;/b&amp;gt; - The preparation must be initialized.  Here we can specify the calling convention, which is either static, or BaseEntity/BasePlayer-based.  BasePlayer should be used when only player entities should be allowed as the &amp;lt;tt&amp;gt;this&amp;lt;/tt&amp;gt; pointer.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Destination&amp;lt;/b&amp;gt; - The call must have a destination address or virtual index to use.  This is normally done via &amp;lt;tt&amp;gt;PrepSDKCall_SetFromConf&amp;lt;/tt&amp;gt; which ties into gameconf files.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Return Info&amp;lt;/b&amp;gt; - If the call has return information, it must be set via &amp;lt;tt&amp;gt;PrepSDKCall_SetReturnInfo&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Parameters&amp;lt;/b&amp;gt; - Each parameter (if any) must be added with &amp;lt;tt&amp;gt;PrepSDKCall_AddParameter&amp;lt;/tt&amp;gt;.&amp;lt;/li&amp;gt;&lt;br /&gt;
 &amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Finalize&amp;lt;/b&amp;gt; - The call must be finalized with &amp;lt;tt&amp;gt;EndPrepSDKCall&amp;lt;/tt&amp;gt;, which will return a &amp;lt;tt&amp;gt;Handle&amp;lt;/tt&amp;gt;.  If it doesn't, one or more of the preparation operations failed.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the examples below, consider a plugin called &amp;quot;sdkexamples.sp&amp;quot; which has a gamedata file of &amp;quot;plugin.sdkexamples.txt&amp;quot; containing the definitions in the first section.&lt;br /&gt;
&lt;br /&gt;
==RoundRespawn Example==&lt;br /&gt;
CCSPlayer::RestartRound is a Counter-Strike Source function which respawns players.  It used by CS:S DM.  Prototype:&lt;br /&gt;
&amp;lt;pre&amp;gt;void CCSPlayer::RoundRespawn()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SDKCall example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;sourcemod&amp;gt;&lt;br /&gt;
#include &amp;lt;sdktools&amp;gt;&lt;br /&gt;
&lt;br /&gt;
new Handle:hGameConf;&lt;br /&gt;
new Handle:hRoundRespawn;&lt;br /&gt;
&lt;br /&gt;
public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	hGameConf = LoadGameConfigFile(&amp;quot;plugin.sdkexamples&amp;quot;);&lt;br /&gt;
	StartPrepSDKCall(SDKCall_Player);&lt;br /&gt;
	PrepSDKCall_SetFromConf(hGameConf, SDKConf_Signature, &amp;quot;RoundRespawn&amp;quot;);&lt;br /&gt;
	hRoundRespawn = EndPropSDKCall();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
RespawnPlayer(client)&lt;br /&gt;
{&lt;br /&gt;
	SDKCall(hRoundRespawn, client);&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we did not have to set any extra information for parameters or return info, since CCSPlayer::RoundRespawn has no parameters and has a void return.&lt;br /&gt;
&lt;br /&gt;
==GiveNamedItem Example==&lt;br /&gt;
GiveNamedItem will give a player a named item.  Prototype:&lt;br /&gt;
&amp;lt;pre&amp;gt;virtual CBaseEntity *CBasePlayer::GiveNamedItem(const char *item, int iSubType = 0);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;sourcemod&amp;gt;&lt;br /&gt;
#include &amp;lt;sdktools&amp;gt;&lt;br /&gt;
&lt;br /&gt;
new Handle:hGameConf;&lt;br /&gt;
new Handle:hGiveNamedItem;&lt;br /&gt;
&lt;br /&gt;
public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	hGameConf = LoadGameConfigFile(&amp;quot;plugin.sdkexamples&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	StartPrepSDKCall(SDKCall_Player);&lt;br /&gt;
	PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, &amp;quot;GiveNamedItem&amp;quot;);&lt;br /&gt;
	PrepSDKCall_SetReturnInfo(SDKType_CBaseEntity, SDKPass_Pointer);&lt;br /&gt;
	PrepSDKCall_AddParameter(SDKType_String, SDKPass_Pointer);&lt;br /&gt;
	PrepSDKCall_AddParameter(SDKType_PlainOldData, SDKPass_Plain);&lt;br /&gt;
	hGiveNamedItem = EndPropSDKCall();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GiveItem(client, const String:item[])&lt;br /&gt;
{&lt;br /&gt;
	return SDKCall(hGiveNamedItem, client, item, 0);&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==GetEyePosition Example==&lt;br /&gt;
Prototype:&lt;br /&gt;
&amp;lt;pre&amp;gt;virtual Vector CBaseEntity::EyePosition();&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;sourcemod&amp;gt;&lt;br /&gt;
#include &amp;lt;sdktools&amp;gt;&lt;br /&gt;
&lt;br /&gt;
new Handle:hGameConf;&lt;br /&gt;
new Handle:hGetEyePosition;&lt;br /&gt;
&lt;br /&gt;
public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	hGameConf = LoadGameConfigFile(&amp;quot;plugin.sdkexamples&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	StartPrepSDKCall(SDKCall_Player);&lt;br /&gt;
	PrepSDKCall_SetFromConf(hGameConf, SDKConf_Virtual, &amp;quot;EyePosition&amp;quot;);&lt;br /&gt;
	PrepSDKCall_SetReturnInfo(SDKType_Vector, SDKPass_ByValue);&lt;br /&gt;
	hGetEyePosition= EndPropSDKCall();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
GetEyePosition(client, Float:pos[3])&lt;br /&gt;
{&lt;br /&gt;
	SDKCall(hGetEyePosition, client, pos);&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that the vector is returned as the third parameter (first parameter after the &amp;lt;tt&amp;gt;this&amp;lt;/tt&amp;gt; pointer).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=See Also=&lt;br /&gt;
*[[CCSPlayer_offset_list_(SourceMM)|CCSPlayer Offsets]]&lt;br /&gt;
*[[CBaseCombatWeapon_CSS_offset_list_(SourceMM)|CBaseCombatWeapon (CS:S) Offsets]]&lt;br /&gt;
*[[CDODPlayer_offset_list_%28SourceMM%29|CDODPlayer Offsets]]&lt;br /&gt;
*[[CHL2MP_Player_offset_list_%28SourceMM%29|CHL2MPPlayer Offsets]]&lt;br /&gt;
*[[HL2CTF_CHL2_Player_offset_list_%28SourceMM%29|CHL2Player (HL2CTF) Offsets]]&lt;br /&gt;
*[[Dystopia_CDYSPlayer_offset_list_%28SourceMM%29|CDYSPlayer (Dystopia) Offsets]]&lt;br /&gt;
*[[Empires_CSDKPlayer_offset_list_%28SourceMM%29|CSDKPlayer (Empires) Offsets]]&lt;br /&gt;
*[[Useful_Signatures_%28Source%29|Useful Signatures (Source)]]&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Scripting]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=4551</id>
		<title>Writing Extensions</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Writing_Extensions&amp;diff=4551"/>
		<updated>2007-05-25T19:31:06Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* External Interfaces */&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;smsdk_config.h&amp;lt;/tt&amp;gt; - Configuration settings (we will be editing this)&lt;br /&gt;
*&amp;lt;tt&amp;gt;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;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;
	g_pShareSys-&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;
	g_pShareSys-&amp;gt;AddNatives(myself, MyNatives);&lt;br /&gt;
	g_pSayChat = g_pForwards-&amp;gt;CreateForward(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;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;
	g_pForwards-&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 = g_pForwards-&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;
	g_pShareSys-&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.  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;g_pShareSys&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;g_pHandleSys&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;g_pForwards&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;
==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;
	g_pShareSys-&amp;gt;AddDependency(myself, &amp;quot;thread.ext&amp;quot;, true, true);&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two boolean parameters to &amp;lt;tt&amp;gt;AddDependency&amp;lt;/tt&amp;gt; mean, respectively: &amp;quot;try to automatically load this extension&amp;quot; and &amp;quot;this extension cannot work without the dependency.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Second, we query for the interface in &amp;lt;tt&amp;gt;SDK_OnAllLoaded&amp;lt;/tt&amp;gt;.  Since we don't know when &amp;lt;tt&amp;gt;thread.ext&amp;lt;/tt&amp;gt; will actually be loaded, we have to wait until everything is definitely loaded.&lt;br /&gt;
&amp;lt;cpp&amp;gt;IThreader *g_pThreader = NULL;&lt;br /&gt;
/* ... */&lt;br /&gt;
void Sample::SDK_OnAllLoaded()&lt;br /&gt;
{&lt;br /&gt;
	SM_GET_LATE_IFACE(THREADER, g_pThreader);&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Third, we need to find a way to fail if this interface was never found.  The way to do this is by uncommenting &amp;lt;tt&amp;gt;QueryRunning&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;extension.h&amp;lt;/tt&amp;gt; and implementing it:&lt;br /&gt;
&amp;lt;cpp&amp;gt;bool Sample::QueryRunning(char *error, size_t err_max)&lt;br /&gt;
{&lt;br /&gt;
	SM_CHECK_IFACE(THREADER, g_pThreader);&lt;br /&gt;
	return true;&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When SourceMod queries your extension, the macro above will either validate the pointer or return false.  If it returns false, SourceMod marks your extension as failed.&lt;br /&gt;
&lt;br /&gt;
==Caveats==&lt;br /&gt;
===NULL Interfaces===&lt;br /&gt;
There are a few ways that external interfaces can make your code complicated.  The first is simple but a common oversight.  Don't assume interfaces will be okay.  For example, say we want to create a thread once we get the &amp;lt;tt&amp;gt;IThreader&amp;lt;/tt&amp;gt; interface.  Our code should something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;cpp&amp;gt;void Sample::SDK_OnAllLoaded()&lt;br /&gt;
{&lt;br /&gt;
	SM_GET_IFACE(THREADER, g_pThreader);&lt;br /&gt;
	&lt;br /&gt;
	if (QueryRunning(NULL, 0))&lt;br /&gt;
	{&lt;br /&gt;
		g_pThreader-&amp;gt;MakeThread(/* stuff */);&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we ''query ourself'' in order to find if it's safe to continue executing code.  We could also have simply checked if &amp;lt;tt&amp;gt;g_pThreader&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt;, but self-querying has a bonus: if your extension continues to do things like hook events or add listeners, you will be preventing your extension from entirely initializing itself while one interface is bad.  Always make sure you have sanity checks like this where needed.&lt;br /&gt;
&lt;br /&gt;
===Dynamic Unloading===&lt;br /&gt;
The second major caveat is that extensions can be dynamically unloaded.  If you specified yourself as having a dependency and that each dependency is required, you will have no problem.  Your extension will be unloaded before the interface is removed, and you can clean up memory/hooks in your &amp;lt;tt&amp;gt;SDK_OnUnload()&amp;lt;/tt&amp;gt; code.  There are two situations where this is a different story.&lt;br /&gt;
&lt;br /&gt;
====Optional Interfaces====&lt;br /&gt;
The first situation is if you are not requiring an extension that contains an interface.  Now, when the extension unloads, your extension will not be unloaded first.  This creates a small problem, as you must clean up without being unloaded.  There are two functions you can implement in your extension class to resolve this, both documented in &amp;lt;tt&amp;gt;IExtensionSys.h&amp;lt;/tt&amp;gt;:&lt;br /&gt;
*&amp;lt;tt&amp;gt;QueryInterfaceDrop&amp;lt;/tt&amp;gt; - Allows you to request unloading when a specific interface is unloaded.  This is the default behavior for all interfaces.  If you want to block this functionality, continue reading.&lt;br /&gt;
*&amp;lt;tt&amp;gt;NotifyInterfaceDrop&amp;lt;/tt&amp;gt; - This is called when an interface is dropped.  If your plugin will not be unloaded, you can use this to clean up any resources on a specific interface being removed.&lt;br /&gt;
&lt;br /&gt;
====Circular Dependencies====&lt;br /&gt;
The second situation is a bit more complicated.  It is possible for two extensions to have circular dependencies.  For example:&lt;br /&gt;
*Extension &amp;quot;A&amp;quot; requires extension &amp;quot;B.&amp;quot;&lt;br /&gt;
*Extension &amp;quot;B&amp;quot; requires extension &amp;quot;A.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If either extension is unloaded, the opposite extension is unloaded normally.  The first extension then receives the interface drop callbacks.  In this situation, it is essential that the &amp;lt;tt&amp;gt;NotifyInterfaceDrop&amp;lt;/tt&amp;gt; function be implemented and used with the circular interface.  Otherwise, you risk crashing when your extension unloads (or at the very least, leaking memory).  Since the actual drop order is undefined, it means both extensions must implement this function to be safe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Automatic Loading=&lt;br /&gt;
There are two types of automatic loading: Dynamic and Global.  Dynamic loading means your extension is only loaded when a plugin requires it.  Global loading means your extension loads no matter what.&lt;br /&gt;
&lt;br /&gt;
==Dynamic Autoloading==&lt;br /&gt;
Dynamic loading requires that you create an include file for plugins.  Plugins that include your file will automatically load your extension.  This requires implementing the &amp;lt;tt&amp;gt;Extension&amp;lt;/tt&amp;gt; structure found in &amp;lt;tt&amp;gt;core.inc&amp;lt;/tt&amp;gt;.  You must expose the structure as &amp;lt;tt&amp;gt;public&amp;lt;/tt&amp;gt;, and the name must start with &amp;quot;&amp;lt;tt&amp;gt;__ext_&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;/**&lt;br /&gt;
 * Do not edit below this line!&lt;br /&gt;
 */&lt;br /&gt;
public Extension:__ext_geoip = &lt;br /&gt;
{&lt;br /&gt;
	name = &amp;quot;GeoIP&amp;quot;,&lt;br /&gt;
	file = &amp;quot;geoip.ext&amp;quot;,&lt;br /&gt;
#if defined AUTOLOAD_EXTENSIONS&lt;br /&gt;
	autoload = 1,&lt;br /&gt;
#else&lt;br /&gt;
	autoload = 0,&lt;br /&gt;
#endif&lt;br /&gt;
#if defined REQUIRE_EXTENSIONS&lt;br /&gt;
	required = 1,&lt;br /&gt;
#else&lt;br /&gt;
	required = 0,&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explanations:&lt;br /&gt;
*&amp;lt;b&amp;gt;name&amp;lt;/b&amp;gt;: The name of your module as written in &amp;lt;tt&amp;gt;SMEXT_CONF_NAME&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;b&amp;gt;file&amp;lt;/b&amp;gt;: The platform-inspecific portion of your extension's file name.&lt;br /&gt;
*&amp;lt;b&amp;gt;autoload&amp;lt;/b&amp;gt;: Specifies that your module should always dynamically autoload by default.  You can tweak this to either never autoload or always autoload (without letting the user toggle).&lt;br /&gt;
*&amp;lt;b&amp;gt;required&amp;lt;/b&amp;gt;: Specifies whether or not this extension is '''required''' by your plugin.  If for some reason your extension fails to load (or is not found), the plugin will also fail to load.  This is changeable if you wish to override the default behavior.&lt;br /&gt;
&lt;br /&gt;
You can copy and paste this example, but remember to modify the following portions:&lt;br /&gt;
*&amp;lt;b&amp;gt;__ext_geoip&amp;lt;/b&amp;gt;: Change the &amp;quot;geoip&amp;quot; portion to your own unique variable name.&lt;br /&gt;
*&amp;lt;b&amp;gt;&amp;quot;GeoIP&amp;lt;/b&amp;gt;: Change the GeoIP portion to your extension's name.  This should match the name you chose as &amp;lt;tt&amp;gt;SMEXT_CONF_NAME&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;b&amp;gt;&amp;quot;geoip.ext&amp;quot;&amp;lt;/b&amp;gt;: Change this to your extension's file name, without the .dll/.so portion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Global Autoloading==&lt;br /&gt;
To have your extension always autoload, you must create a ''.autoload'' file in the &amp;lt;tt&amp;gt;extensions&amp;lt;/tt&amp;gt; folder.  For example, to have the &amp;lt;tt&amp;gt;threader.ext.dll&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;threader.ext.so&amp;lt;/tt&amp;gt; extensions autoload, you'd create the following file in &amp;lt;tt&amp;gt;extensions&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;threader.autoload&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A few notes:&lt;br /&gt;
*This only works for extensions using the .ext.&amp;lt;platform&amp;gt; convention.  SourceMod cuts off the &amp;quot;.autoload&amp;quot; portion of the file, then adds on &amp;quot;.ext.dll&amp;quot; or &amp;quot;.ext.so&amp;quot; which will not work on custom files.&lt;br /&gt;
*The file does not need to contain anything, it simply needs to exist.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Conventions=&lt;br /&gt;
&lt;br /&gt;
==Designing API/Natives==&lt;br /&gt;
*Start interface names with the capital letter 'I'.&lt;br /&gt;
*Use a consistent naming convention.  SourceMod uses [http://msdn2.microsoft.com/en-us/library/ms229002.aspx Microsoft/Pascal] naming.  Avoid Java/Camel casing for both API and natives.&lt;br /&gt;
*When exposing interfaces, make sure your exposure defines start with &amp;lt;tt&amp;gt;SMINTERFACE_&amp;lt;/tt&amp;gt; and end with &amp;lt;tt&amp;gt;_NAME&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;_VERSION&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==External Naming==&lt;br /&gt;
*Logtags (&amp;lt;tt&amp;gt;SMEXT_CONF_LOGTAG&amp;lt;/tt&amp;gt;) should be short names (under 10 characters or so) in all capital letters.&lt;br /&gt;
*Your extension file name should never have &amp;lt;tt&amp;gt;_i486&amp;lt;/tt&amp;gt; or other unnecessary platform-specific notations in its name.&lt;br /&gt;
*Your extension file name should always end in &amp;lt;tt&amp;gt;.ext.so&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;.ext.dll&amp;lt;/tt&amp;gt; depending on the platform.  The &amp;lt;tt&amp;gt;.ext.&amp;lt;/tt&amp;gt; is SourceMod convention.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Setting up Visual Studio=&lt;br /&gt;
==Paths==&lt;br /&gt;
'''Visual Studio 2003''': Tools -&amp;gt; Options -&amp;gt; Projects, VC++ Directories&lt;br /&gt;
&lt;br /&gt;
'''Visual Studio 2005''': Tools -&amp;gt; Options -&amp;gt; Projects and Solutions -&amp;gt; VC++ Directories&lt;br /&gt;
&lt;br /&gt;
===Include Paths===&lt;br /&gt;
*SourceMod only:&lt;br /&gt;
**sdk\public\extensions&lt;br /&gt;
**sdk\public\sourcepawn&lt;br /&gt;
**sdk\public&lt;br /&gt;
*SourceMM (Note that sourcemm might be 'trunk' for you):&lt;br /&gt;
**sourcemm\sourcemm&lt;br /&gt;
**sourcemm\sourcehook&lt;br /&gt;
**sourcemm&lt;br /&gt;
*HL2SDK:&lt;br /&gt;
**game_shared&lt;br /&gt;
**public\vstdlib&lt;br /&gt;
**public\tier1&lt;br /&gt;
**public\tier0&lt;br /&gt;
**public\engine&lt;br /&gt;
**public\dlls&lt;br /&gt;
**public&lt;br /&gt;
**dlls&lt;br /&gt;
&lt;br /&gt;
===Link Paths===&lt;br /&gt;
*HL2SDK:&lt;br /&gt;
**lib\public for version 2005&lt;br /&gt;
**lib-vc7\public for version 2003&lt;br /&gt;
&lt;br /&gt;
==Compiler Options==&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; These options are set by default in the sample Extension SDK.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt; These options should be set for every build (Release/Debug/others).&lt;br /&gt;
&lt;br /&gt;
*General&lt;br /&gt;
**&amp;lt;tt&amp;gt;Character Set&amp;lt;/tt&amp;gt;: '''Use Multi-Byte Character Set'''&lt;br /&gt;
*C/C++&lt;br /&gt;
**General&lt;br /&gt;
***&amp;lt;tt&amp;gt;Detect 64-bit Portability Issues&amp;lt;/tt&amp;gt;: '''No'''&lt;br /&gt;
**Preprocessor&lt;br /&gt;
***&amp;lt;tt&amp;gt;Preprocessor Defines&amp;lt;/tt&amp;gt;: Add &amp;lt;tt&amp;gt;_CRT_SECURE_NO_DEPRECATE&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;_CRT_NONSTDC_NO_DEPRECATE&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SOURCEMOD_BUILD&amp;lt;/tt&amp;gt;&lt;br /&gt;
**Code Generation&lt;br /&gt;
***&amp;lt;tt&amp;gt;Runtime Library&amp;lt;/tt&amp;gt;: Multi-threaded or /MT (for Release), Multi-threaded Debug or /MTd (for Debug)&lt;br /&gt;
*Linker&lt;br /&gt;
**General&lt;br /&gt;
***&amp;lt;tt&amp;gt;Output File&amp;lt;/tt&amp;gt;: Change &amp;lt;tt&amp;gt;$(ProjectName)&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;$(ProjectName).ext&amp;lt;/tt&amp;gt;, or use your own custom string.&lt;br /&gt;
**Input&lt;br /&gt;
***&amp;lt;tt&amp;gt;Additional Dependencies&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;tier0.lib tier1.lib vstdlib.lib&amp;lt;/tt&amp;gt; (for SourceMM attached extensions only)&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod]]&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Commands_(SourceMod_Scripting)&amp;diff=4443</id>
		<title>Commands (SourceMod Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Commands_(SourceMod_Scripting)&amp;diff=4443"/>
		<updated>2007-04-01T00:27:07Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* Client-Only Commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[SourceMod]] allows you to create console commands similar to [[AMX Mod X]].  There are two main types of console commands:&lt;br /&gt;
*'''Server Commands''', which are fired from one of the following input methods:&lt;br /&gt;
**the server console itself;&lt;br /&gt;
**the remove console (RCON);&lt;br /&gt;
**the ServerCommand() function, either from SourceMod or the [[Half-Life 2]] engine.&lt;br /&gt;
*'''Console Commands''', which are fired from one of the following input methods:&lt;br /&gt;
**a client's console&lt;br /&gt;
**any of the server command input methods &lt;br /&gt;
&lt;br /&gt;
For server commands, there is no client index.  For console/client commands, there is a client index, but it may be 0 to indicate that the command is from the server.&lt;br /&gt;
&lt;br /&gt;
Note that button &amp;quot;commands,&amp;quot; such as +attach and +duck, are not actually console commands.  They are a separate command stream sent over the network, as they need to be tied to a specific frame.  &lt;br /&gt;
&lt;br /&gt;
=Server Commands=&lt;br /&gt;
As noted above, server commands are fired through the server console, whether remote, local, or through the Source engine.  There is no client index associated with a server command.  &lt;br /&gt;
&lt;br /&gt;
Server commands are registered through the &amp;lt;tt&amp;gt;RegServerCmd()&amp;lt;/tt&amp;gt; function, listed in &amp;lt;tt&amp;gt;console.inc&amp;lt;/tt&amp;gt;.  When registering a server command, you may be hooking an already existing command, and thus whether you return &amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Plugin_Continue&amp;lt;/tt&amp;gt; is important.  &lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Continue&amp;lt;/tt&amp;gt;: The original server command will be processed, if there was one.  If the server command was created by a plugin, this has no effect.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt;: The original server command will not be processed, if there was one.  If the server command was created by a plugin, this has no effect.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Stop&amp;lt;/tt&amp;gt;: This original server command will not be processed, if there was one.  Additionally, no further hooks will be called for this command until it is fired again.&lt;br /&gt;
&lt;br /&gt;
==Adding Server Commands==&lt;br /&gt;
Let's say we want to add a test command to show how Half-Life 2 breaks down command arguments.  A possible implementation might be:&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegServerCmd(&amp;quot;test_command&amp;quot;, Command_Test)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Test(args)&lt;br /&gt;
{&lt;br /&gt;
	new String:arg[128]&lt;br /&gt;
	new String:full[256]&lt;br /&gt;
&lt;br /&gt;
	GetCmdArgString(full, sizeof(full))&lt;br /&gt;
&lt;br /&gt;
	PrintToServer(&amp;quot;Argument string: %s&amp;quot;, full)&lt;br /&gt;
	PrintToServer(&amp;quot;Argument count: %d&amp;quot;, args)&lt;br /&gt;
	for (new i=1; i&amp;lt;=args; i++)&lt;br /&gt;
	{&lt;br /&gt;
		GetCmdArg(i, arg, sizeof(arg))&lt;br /&gt;
		PrintToServer(&amp;quot;Argument %d: %s&amp;quot;, i, arg)&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Blocking Server Commands==&lt;br /&gt;
Let's say we wanted to disable the &amp;quot;kickid&amp;quot; command on the server.  There's no real good reason to do this, but for example's sake:&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegServerCmd(&amp;quot;kickid&amp;quot;, Command_KickId)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Kickid(args)&lt;br /&gt;
{&lt;br /&gt;
	return Plugin_Handled&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Console Commands=&lt;br /&gt;
Unlike server commands, console commands can be triggered by either the server or the client, so the callback function receives a client index as well as the argument count.  If the server fired the command, the client index will be 0.  &lt;br /&gt;
&lt;br /&gt;
When returning the &amp;lt;tt&amp;gt;Action&amp;lt;/tt&amp;gt; from the callback, the following effects will happen:&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Continue&amp;lt;/tt&amp;gt;: The original functionality of the command (if any) will still be processed.  If there was no original functionality, the client will receive &amp;quot;Unknown command&amp;quot; in their console.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt;: The original functionality of the command (if any) will be blocked.  If there was no functionality originally, this prevents clients from seeing &amp;quot;Unknown command&amp;quot; in their console.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Stop&amp;lt;/tt&amp;gt;: Same as &amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt;, except that this will be the last hook called.&lt;br /&gt;
&lt;br /&gt;
Note that, unlike AMX Mod X, SourceMod does not allow you to register command filters.  I.e., there is no equivalent to this notation:&lt;br /&gt;
&amp;lt;pawn&amp;gt;register_clcmd(&amp;quot;say /ff&amp;quot;, &amp;quot;Command_SayFF&amp;quot;);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This notation was removed to make our internal code simpler and faster.  Writing the same functionality is easy, and demonstrated below.&lt;br /&gt;
&lt;br /&gt;
==Adding Commands==&lt;br /&gt;
Adding client commands is very simple.  Let's port our earlier testing command to display information about the client as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegConsoleCmd(&amp;quot;test_command&amp;quot;, Command_Test)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Test(client, args)&lt;br /&gt;
{&lt;br /&gt;
	new String:arg[128]&lt;br /&gt;
	new String:full[256]&lt;br /&gt;
&lt;br /&gt;
	GetCmdArgString(full, sizeof(full))&lt;br /&gt;
&lt;br /&gt;
	if (client)&lt;br /&gt;
	{&lt;br /&gt;
		new String:name[32]&lt;br /&gt;
		GetClientName(client, name, sizeof(name))&lt;br /&gt;
		PrintToServer(&amp;quot;Command from client: %s&amp;quot;, name);&lt;br /&gt;
	} else {&lt;br /&gt;
		PrintToServer(&amp;quot;Command from server.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	PrintToServer(&amp;quot;Argument string: %s&amp;quot;, full)&lt;br /&gt;
	PrintToServer(&amp;quot;Argument count: %d&amp;quot;, args)&lt;br /&gt;
	for (new i=1; i&amp;lt;=args; i++)&lt;br /&gt;
	{&lt;br /&gt;
		GetCmdArg(i, arg, sizeof(arg))&lt;br /&gt;
		PrintToServer(&amp;quot;Argument %d: %s&amp;quot;, i, arg)&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hooking Commands==&lt;br /&gt;
A common example is hooking the say command.  Let's say we want to tell players whether FF is enabled when they say '/ff' in game.  &lt;br /&gt;
&lt;br /&gt;
Before we implement this, a common point of confusion with the 'say' command is that Half-Life 2 (and Half-Life 1), by default, send it with the text in one big quoted string.  This means if you say &amp;quot;I like hot dogs,&amp;quot; your command will be broken down as such:&lt;br /&gt;
*Argument string: &amp;quot;I like hot dogs&amp;quot;&lt;br /&gt;
*Argument count: 1&lt;br /&gt;
*Argument #1: I like hot dogs&lt;br /&gt;
&lt;br /&gt;
However, if a player types this in their console: &amp;lt;tt&amp;gt;say I like yams&amp;lt;/tt&amp;gt;, it will be broken up as:&lt;br /&gt;
*Argument string: I like hot dogs&lt;br /&gt;
*Argument count: 4&lt;br /&gt;
*Argument #1: I&lt;br /&gt;
*Argument #2: like&lt;br /&gt;
*Argument #3: yams&lt;br /&gt;
&lt;br /&gt;
Thus, to take into account both of these situations, we are going to use &amp;lt;tt&amp;gt;GetCmdArgString&amp;lt;/tt&amp;gt; and manually parse the input.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegConsoleCmd(&amp;quot;say&amp;quot;, Command_Say)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Say(client, args)&lt;br /&gt;
{&lt;br /&gt;
	new String:text[192]&lt;br /&gt;
	GetCmdArgString(text, sizeof(text))&lt;br /&gt;
&lt;br /&gt;
	new startidx = 0&lt;br /&gt;
	if (text[0] == '&amp;quot;')&lt;br /&gt;
	{&lt;br /&gt;
		startidx = 1&lt;br /&gt;
		/* Strip the ending quote, if there is one */&lt;br /&gt;
		new len = strlen(text);&lt;br /&gt;
		if (text[len-1] == '&amp;quot;')&lt;br /&gt;
		{&lt;br /&gt;
			text[len-1] = '\0'&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (StrEqual(text[startidx], &amp;quot;/ff&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		new Handle:ff = FindConVar(&amp;quot;mp_friendlyfire&amp;quot;)&lt;br /&gt;
		if (GetConVarInt(ff))&lt;br /&gt;
		{&lt;br /&gt;
			PrintToConsole(client, &amp;quot;Friendly fire is enabled.&amp;quot;)&lt;br /&gt;
		} else {&lt;br /&gt;
			PrintToConsole(client, &amp;quot;Friendly fire is disabled.&amp;quot;)&lt;br /&gt;
		}&lt;br /&gt;
		/* Block the client's messsage from broadcasting */&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Let say continue normally */&lt;br /&gt;
	return Plugin_Continue&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Admin Commands==&lt;br /&gt;
Let's create a simple admin command which kicks another player by their full name.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegAdminCmd(&amp;quot;admin_kick&amp;quot;,&lt;br /&gt;
		Command_Kick,&lt;br /&gt;
		ADMFLAG_KICK,&lt;br /&gt;
		&amp;quot;Kicks a player by name&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Kick(client, args)&lt;br /&gt;
{&lt;br /&gt;
	if (args &amp;lt; 1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Usage: admin_kick &amp;lt;name&amp;gt;&amp;quot;)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	new String:name[32], maxplayers, target = -1&lt;br /&gt;
	GetCmdArg(1, name, sizeof(name))&lt;br /&gt;
&lt;br /&gt;
	maxplayers = GetMaxClients()&lt;br /&gt;
	for (new i=1; i&amp;lt;=maxplayers; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (!IsClientConnected(i))&lt;br /&gt;
		{&lt;br /&gt;
			continue&lt;br /&gt;
		}&lt;br /&gt;
		decl String:other[32]&lt;br /&gt;
		GetClientName(i, other, sizeof(other))&lt;br /&gt;
		if (StrEqual(name, other))&lt;br /&gt;
		{&lt;br /&gt;
			target = i&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (target == -1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Could not find any player with the name: \&amp;quot;%s\&amp;quot;&amp;quot;, name)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ServerCommand(&amp;quot;kickid %d&amp;quot;, GetClientUserId(target));&lt;br /&gt;
&lt;br /&gt;
	return Plugin_Handled&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Immunity==&lt;br /&gt;
In our previous example, we did not take immunity into account.  Immunity is a much more complex system in SourceMod than it was in AMX Mod X, and there is no simple flag to denote its permissions.  Instead, two functions are provided:&lt;br /&gt;
*&amp;lt;tt&amp;gt;CanAdminTarget&amp;lt;/tt&amp;gt;: Tests raw AdminId values for immunity.&lt;br /&gt;
*&amp;lt;tt&amp;gt;CanUserTarget&amp;lt;/tt&amp;gt;: Tests in-game clients for immunity.&lt;br /&gt;
&lt;br /&gt;
While immunity is generally tested ''player versus player'', it is possible you might want to check for immunity and not have a targetting client.  While there is no convenience function for this yet, a good idea might be to check for either ''default'' or ''global'' immunity on the player's groups (these can be user-defined for non-player targeted scenarios).&lt;br /&gt;
&lt;br /&gt;
When checking for immunity, the following heuristics are performed in this exact order:&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;If the targeting AdminId is &amp;lt;tt&amp;gt;INVALID_ADMIN_ID&amp;lt;/tt&amp;gt;, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted AdminId is &amp;lt;tt&amp;gt;INVALID_ADMIN_ID&amp;lt;/tt&amp;gt;, targeting succeeds.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targeting admin has &amp;lt;tt&amp;gt;Admin_Root&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;ADMFLAG_ROOT&amp;lt;/tt&amp;gt;), targeting succeeds.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted admin has global immunity, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted admin has default immunity, and the targeting admin belongs to no groups, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted admin has specific immunity from the targeting admin via group immunities, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If no conclusion is reached via the previous steps, targeting succeeds.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, how can we adapt our function about to use immunity?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public Action:Command_Kick(client, args)&lt;br /&gt;
{&lt;br /&gt;
	if (args &amp;lt; 1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Usage: admin_kick &amp;lt;name&amp;gt;&amp;quot;)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	new String:name[32], maxplayers, target = -1&lt;br /&gt;
	GetCmdArg(1, name, sizeof(name))&lt;br /&gt;
&lt;br /&gt;
	maxplayers = GetMaxClients()&lt;br /&gt;
	for (new i=1; i&amp;lt;=maxplayers; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (!IsClientConnected(i))&lt;br /&gt;
		{&lt;br /&gt;
			continue&lt;br /&gt;
		}&lt;br /&gt;
		decl String:other[32]&lt;br /&gt;
		GetClientName(i, other, sizeof(other))&lt;br /&gt;
		if (StrEqual(name, other))&lt;br /&gt;
		{&lt;br /&gt;
			target = i&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (target == -1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Could not find any player with the name: \&amp;quot;%s\&amp;quot;&amp;quot;, name)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (!CanUserTarget(client, target))&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;You cannot target this client.&amp;quot;)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ServerCommand(&amp;quot;kickid %d&amp;quot;, GetClientUserId(target))&lt;br /&gt;
&lt;br /&gt;
	return Plugin_Handled&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Client-Only Commands=&lt;br /&gt;
SourceMod exposes a forward that is called whenever a client executes any command string in their console, called &amp;lt;tt&amp;gt;OnClientCommand&amp;lt;/tt&amp;gt;.  An example of this looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnClientCommand(client, args)&lt;br /&gt;
{&lt;br /&gt;
	new String:cmd[16]&lt;br /&gt;
	GetCmdArg(0, cmd, sizeof(cmd));	/* Get command name */&lt;br /&gt;
&lt;br /&gt;
	if (StrEqual(cmd, &amp;quot;test_command&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		/* Got the client command! Block it... */&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return Plugin_Continue&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is worth noting that not everything a client sends will be available through this command.  Command registered via external sources in C++ may not be available, especially if they are created via &amp;lt;tt&amp;gt;CON_COMMAND&amp;lt;/tt&amp;gt; in the game mod itself.  For example, &amp;quot;say&amp;quot; is usually implemented this way, because it can be used by both clients and the server, and thus it does not channel through this forward.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Commands_(SourceMod_Scripting)&amp;diff=4023</id>
		<title>Commands (SourceMod Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Commands_(SourceMod_Scripting)&amp;diff=4023"/>
		<updated>2007-03-20T05:32:29Z</updated>

		<summary type="html">&lt;p&gt;Teame06: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[SourceMod]] allows you to create console commands similar to [[AMX Mod X]].  There are two main types of console commands:&lt;br /&gt;
*'''Server Commands''', which are fired from one of the following input methods:&lt;br /&gt;
**the server console itself;&lt;br /&gt;
**the remove console (RCON);&lt;br /&gt;
**the ServerCommand() function, either from SourceMod or the [[Half-Life 2]] engine.&lt;br /&gt;
*'''Console Commands''', which are fired from one of the following input methods:&lt;br /&gt;
**a client's console&lt;br /&gt;
**any of the server command input methods &lt;br /&gt;
&lt;br /&gt;
For server commands, there is no client index.  For console/client commands, there is a client index, but it may be 0 to indicate that the command is from the server.&lt;br /&gt;
&lt;br /&gt;
Note that button &amp;quot;commands,&amp;quot; such as +attach and +duck, are not actually console commands.  They are a separate command stream sent over the network, as they need to be tied to a specific frame.  &lt;br /&gt;
&lt;br /&gt;
=Server Commands=&lt;br /&gt;
As noted above, server commands are fired through the server console, whether remote, local, or through the Source engine.  There is no client index associated with a server command.  &lt;br /&gt;
&lt;br /&gt;
Server commands are registered through the &amp;lt;tt&amp;gt;RegServerCmd()&amp;lt;/tt&amp;gt; function, listed in &amp;lt;tt&amp;gt;console.inc&amp;lt;/tt&amp;gt;.  When registering a server command, you may be hooking an already existing command, and thus whether you return &amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Plugin_Continue&amp;lt;/tt&amp;gt; is important.  &lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Continue&amp;lt;/tt&amp;gt;: The original server command will be processed, if there was one.  If the server command was created by a plugin, this has no effect.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt;: The original server command will not be processed, if there was one.  If the server command was created by a plugin, this has no effect.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Stop&amp;lt;/tt&amp;gt;: This original server command will not be processed, if there was one.  Additionally, no further hooks will be called for this command until it is fired again.&lt;br /&gt;
&lt;br /&gt;
==Adding Server Commands==&lt;br /&gt;
Let's say we want to add a test command to show how Half-Life 2 breaks down command arguments.  A possible implementation might be:&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegServerCmd(&amp;quot;test_command&amp;quot;, Command_Test)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Test(args)&lt;br /&gt;
{&lt;br /&gt;
	new String:arg[128]&lt;br /&gt;
	new String:full[256]&lt;br /&gt;
&lt;br /&gt;
	GetCmdArgString(full, sizeof(full))&lt;br /&gt;
&lt;br /&gt;
	PrintToServer(&amp;quot;Argument string: %s&amp;quot;, full)&lt;br /&gt;
	PrintToServer(&amp;quot;Argument count: %d&amp;quot;, args)&lt;br /&gt;
	for (new i=1; i&amp;lt;=args; i++)&lt;br /&gt;
	{&lt;br /&gt;
		GetCmdArg(i, arg, sizeof(arg))&lt;br /&gt;
		PrintToServer(&amp;quot;Argument %d: %s&amp;quot;, i, arg)&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Blocking Server Commands==&lt;br /&gt;
Let's say we wanted to disable the &amp;quot;kickid&amp;quot; command on the server.  There's no real good reason to do this, but for example's sake:&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegServerCmd(&amp;quot;kickid&amp;quot;, Command_KickId)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Kickid(args)&lt;br /&gt;
{&lt;br /&gt;
	return Plugin_Handled&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Console Commands=&lt;br /&gt;
Unlike server commands, console commands can be triggered by either the server or the client, so the callback function receives a client index as well as the argument count.  If the server fired the command, the client index will be 0.  &lt;br /&gt;
&lt;br /&gt;
When returning the &amp;lt;tt&amp;gt;Action&amp;lt;/tt&amp;gt; from the callback, the following effects will happen:&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Continue&amp;lt;/tt&amp;gt;: The original functionality of the command (if any) will still be processed.  If there was no original functionality, the client will receive &amp;quot;Unknown command&amp;quot; in their console.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt;: The original functionality of the command (if any) will be blocked.  If there was no functionality originally, this prevents clients from seeing &amp;quot;Unknown command&amp;quot; in their console.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Plugin_Stop&amp;lt;/tt&amp;gt;: Same as &amp;lt;tt&amp;gt;Plugin_Handled&amp;lt;/tt&amp;gt;, except that this will be the last hook called.&lt;br /&gt;
&lt;br /&gt;
Note that, unlike AMX Mod X, SourceMod does not allow you to register command filters.  I.e., there is no equivalent to this notation:&lt;br /&gt;
&amp;lt;pawn&amp;gt;register_clcmd(&amp;quot;say /ff&amp;quot;, &amp;quot;Command_SayFF&amp;quot;);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This notation was removed to make our internal code simpler and faster.  Writing the same functionality is easy, and demonstrated below.&lt;br /&gt;
&lt;br /&gt;
==Adding Commands==&lt;br /&gt;
Adding client commands is very simple.  Let's port our earlier testing command to display information about the client as well.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegConsoleCmd(&amp;quot;test_command&amp;quot;, Command_Test)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Test(client, args)&lt;br /&gt;
{&lt;br /&gt;
	new String:arg[128]&lt;br /&gt;
	new String:full[256]&lt;br /&gt;
&lt;br /&gt;
	GetCmdArgString(full, sizeof(full))&lt;br /&gt;
&lt;br /&gt;
	if (client)&lt;br /&gt;
	{&lt;br /&gt;
		new String:name[32]&lt;br /&gt;
		GetClientName(client, name, sizeof(name))&lt;br /&gt;
		PrintToServer(&amp;quot;Command from client: %s&amp;quot;, name);&lt;br /&gt;
	} else {&lt;br /&gt;
		PrintToServer(&amp;quot;Command from server.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	PrintToServer(&amp;quot;Argument string: %s&amp;quot;, full)&lt;br /&gt;
	PrintToServer(&amp;quot;Argument count: %d&amp;quot;, args)&lt;br /&gt;
	for (new i=1; i&amp;lt;=args; i++)&lt;br /&gt;
	{&lt;br /&gt;
		GetCmdArg(i, arg, sizeof(arg))&lt;br /&gt;
		PrintToServer(&amp;quot;Argument %d: %s&amp;quot;, i, arg)&lt;br /&gt;
	}&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hooking Commands==&lt;br /&gt;
A common example is hooking the say command.  Let's say we want to tell players whether FF is enabled when they say '/ff' in game.  &lt;br /&gt;
&lt;br /&gt;
Before we implement this, a common point of confusion with the 'say' command is that Half-Life 2 (and Half-Life 1), by default, send it with the text in one big quoted string.  This means if you say &amp;quot;I like hot dogs,&amp;quot; your command will be broken down as such:&lt;br /&gt;
*Argument string: &amp;quot;I like hot dogs&amp;quot;&lt;br /&gt;
*Argument count: 1&lt;br /&gt;
*Argument #1: I like hot dogs&lt;br /&gt;
&lt;br /&gt;
However, if a player types this in their console: &amp;lt;tt&amp;gt;say I like yams&amp;lt;/tt&amp;gt;, it will be broken up as:&lt;br /&gt;
*Argument string: I like hot dogs&lt;br /&gt;
*Argument count: 4&lt;br /&gt;
*Argument #1: I&lt;br /&gt;
*Argument #2: like&lt;br /&gt;
*Argument #3: yams&lt;br /&gt;
&lt;br /&gt;
Thus, to take into account both of these situations, we are going to use &amp;lt;tt&amp;gt;GetCmdArgString&amp;lt;/tt&amp;gt; and manually parse the input.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegConsoleCmd(&amp;quot;say&amp;quot;, Command_Say)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Say(client, args)&lt;br /&gt;
{&lt;br /&gt;
	new String:text[192]&lt;br /&gt;
	GetCmdArgString(text, sizeof(text))&lt;br /&gt;
&lt;br /&gt;
	new startidx = 0&lt;br /&gt;
	if (text[0] == '&amp;quot;')&lt;br /&gt;
	{&lt;br /&gt;
		startidx = 1&lt;br /&gt;
		/* Strip the ending quote, if there is one */&lt;br /&gt;
		new len = strlen(text);&lt;br /&gt;
		if (text[len-1] == '&amp;quot;')&lt;br /&gt;
		{&lt;br /&gt;
			text[len-1] = '\0'&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (StrEqual(text[startidx], &amp;quot;/ff&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		new Handle:ff = FindConVar(&amp;quot;mp_friendlyfire&amp;quot;)&lt;br /&gt;
		if (GetConVarInt(ff))&lt;br /&gt;
		{&lt;br /&gt;
			PrintToConsole(client, &amp;quot;Friendly fire is enabled.&amp;quot;)&lt;br /&gt;
		} else {&lt;br /&gt;
			PrintToConsole(client, &amp;quot;Friendly fire is disabled.&amp;quot;)&lt;br /&gt;
		}&lt;br /&gt;
		/* Block the client's messsage from broadcasting */&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	/* Let say continue normally */&lt;br /&gt;
	return Plugin_Continue&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Creating Admin Commands==&lt;br /&gt;
Let's create a simple admin command which kicks another player by their full name.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnPluginStart()&lt;br /&gt;
{&lt;br /&gt;
	RegAdminCmd(&amp;quot;admin_kick&amp;quot;,&lt;br /&gt;
		Command_Kick,&lt;br /&gt;
		ADMFLAG_KICK,&lt;br /&gt;
		&amp;quot;Kicks a player by name&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public Action:Command_Kick(client, args)&lt;br /&gt;
{&lt;br /&gt;
	if (args &amp;lt; 1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Usage: admin_kick &amp;lt;name&amp;gt;&amp;quot;)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	new String:name[32], maxplayers, target = -1&lt;br /&gt;
	GetCmdArg(1, name, sizeof(name))&lt;br /&gt;
&lt;br /&gt;
	maxplayers = GetMaxClients()&lt;br /&gt;
	for (new i=1; i&amp;lt;=maxplayers; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (!IsClientConnected(i))&lt;br /&gt;
		{&lt;br /&gt;
			continue&lt;br /&gt;
		}&lt;br /&gt;
		decl String:other[32]&lt;br /&gt;
		GetClientName(i, other, sizeof(other))&lt;br /&gt;
		if (StrEqual(name, other))&lt;br /&gt;
		{&lt;br /&gt;
			target = i&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (target == -1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Could not find any player with the name: \&amp;quot;%s\&amp;quot;&amp;quot;, name)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ServerCommand(&amp;quot;kickid %d&amp;quot;, GetClientUserId(target));&lt;br /&gt;
&lt;br /&gt;
	return Plugin_Handled&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Immunity==&lt;br /&gt;
In our previous example, we did not take immunity into account.  Immunity is a much more complex system in SourceMod than it was in AMX Mod X, and there is no simple flag to denote its permissions.  Instead, two functions are provided:&lt;br /&gt;
*&amp;lt;tt&amp;gt;CanAdminTarget&amp;lt;/tt&amp;gt;: Tests raw AdminId values for immunity.&lt;br /&gt;
*&amp;lt;tt&amp;gt;CanUserTarget&amp;lt;/tt&amp;gt;: Tests in-game clients for immunity.&lt;br /&gt;
&lt;br /&gt;
While immunity is generally tested ''player versus player'', it is possible you might want to check for immunity and not have a targetting client.  While there is no convenience function for this yet, a good idea might be to check for either ''default'' or ''global'' immunity on the player's groups (these can be user-defined for non-player targeted scenarios).&lt;br /&gt;
&lt;br /&gt;
When checking for immunity, the following heuristics are performed in this exact order:&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;If the targeting AdminId is &amp;lt;tt&amp;gt;INVALID_ADMIN_ID&amp;lt;/tt&amp;gt;, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted AdminId is &amp;lt;tt&amp;gt;INVALID_ADMIN_ID&amp;lt;/tt&amp;gt;, targeting succeeds.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targeting admin has &amp;lt;tt&amp;gt;Admin_Root&amp;lt;/tt&amp;gt; (&amp;lt;tt&amp;gt;ADMFLAG_ROOT&amp;lt;/tt&amp;gt;), targeting succeeds.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted admin has global immunity, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted admin has default immunity, and the targeting admin belongs to no groups, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If the targetted admin has specific immunity from the targeting admin via group immunities, targeting fails.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;If no conclusion is reached via the previous steps, targeting succeeds.&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, how can we adapt our function about to use immunity?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public Action:Command_Kick(client, args)&lt;br /&gt;
{&lt;br /&gt;
	if (args &amp;lt; 1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Usage: admin_kick &amp;lt;name&amp;gt;&amp;quot;)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	new String:name[32], maxplayers, target = -1&lt;br /&gt;
	GetCmdArg(1, name, sizeof(name))&lt;br /&gt;
&lt;br /&gt;
	maxplayers = GetMaxClients()&lt;br /&gt;
	for (new i=1; i&amp;lt;=maxplayers; i++)&lt;br /&gt;
	{&lt;br /&gt;
		if (!IsClientConnected(i))&lt;br /&gt;
		{&lt;br /&gt;
			continue&lt;br /&gt;
		}&lt;br /&gt;
		decl String:other[32]&lt;br /&gt;
		GetClientName(i, other, sizeof(other))&lt;br /&gt;
		if (StrEqual(name, other))&lt;br /&gt;
		{&lt;br /&gt;
			target = i&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (target == -1)&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;Could not find any player with the name: \&amp;quot;%s\&amp;quot;&amp;quot;, name)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (!CanUserTarget(client, target))&lt;br /&gt;
	{&lt;br /&gt;
		PrintToConsole(client, &amp;quot;You cannot target this client.&amp;quot;)&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ServerCommand(&amp;quot;kickid %d&amp;quot;, GetClientUserId(target))&lt;br /&gt;
&lt;br /&gt;
	return Plugin_Handled&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Client-Only Commands=&lt;br /&gt;
SourceMod exposes a forward that is called whenever a client executes any command string in their console, called &amp;lt;tt&amp;gt;OnClientCommand&amp;lt;/tt&amp;gt;.  An example of this looks like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;public OnClientCommand(client, args)&lt;br /&gt;
{&lt;br /&gt;
	new String:cmd[16]&lt;br /&gt;
	GetCmdArg(0, cmd, sizeof(16));	/* Get command name */&lt;br /&gt;
&lt;br /&gt;
	if (StrEqual(cmd, &amp;quot;test_command&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		/* Got the client command! Block it... */&lt;br /&gt;
		return Plugin_Handled&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return Plugin_Continue&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is worth noting that not everything a client sends will be available through this command.  Command registered via external sources in C++ may not be available, especially if they are created via &amp;lt;tt&amp;gt;CON_COMMAND&amp;lt;/tt&amp;gt; in the game mod itself.  For example, &amp;quot;say&amp;quot; is usually implemented this way, because it can be used by both clients and the server, and thus it does not channel through this forward.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2747</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2747"/>
		<updated>2006-03-18T05:14:17Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* Half-Life Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporary draws ammo amount and ammo type HUD icons in the middle of the right side of the screen (draw time depends on ''hud_drawhistory_time'' client CVAR value)&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in weapon HUD-list and ammo amount in lower right corner of the screen (in case current weapon uses given ammo type)&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Leave the 2nd byte as 0, to turn off a BarTime that you started just send a duration of 0.&lt;br /&gt;
{{begin-hl1msg|BarTime|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Duration}}&lt;br /&gt;
{{hl1msg|byte|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BarTime2}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|byte|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments. &lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Domb Droped?}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
The model name does not have .mdl at the end&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|model}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|Ammo in weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. &lt;br /&gt;
This generates the [[HUD]] message the client sees in the upper right corner of their screen.&lt;br /&gt;
&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|killer}}&lt;br /&gt;
{{hl1msg|byte|victim}}&lt;br /&gt;
{{hl1msg|byte|headshot}}&lt;br /&gt;
{{hl1msg|string|weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|Amount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Flag would be 1 for turning the flashlight on or 0 for turning it off.  In my testing the 2nd argument was always 100.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostageK}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostagePos}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
{{qnotice| 1 is on, 2 is off}}&lt;br /&gt;
{{begin-hl1msg|NVGToggle}}&lt;br /&gt;
{{hl1msg|byte|flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|RoundTime}}&lt;br /&gt;
{{hl1msg|short|Time in Seconds}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
{{qnotice|  The destination can be 1 is notify, 2 is console, 3 is chat, or 4 is center. Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All}}&lt;br /&gt;
{{begin-hl1msg|SayText}}&lt;br /&gt;
{{hl1msg|byte|Destination}}&lt;br /&gt;
{{hl1msg|string|Predefined String}}&lt;br /&gt;
{{hl1msg|string|Unknown}}&lt;br /&gt;
{{hl1msg|string|Text said}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Scenario ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Scenario}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ScoreAttrib ==&lt;br /&gt;
{{qnotice|For the 2nd Argument, 0 is nothing, 1 is dead, 2 is bomb, 3 is VIP}}&lt;br /&gt;
{{begin-hl1msg|ScoreAttrib}}&lt;br /&gt;
{{hl1msg|byte|Id}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== StatusIcon ==&lt;br /&gt;
{{qnotice|For Status, 0 is Hide Icon, 1 is Show Icon, 2 is Flash Icon.  A list of usable sprites are in listed at a link below: [Link is missing]}}&lt;br /&gt;
{{begin-hl1msg|StatusIcon}}&lt;br /&gt;
{{hl1msg|byte|Status}}&lt;br /&gt;
{{hl1msg|string|Sprite name}}&lt;br /&gt;
{{hl1msg|byte|Red}}&lt;br /&gt;
{{hl1msg|byte|Green}}&lt;br /&gt;
{{hl1msg|byte|Blue}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
  	&lt;br /&gt;
== StatusText ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ScoreAttrib}}&lt;br /&gt;
{{hl1msg|byte|Line Number}}&lt;br /&gt;
{{hl1msg|string|Text}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== StatusValue ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|StatusValue}}&lt;br /&gt;
{{hl1msg|byte|}}&lt;br /&gt;
{{hl1msg|short|Predefined String}}&lt;br /&gt;
{{hl1msg|short|Unknown}}&lt;br /&gt;
{{hl1msg|short|Unknown}}&lt;br /&gt;
{{hl1msg|short|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TaskTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TaskTime}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TeamInfo ==&lt;br /&gt;
{{qnotice|Team name is either CT or TERRORIST}}&lt;br /&gt;
{{begin-hl1msg|TeamInfo}}&lt;br /&gt;
{{hl1msg|byte|ID}}&lt;br /&gt;
{{hl1msg|string|Team Name}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TeamScore ==&lt;br /&gt;
{{qnotice|Team name is either CT or TERRORIST}}&lt;br /&gt;
{{begin-hl1msg|TeamScore}}&lt;br /&gt;
{{hl1msg|string|Team Name}}&lt;br /&gt;
{{hl1msg|short|Score}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TextMsg ==&lt;br /&gt;
{{qnotice|There does not necessarily have to be a total of 6 arguments, there could be as little as 2.  For example you can send a message with the following:&amp;lt;br&amp;gt;&lt;br /&gt;
Arg1: 1&amp;lt;br&amp;gt;&lt;br /&gt;
Arg2: #Game_join_ct&amp;lt;br&amp;gt;&lt;br /&gt;
Arg3: 4HM | Pimp Daddy&amp;lt;br&amp;gt;}}&lt;br /&gt;
{{begin-hl1msg|TextMsg}}&lt;br /&gt;
{{hl1msg|byte|ID}}&lt;br /&gt;
{{hl1msg|string|Message}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Train ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Train}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorLine ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorLine}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorState ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorState}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorText ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorText}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== VGUIMenu ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|VGUIMenu}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|short|unknown}}&lt;br /&gt;
{{hl1msg|char|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|string|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ViewMode ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ViewMode}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== VoiceMask ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|VoiceMask}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== WeapPickup ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|WeapPickup}}&lt;br /&gt;
{{hl1msg|byte|Weapon ID}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2744</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2744"/>
		<updated>2006-03-18T04:21:37Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* Half-Life Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporary draws ammo amount and ammo type HUD icons in the middle of the right side of the screen (draw time depends on ''hud_drawhistory_time'' client CVAR value)&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in weapon HUD-list and ammo amount in lower right corner of the screen (in case current weapon uses given ammo type)&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Leave the 2nd byte as 0, to turn off a BarTime that you started just send a duration of 0.&lt;br /&gt;
{{begin-hl1msg|BarTime|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Duration}}&lt;br /&gt;
{{hl1msg|byte|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BarTime2}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|byte|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments. &lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Domb Droped?}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
The model name does not have .mdl at the end&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|model}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|Ammo in weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. &lt;br /&gt;
This generates the [[HUD]] message the client sees in the upper right corner of their screen.&lt;br /&gt;
&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|killer}}&lt;br /&gt;
{{hl1msg|byte|victim}}&lt;br /&gt;
{{hl1msg|byte|headshot}}&lt;br /&gt;
{{hl1msg|string|weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|Amount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Flag would be 1 for turning the flashlight on or 0 for turning it off.  In my testing the 2nd argument was always 100.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostageK}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostagePos}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
{{qnotice| 1 is on, 2 is off}}&lt;br /&gt;
{{begin-hl1msg|NVGToggle}}&lt;br /&gt;
{{hl1msg|byte|flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|RoundTime}}&lt;br /&gt;
{{hl1msg|short|Time in Seconds}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
{{qnotice|  The destination can be 1 is notify, 2 is console, 3 is chat, or 4 is center. Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All}}&lt;br /&gt;
{{begin-hl1msg|SayText}}&lt;br /&gt;
{{hl1msg|byte|Destination}}&lt;br /&gt;
{{hl1msg|string|Predefined String}}&lt;br /&gt;
{{hl1msg|string|Unknown}}&lt;br /&gt;
{{hl1msg|string|Text said}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Scenario ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Scenario}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ScoreAttrib ==&lt;br /&gt;
{{qnotice|For the 2nd Argument, 0 is nothing, 1 is dead, 2 is bomb, 3 is VIP}}&lt;br /&gt;
{{begin-hl1msg|ScoreAttrib}}&lt;br /&gt;
{{hl1msg|byte|Id}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
StatusValue  	byte, short, short, short, short  	&lt;br /&gt;
== TaskTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TaskTime}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TeamInfo ==&lt;br /&gt;
{{qnotice|Team name is either CT or TERRORIST}}&lt;br /&gt;
{{begin-hl1msg|TeamInfo}}&lt;br /&gt;
{{hl1msg|byte|ID}}&lt;br /&gt;
{{hl1msg|string|Team Name}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TeamScore ==&lt;br /&gt;
{{qnotice|Team name is either CT or TERRORIST}}&lt;br /&gt;
{{begin-hl1msg|TeamScore}}&lt;br /&gt;
{{hl1msg|string|Team Name}}&lt;br /&gt;
{{hl1msg|short|Score}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TextMsg ==&lt;br /&gt;
{{qnotice|There does not necessarily have to be a total of 6 arguments, there could be as little as 2.  For example you can send a message with the following:&amp;lt;br&amp;gt;&lt;br /&gt;
Arg1: 1&amp;lt;br&amp;gt;&lt;br /&gt;
Arg2: #Game_join_ct&amp;lt;br&amp;gt;&lt;br /&gt;
Arg3: 4HM | Pimp Daddy&amp;lt;br&amp;gt;}}&lt;br /&gt;
{{begin-hl1msg|TextMsg}}&lt;br /&gt;
{{hl1msg|byte|ID}}&lt;br /&gt;
{{hl1msg|string|Message}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Train ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Train}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorLine ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorLine}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorState ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorState}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorText ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorText}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== VGUIMenu ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|VGUIMenu}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|short|unknown}}&lt;br /&gt;
{{hl1msg|char|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|string|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ViewMode ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ViewMode}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== VoiceMask ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|VoiceMask}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== WeapPickup ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|WeapPickup}}&lt;br /&gt;
{{hl1msg|byte|Weapon ID}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2743</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2743"/>
		<updated>2006-03-17T10:55:31Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* Half-Life Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporary draws ammo amount and ammo type HUD icons in the middle of the right side of the screen (draw time depends on ''hud_drawhistory_time'' client CVAR value)&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in weapon HUD-list and ammo amount in lower right corner of the screen (in case current weapon uses given ammo type)&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Leave the 2nd byte as 0, to turn off a BarTime that you started just send a duration of 0.&lt;br /&gt;
{{begin-hl1msg|BarTime|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Duration}}&lt;br /&gt;
{{hl1msg|byte|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BarTime2}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|byte|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments. &lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Domb Droped?}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
The model name does not have .mdl at the end&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|model}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|Ammo in weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. &lt;br /&gt;
This generates the [[HUD]] message the client sees in the upper right corner of their screen.&lt;br /&gt;
&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|killer}}&lt;br /&gt;
{{hl1msg|byte|victim}}&lt;br /&gt;
{{hl1msg|byte|headshot}}&lt;br /&gt;
{{hl1msg|string|weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|Amount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Flag would be 1 for turning the flashlight on or 0 for turning it off.  In my testing the 2nd argument was always 100.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostageK}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostagePos}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
{{qnotice| 1 is on, 2 is off}}&lt;br /&gt;
{{begin-hl1msg|NVGToggle}}&lt;br /&gt;
{{hl1msg|byte|flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|RoundTime}}&lt;br /&gt;
{{hl1msg|short|Time in Seconds}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
{{qnotice|  The destination can be 1 is notify, 2 is console, 3 is chat, or 4 is center. Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All}}&lt;br /&gt;
{{begin-hl1msg|SayText}}&lt;br /&gt;
{{hl1msg|byte|Destination}}&lt;br /&gt;
{{hl1msg|string|Predefined String}}&lt;br /&gt;
{{hl1msg|string|Unknown}}&lt;br /&gt;
{{hl1msg|string|Text said}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Scenario ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Scenario}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ScoreAttrib ==&lt;br /&gt;
{{qnotice|For the 2nd Argument, 0 is nothing, 1 is dead, 2 is bomb, 3 is VIP}}&lt;br /&gt;
{{begin-hl1msg|ScoreAttrib}}&lt;br /&gt;
{{hl1msg|byte|Id}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2742</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2742"/>
		<updated>2006-03-17T10:53:40Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* Half-Life Events */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporary draws ammo amount and ammo type HUD icons in the middle of the right side of the screen (draw time depends on ''hud_drawhistory_time'' client CVAR value)&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in weapon HUD-list and ammo amount in lower right corner of the screen (in case current weapon uses given ammo type)&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Leave the 2nd byte as 0, to turn off a BarTime that you started just send a duration of 0.&lt;br /&gt;
{{begin-hl1msg|BarTime|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Duration}}&lt;br /&gt;
{{hl1msg|byte|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BarTime2}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|byte|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments. &lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Domb Droped?}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
The model name does not have .mdl at the end&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|model}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|Ammo in weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. &lt;br /&gt;
This generates the [[HUD]] message the client sees in the upper right corner of their screen.&lt;br /&gt;
&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|killer}}&lt;br /&gt;
{{hl1msg|byte|victim}}&lt;br /&gt;
{{hl1msg|byte|headshot}}&lt;br /&gt;
{{hl1msg|string|weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|Amount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Flag would be 1 for turning the flashlight on or 0 for turning it off.  In my testing the 2nd argument was always 100.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostageK}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostagePos}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
{{qnotice| 1 is on, 2 is off}}&lt;br /&gt;
{{begin-hl1msg|NVGToggle}}&lt;br /&gt;
{{hl1msg|byte|flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|RoundTime}}&lt;br /&gt;
{{hl1msg|short|Time in Seconds}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Scenario ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Scenario}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
{{qnotice|  The destination can be 1 is notify, 2 is console, 3 is chat, or 4 is center. Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All}}&lt;br /&gt;
{{begin-hl1msg|SayText}}&lt;br /&gt;
{{hl1msg|byte|Destination}}&lt;br /&gt;
{{hl1msg|string|Predefined String}}&lt;br /&gt;
{{hl1msg|string|Unknown}}&lt;br /&gt;
{{hl1msg|string|Text said}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2741</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2741"/>
		<updated>2006-03-17T10:51:30Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* SayText */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporary draws ammo amount and ammo type HUD icons in the middle of the right side of the screen (draw time depends on ''hud_drawhistory_time'' client CVAR value)&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in weapon HUD-list and ammo amount in lower right corner of the screen (in case current weapon uses given ammo type)&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Leave the 2nd byte as 0, to turn off a BarTime that you started just send a duration of 0.&lt;br /&gt;
{{begin-hl1msg|BarTime|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Duration}}&lt;br /&gt;
{{hl1msg|byte|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BarTime2}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|byte|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments. &lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Domb Droped?}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
The model name does not have .mdl at the end&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|model}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|Ammo in weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. &lt;br /&gt;
This generates the [[HUD]] message the client sees in the upper right corner of their screen.&lt;br /&gt;
&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|killer}}&lt;br /&gt;
{{hl1msg|byte|victim}}&lt;br /&gt;
{{hl1msg|byte|headshot}}&lt;br /&gt;
{{hl1msg|string|weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|Amount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Flag would be 1 for turning the flashlight on or 0 for turning it off.  In my testing the 2nd argument was always 100.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostageK}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostagePos}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
{{qnotice| 1 is on, 2 is off}}&lt;br /&gt;
{{begin-hl1msg|NVGToggle}}&lt;br /&gt;
{{hl1msg|byte|flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|RoundTime}}&lt;br /&gt;
{{hl1msg|short|Time in Seconds}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
{{qnotice|  The destination can be 1 is notify, 2 is console, 3 is chat, or 4 is center. Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All}}&lt;br /&gt;
{{begin-hl1msg|SayText}}&lt;br /&gt;
{{hl1msg|byte|Destination}}&lt;br /&gt;
{{hl1msg|string|Predefined String}}&lt;br /&gt;
{{hl1msg|string|Unknown}}&lt;br /&gt;
{{hl1msg|string|Text said}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2740</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2740"/>
		<updated>2006-03-17T10:50:23Z</updated>

		<summary type="html">&lt;p&gt;Teame06: /* NVGToggle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporary draws ammo amount and ammo type HUD icons in the middle of the right side of the screen (draw time depends on ''hud_drawhistory_time'' client CVAR value)&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in weapon HUD-list and ammo amount in lower right corner of the screen (in case current weapon uses given ammo type)&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Leave the 2nd byte as 0, to turn off a BarTime that you started just send a duration of 0.&lt;br /&gt;
{{begin-hl1msg|BarTime|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Duration}}&lt;br /&gt;
{{hl1msg|byte|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BarTime2}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|byte|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments. &lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Domb Droped?}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
The model name does not have .mdl at the end&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|model}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|Ammo in weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. &lt;br /&gt;
This generates the [[HUD]] message the client sees in the upper right corner of their screen.&lt;br /&gt;
&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|killer}}&lt;br /&gt;
{{hl1msg|byte|victim}}&lt;br /&gt;
{{hl1msg|byte|headshot}}&lt;br /&gt;
{{hl1msg|string|weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|Amount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Flag would be 1 for turning the flashlight on or 0 for turning it off.  In my testing the 2nd argument was always 100.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostageK}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostagePos}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
{{qnotice| 1 is on, 2 is off}}&lt;br /&gt;
{{begin-hl1msg|NVGToggle}}&lt;br /&gt;
{{hl1msg|byte|flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|RoundTime}}&lt;br /&gt;
{{hl1msg|short|Time in Seconds}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
{{qnotice|notify = 1, console = 2, chat = 3, or center = 4 can be the Destination. Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All}}&lt;br /&gt;
{{begin-hl1msg|SayText}}&lt;br /&gt;
{{hl1msg|byte|Destination}}&lt;br /&gt;
{{hl1msg|string|Predefined String}}&lt;br /&gt;
{{hl1msg|string|Unknown}}&lt;br /&gt;
{{hl1msg|string|Text said}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2739</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=2739"/>
		<updated>2006-03-17T10:32:35Z</updated>

		<summary type="html">&lt;p&gt;Teame06: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporary draws ammo amount and ammo type HUD icons in the middle of the right side of the screen (draw time depends on ''hud_drawhistory_time'' client CVAR value)&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in weapon HUD-list and ammo amount in lower right corner of the screen (in case current weapon uses given ammo type)&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Ammo ID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Leave the 2nd byte as 0, to turn off a BarTime that you started just send a duration of 0.&lt;br /&gt;
{{begin-hl1msg|BarTime|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Duration}}&lt;br /&gt;
{{hl1msg|byte|Unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BarTime2}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|byte|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments. &lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Domb Droped?}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
The model name does not have .mdl at the end&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|model}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|coord|unknown}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|Ammo in weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. &lt;br /&gt;
This generates the [[HUD]] message the client sees in the upper right corner of their screen.&lt;br /&gt;
&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|killer}}&lt;br /&gt;
{{hl1msg|byte|victim}}&lt;br /&gt;
{{hl1msg|byte|headshot}}&lt;br /&gt;
{{hl1msg|string|weapon}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|Amount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Flag would be 1 for turning the flashlight on or 0 for turning it off.  In my testing the 2nd argument was always 100.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostageK}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|HostagePos}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|Byte|unknown}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
{{qnotice|1 = on, 2 = off}}&lt;br /&gt;
{{begin-hl1msg|NVGToggle}}&lt;br /&gt;
{{hl1msg|byte|flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|RoundTime}}&lt;br /&gt;
{{hl1msg|short|Time in Seconds}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
{{qnotice|notify = 1, console = 2, chat = 3, or center = 4 can be the Destination. Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All}}&lt;br /&gt;
{{begin-hl1msg|SayText}}&lt;br /&gt;
{{hl1msg|byte|Destination}}&lt;br /&gt;
{{hl1msg|string|Predefined String}}&lt;br /&gt;
{{hl1msg|string|Unknown}}&lt;br /&gt;
{{hl1msg|string|Text said}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>Teame06</name></author>
		
	</entry>
</feed>