<?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=Faluco</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=Faluco"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/Faluco"/>
	<updated>2026-05-27T04:39:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=What&amp;diff=4936</id>
		<title>What</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=What&amp;diff=4936"/>
		<updated>2007-07-15T16:01:42Z</updated>

		<summary type="html">&lt;p&gt;Faluco: Reverted edits by Lu1Cg0 (Talk); changed back to last version by BAILOPAN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Gaben|what|[[what?]]}}&lt;br /&gt;
&lt;br /&gt;
[[Image:What.png|300px|thumb|A up-close photograph of What after reaching the inner core.]]&lt;br /&gt;
&lt;br /&gt;
==what==&lt;br /&gt;
===hello===&lt;br /&gt;
==is==&lt;br /&gt;
==this==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;What&amp;quot; pages are joke pages that are created as tests, alternatives to talk discussions, jokes, or anything that's off-topic.  For example, [[User:BAILOPAN]] is also [[User:BAILOPAN (What)]].  &lt;br /&gt;
&lt;br /&gt;
what&lt;br /&gt;
&lt;br /&gt;
==Childhood==&lt;br /&gt;
What was given to the first humans by BAILOPAN.  The early humans rubbed it on their bodies for warmth.  &lt;br /&gt;
As humans evolved and split into two distinct races: the intelligent and the morbidly stupid, what split as well.  The first type of what was used by the intelligent to confuse the morbidly stupid even more.  The second type was used by the morbidly stupid as a form of communication, somewhat like a grunt.&lt;br /&gt;
&lt;br /&gt;
==Maturity==&lt;br /&gt;
BAILOPAN saw that for true intelligent expansion, humans needed other questions such as how and where.  He created them and gave them to the morbidly stupid.  The morbidly stupid took the new questions and hit each other with them.  BAILOPAN laughed and force lightning'd the poor fools.  As a joke he showed his true form while utterly destroying them.  They proclaimed him the devil and formed 17 distinct religions around him.  &lt;br /&gt;
&lt;br /&gt;
What managed to get some alone time with how and where.  From this holy union came the word whereforewhatthefuck...and porn.  Greentryst saw the porn (over BAILOPAN's shoulder) and declared that the world was good.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Category:3rd_Party_Modules_(AMX_Mod_X)&amp;diff=4934</id>
		<title>Category:3rd Party Modules (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Category:3rd_Party_Modules_(AMX_Mod_X)&amp;diff=4934"/>
		<updated>2007-07-15T15:56:32Z</updated>

		<summary type="html">&lt;p&gt;Faluco: Reverted edits by LbgYhi (Talk); changed back to last version by BAILOPAN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:AMX Mod X]]&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Debugging_Plugins_(AMX_Mod_X)&amp;diff=4933</id>
		<title>Debugging Plugins (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Debugging_Plugins_(AMX_Mod_X)&amp;diff=4933"/>
		<updated>2007-07-15T15:55:50Z</updated>

		<summary type="html">&lt;p&gt;Faluco: Reverted edits by XpyPru (Talk); changed back to last version by BAILOPAN&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[AMX Mod X]] features a greatly enhanced plugin debugger over AMX Mod. If your plugin is giving runtime errors, you should enable the debugger by opening amxmodx/configs/plugins.ini and appending &amp;quot; debug&amp;quot; to your plugin's entry, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
myplugin.amxx debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When you get a runtime error, it will show a full trace of the problem:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
L 09/15/2004 - 17:38:17: [AMXX] Run time error 4 (index out of bounds) &lt;br /&gt;
     on line 46 (file &amp;quot;debug.sma&amp;quot;).&lt;br /&gt;
L 09/15/2004 - 17:38:17: [AMXX] Debug Trace =&amp;gt;&lt;br /&gt;
L 09/15/2004 - 17:38:17: [AMXX]       [0] Line 40, File &amp;quot;debug.sma&amp;quot;&lt;br /&gt;
L 09/15/2004 - 17:38:17: [AMXX]       [1] Line 25, File &amp;quot;debug.sma&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This type of error is called an AMX run time error - one that occured directly in the plugin interpreter. From this output, we know that this order of events happened:&lt;br /&gt;
&lt;br /&gt;
#Line 25 was called in debug.sma&lt;br /&gt;
#Line 25 jumped to line 40 in debug.sma&lt;br /&gt;
#Line 40 jumped to line 46 in debug.sma, where an error occured&lt;br /&gt;
&lt;br /&gt;
This specific error is one of the three common errors. It means that an array was improperly indexed, for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
new array[5]&lt;br /&gt;
new x = 500&lt;br /&gt;
array[x] = x&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will generate this message. Another common message is AMX_ERR_STACKERR, which means your plugin ran out of memory. The fix for this is to increase the default size from 16KB:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#pragma dynamic 32768 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will increase the memory allocated to 128KB. The dynamic size is measured in cells, which are four bytes each (eight bytes on AMD64). AMX_ERR_STACKLOW and AMX_ERR_HEAPLOW are similar. The most common error by far is AMX_ERR_NATIVE, which means a native function in the AMX Mod X core signaled an error message.&lt;br /&gt;
&lt;br /&gt;
Native errors are usually caused by some error checking failure on the part of the script programmer. For example, supplying an invalid connection id to an SQL function, or trying to modify the data on a player that doesn't exist. These errors will usually give a more helpful error message along with the call trace, as well as the actual name of the native that failed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Handles_(SourceMod_Scripting)&amp;diff=4434</id>
		<title>Handles (SourceMod Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Handles_(SourceMod_Scripting)&amp;diff=4434"/>
		<updated>2007-03-25T19:22:51Z</updated>

		<summary type="html">&lt;p&gt;Faluco: added KV handle type&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Handles are a special data type used in [[SourceMod Scripting]].  They represent a single internal and unique object.  For example, there are &amp;quot;File&amp;quot; Handles for files, and &amp;quot;Menu&amp;quot; Handles for menus, but they are both encapsulated under the &amp;quot;Handle&amp;quot; [[Tags (SourceMod Scripting)|tag]].&lt;br /&gt;
&lt;br /&gt;
Handles are more than &amp;quot;pointers&amp;quot; from C or C++ because they have a ''reference count''.  This means that the number of copies floating around in memory is tracked.  The actual internal object is not destroyed until each copy is also destroyed.&lt;br /&gt;
&lt;br /&gt;
Since SourcePawn does not have [[Garbage Collection]], Handles are a special way of intelligently allowing plugins and SourceMod to manage their own memory.&lt;br /&gt;
&lt;br /&gt;
For more information on using Handles in the SourceMod API, see [[Handles (SourceMod API)]].&lt;br /&gt;
&lt;br /&gt;
=Opening Handles=&lt;br /&gt;
Opening a Handle is usually done implicitly by a native function.  For example, OpenDirectory opens a new Handle which is used in other Directory natives.  This associates a ''type'' with the Handle.  Trying to use a Directory Handle with any other non-Directory native will cause an error (HandleError_Type), because Handles are type checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;new Handle:hndl = OpenDirectory(&amp;quot;addons/sourcemod/configs&amp;quot;);&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Closing Handles=&lt;br /&gt;
==Basic operation==&lt;br /&gt;
Closing a Handle means seeing if the internal object can be removed from memory.  For example, if a plugin creates an SQL connection, closing the Handle means closing and destroying the connection.  This is almost always done using the CloseHandle() native function.&lt;br /&gt;
&lt;br /&gt;
==When to close==&lt;br /&gt;
When a plugin unloads, all of its Handles are automatically destroyed.  This does not mean, however, that closing Handles is optional.  Consider the following code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;stock bool:IsFileInFolder(const String:path[], const String:file[])&lt;br /&gt;
{&lt;br /&gt;
	new String:path[PLATFORM_MAX_PATH];&lt;br /&gt;
	new FileType:type;&lt;br /&gt;
&lt;br /&gt;
	new Handle:dir = OpenDirectory(path);&lt;br /&gt;
	if (dir == INVALID_HANDLE)&lt;br /&gt;
	{&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	while (ReadDirEntry(dir, path, sizeof(path), type))&lt;br /&gt;
	{&lt;br /&gt;
		if (type == FileType_File &amp;amp;&amp;amp; StrEqual(path, file))&lt;br /&gt;
		{&lt;br /&gt;
			return true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	CloseHandle(dir);&lt;br /&gt;
&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function searches a directory for a single file.  If this function were to omit the call to CloseHandle, it would [[Memory Leak|leak memory]] every time it was called, and eventually the script would fill up with a large number of lingering Handles that were left open.&lt;br /&gt;
&lt;br /&gt;
So, when do you close Handles?  There are generally two rules of thumb to go by:&lt;br /&gt;
*If the native uses terminology such as &amp;quot;Opens a [...]&amp;quot; or &amp;quot;Creates a [...]&amp;quot; or gives explicit directions for closing.&lt;br /&gt;
*If the Handle represents a temporary object or piece of information, and you will no longer be using it.&lt;br /&gt;
&lt;br /&gt;
Most of the time, you will be closing Handles.  Check the Handle Type documentation at the end of this page.&lt;br /&gt;
&lt;br /&gt;
==When you can't close==&lt;br /&gt;
There are a few Handle types that cannot be closed.  The major one is the Handle which identifies a plugin.  Plugins cannot unload themselves, and thus destroying their own Handles is not allowed.&lt;br /&gt;
&lt;br /&gt;
Furthermore, a script cannot close a Handle that is owned by another plugin.  This is for protection against API mistakes and accidental errors.  For example, if a Handle is shared between two plugins, one accidental free could invalidate a Handle unexpectedly.  To allow the sharing of Handles, see [[#Cloning Handles|Cloning Handles]].&lt;br /&gt;
&lt;br /&gt;
==Reference counters==&lt;br /&gt;
Closing Handles does not always destroy the internal data.  This is the case when Handles are [[#Cloning Handles|cloned]].  Each clone adds a ''reference count'' to the Handle, and closing each clone removes one reference count.  The original object is only actually destroyed once the Handle has no more reference counters.  &lt;br /&gt;
&lt;br /&gt;
=Cloning Handles=&lt;br /&gt;
As briefly described earlier, there is a problem when scripts try to share Handles.  Imagine this scenario:&lt;br /&gt;
*Plugin 'A' creates a Handle.&lt;br /&gt;
*Plugin 'B' received the Handle.&lt;br /&gt;
*Plugin 'A' is unloaded, and the Handle is destroyed.&lt;br /&gt;
*Plugin 'B' tries to use the Handle.&lt;br /&gt;
&lt;br /&gt;
To prevent this, the CloneHandle native is provided.  This function returns a ''new'' Handle that is a &amp;quot;copy&amp;quot; of the original.  While their values won't be equal, they contain the same internal data.  The data itself will not be destroyed until each copy and the original are closed with CloseHandle.  It does not matter what order they are freed in, however, each Handle can only be freed once.&lt;br /&gt;
&lt;br /&gt;
There are two ways of cloning.  A plugin can either clone a Handle itself, and become the owner, or it can explicitly set a new owner.  The difference is one of API design.  Example of the former:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new Handle:g_hSQL;&lt;br /&gt;
/**&lt;br /&gt;
 * The other plugin calling this function must pass his ID in,&lt;br /&gt;
 * but doesn't have to call CloneHandle()&lt;br /&gt;
 */&lt;br /&gt;
public Handle:GetGlobalSQL(Handle:otherPlugin)&lt;br /&gt;
{&lt;br /&gt;
   return CloneHandle(g_hSQL, otherPlugin);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This code would appear in the other plugin&lt;br /&gt;
 */&lt;br /&gt;
new Handle:sql = GetGlobalSQL(myself);&lt;br /&gt;
/* ... */&lt;br /&gt;
CloseHandle(sql);&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example of the latter:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new Handle:g_hSQL;&lt;br /&gt;
/**&lt;br /&gt;
 * The calling plugin must call CloneHandle() himself.&lt;br /&gt;
 */&lt;br /&gt;
public Handle:GetGlobalSQL()&lt;br /&gt;
{&lt;br /&gt;
   return g_hSQL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * This code would appear in the other plugin&lt;br /&gt;
 */&lt;br /&gt;
new Handle:sql = GetGlobalSQL();&lt;br /&gt;
if (sql != INVALID_HANDLE)&lt;br /&gt;
{&lt;br /&gt;
   sql = CloneHandle(sql);&lt;br /&gt;
}&lt;br /&gt;
CloseHandle(sql);&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Handle Types=&lt;br /&gt;
The following is a list of the known Handle types provided by SourceMod and some documentation on each.&lt;br /&gt;
==BitBuffers==&lt;br /&gt;
{{HandleType|bf_read or bf_write|Only if explicitly stated|Only if it can also be closed|Core|bitbuffer.inc}}&lt;br /&gt;
&lt;br /&gt;
There are four types of BitBuffer Handles.  They are separated into ''bf_write'' (writable buffer) and ''bf_read'' (readable buffer).  These are directly abstracted from their Half-Life 2 counterpart.  Internally, there are separate Handle types for each; certain functions will use BitBuffer handles that cannot be freed.&lt;br /&gt;
&lt;br /&gt;
==ConVars==&lt;br /&gt;
{{HandleType|ConVar|No|No|Core|console.inc}}&lt;br /&gt;
&lt;br /&gt;
ConVar Handles are primarily used for getting and setting a console variable's value. They cannot be cloned nor deleted since they exist until SourceMod is shut down.&lt;br /&gt;
&lt;br /&gt;
==Directories==&lt;br /&gt;
{{HandleType|Directory|Yes|Yes|Core|files.inc}}&lt;br /&gt;
&lt;br /&gt;
Directory Handles are used for opening and enumerating the contents of a directory (folder) on the filesystem.&lt;br /&gt;
&lt;br /&gt;
==Events==&lt;br /&gt;
{{HandleType|Event|No|No|Core|events.inc}}&lt;br /&gt;
&lt;br /&gt;
Event Handles are used for getting and setting data in Half-Life 2 game events as well as for firing them. They can only be closed using CancelCreatedEvent() if the event was not fired for some reason.&lt;br /&gt;
&lt;br /&gt;
==Files==&lt;br /&gt;
{{HandleType|File|Yes|Yes|Core|files.inc}}&lt;br /&gt;
&lt;br /&gt;
File Handles are used for opening, reading from, writing to, and creating to files on the file system.&lt;br /&gt;
&lt;br /&gt;
==Forwards==&lt;br /&gt;
{{HandleType|Forward|Yes|Only if explicitly stated|Core|functions.inc}}&lt;br /&gt;
&lt;br /&gt;
Forward Handles are primarily used when calling functions inside a forward container. There are two types of forwards: global and private. Only private forwards can be cloned.&lt;br /&gt;
&lt;br /&gt;
==Plugins==&lt;br /&gt;
{{HandleType|Plugin|No|No|Core|sourcemod.inc}}&lt;br /&gt;
&lt;br /&gt;
Plugin Handles are used for the unique identification of a Plugin.  They are owned by Core and cannot be cloned or closed by any other plugin or extension.  However, plugins can use Handles for certain natives which enumerate or retrieve information on plugins.  &lt;br /&gt;
&lt;br /&gt;
Plugin Handles should not be cached globally, as plugins can become unloaded, and the Handle will be invalid.&lt;br /&gt;
&lt;br /&gt;
==Plugin Iterators==&lt;br /&gt;
{{HandleType|PluginIter|Yes|No|Core|sourcemod.inc}}&lt;br /&gt;
&lt;br /&gt;
Plugin Iterators allow you to walk over a list of plugins.  They are intended for temporary use only.&lt;br /&gt;
&lt;br /&gt;
==SMC Parsers==&lt;br /&gt;
{{HandleType|SMC Parser|Yes|No|Core|textparse.inc}}&lt;br /&gt;
&lt;br /&gt;
SMC Parsers are Handles which contain a set of functions for hooking parse events in an SMC file.  See more in [[SMC Parsing (SourceMod Scripting)]].  Since they directly reference functions in a plugin, they cannot be cloned.&lt;br /&gt;
&lt;br /&gt;
==Timers==&lt;br /&gt;
{{HandleType|Timer|Yes|No|Core|timers.inc}}&lt;br /&gt;
&lt;br /&gt;
Timers are temporary Handles which are automatically closed on any of the following events:&lt;br /&gt;
*The timer ends (via Plugin_Stop or being a one-time timer that is finished)&lt;br /&gt;
*The timer is killed via &amp;lt;tt&amp;gt;KillTimer&amp;lt;/tt&amp;gt;&lt;br /&gt;
*The timer is closed via &amp;lt;tt&amp;gt;CloseHandle&amp;lt;/tt&amp;gt;&lt;br /&gt;
*The timer's parent plugin unloads&lt;br /&gt;
&lt;br /&gt;
==KeyValues==&lt;br /&gt;
{{HandleType|KeyValues|Yes|Yes|Core|keyvalues.inc}}&lt;br /&gt;
&lt;br /&gt;
KeyValue Handles are wrapped around KeyValues pointers from the HL2SDK (tier1).  Note that they are intended only for root nodes, and have special functions for sub-node iteration.&lt;br /&gt;
&lt;br /&gt;
[[Category:SourceMod Development]]&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Translations_(SourceMod_Scripting)&amp;diff=3730</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=3730"/>
		<updated>2007-01-11T01:27:36Z</updated>

		<summary type="html">&lt;p&gt;Faluco: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;
	//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 have two main methods of translation strings from the ML system: Inline translation, which is built into all string formatting functions, and manual translation, which is used to manually format a phrase.&lt;br /&gt;
&lt;br /&gt;
Plugins must call &amp;lt;tt&amp;gt;LoadDictionary&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 Translations==&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;
**A string containing the language's two letter international code.&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;
PrintToPlayer(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 print directly to one or more clients.  It eliminates the second parameter, and uses the original client specified.  Example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;PrintToPlayer(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;PrintToPlayer&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;
==Manual Translations==&lt;br /&gt;
If you do not wish to use inlined translation, you can also use natives that manually translate a string to a given buffer.  Documentation for these natives can be found in &amp;lt;tt&amp;gt;translation.inc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetLanguageID()&amp;lt;/tt&amp;gt;: Given a two letter language code, returns its internal ID.  English (&amp;quot;en&amp;quot;) is always ID 0.  An empty string returns the server's language ID.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetLanguageCount()&amp;lt;/tt&amp;gt;: Returns the number of languages in the translation cache.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetLanguageInfo()&amp;lt;/tt&amp;gt;: Returns a language's name and code given its ID.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Translate()&amp;lt;/tt&amp;gt;: Translates a phrase given a language code, a translation file Handle (returned by &amp;lt;tt&amp;gt;LoadDictionary&amp;lt;/tt&amp;gt;), and a phrase string.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetPlayerLanguage()&amp;lt;/tt&amp;gt;: Returns the language ID a player is using.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Translations_(SourceMod_Scripting)&amp;diff=3728</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=3728"/>
		<updated>2007-01-11T01:24:17Z</updated>

		<summary type="html">&lt;p&gt;Faluco: translation fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;Beinvenidos 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;
	//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 have two main methods of translation strings from the ML system: Inline translation, which is built into all string formatting functions, and manual translation, which is used to manually format a phrase.&lt;br /&gt;
&lt;br /&gt;
Plugins must call &amp;lt;tt&amp;gt;LoadDictionary&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 Translations==&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;
**A string containing the language's two letter international code.&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;
PrintToPlayer(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 print directly to one or more clients.  It eliminates the second parameter, and uses the original client specified.  Example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;PrintToPlayer(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;PrintToPlayer&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;
==Manual Translations==&lt;br /&gt;
If you do not wish to use inlined translation, you can also use natives that manually translate a string to a given buffer.  Documentation for these natives can be found in &amp;lt;tt&amp;gt;translation.inc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetLanguageID()&amp;lt;/tt&amp;gt;: Given a two letter language code, returns its internal ID.  English (&amp;quot;en&amp;quot;) is always ID 0.  An empty string returns the server's language ID.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetLanguageCount()&amp;lt;/tt&amp;gt;: Returns the number of languages in the translation cache.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetLanguageInfo()&amp;lt;/tt&amp;gt;: Returns a language's name and code given its ID.&lt;br /&gt;
*&amp;lt;tt&amp;gt;Translate()&amp;lt;/tt&amp;gt;: Translates a phrase given a language code, a translation file Handle (returned by &amp;lt;tt&amp;gt;LoadDictionary&amp;lt;/tt&amp;gt;), and a phrase string.&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetPlayerLanguage()&amp;lt;/tt&amp;gt;: Returns the language ID a player is using.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3279</id>
		<title>AMX Mod X 1.76 Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3279"/>
		<updated>2006-08-21T02:23:02Z</updated>

		<summary type="html">&lt;p&gt;Faluco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.76 will be a small feature release and contains mostly bug fixes.&lt;br /&gt;
This changelog is brought to you by Batman and ramen.&lt;br /&gt;
&lt;br /&gt;
=New Plugin File Features=&lt;br /&gt;
==Per-Map Plugin Files==&lt;br /&gt;
You can now have per-map plugin configuration files.  AMX Mod X will automatically load any plugins listed in files having the following name: &amp;lt;tt&amp;gt;configs/maps/plugins-&amp;lt;map&amp;gt;.ini&amp;lt;/tt&amp;gt;.  Thus, &amp;lt;tt&amp;gt;de_dust&amp;lt;/tt&amp;gt; specific plugins will be loaded from &amp;lt;tt&amp;gt;configs/maps/plugins-de_dust.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Map-specific plugin files are parsed &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; the main plugins.ini is parsed, and &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; all secondary plugins-*.ini files are parsed in the &amp;lt;tt&amp;gt;configs&amp;lt;/tt&amp;gt; folder.  This means that a map-specific plugin listing inherits all settings above itself.&lt;br /&gt;
&lt;br /&gt;
==Disabling Plugins==&lt;br /&gt;
A second feature was introduced to let users &amp;lt;i&amp;gt;disable&amp;lt;/i&amp;gt; plugins per map.  In any plugins-*.ini file, you may now add a &amp;quot;disabled&amp;quot; flag to a plugin name.  This works like the &amp;quot;debug&amp;quot; flag.  Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
gaben.amxx disabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will block the plugin from being loaded from any other configuration file.  So if &amp;lt;tt&amp;gt;plugins-de_dust.ini&amp;lt;/tt&amp;gt; has the example line above, &amp;lt;tt&amp;gt;gaben.amxx&amp;lt;/tt&amp;gt; will not be loaded from any other plugins file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=New Scripting Features=&lt;br /&gt;
==Sorting==&lt;br /&gt;
AMX Mod X now has a comprehensive array sorting solution.  You can sort using pre-defined array types, or use your own custom comparison functions.  All of the sorting routines use the qsort() function from the C standard library, which is based on the [http://linux.wku.edu/~lamonml/algor/sort/quick.html Quick Sort] algorithm.  &lt;br /&gt;
&lt;br /&gt;
===Basic Sorting===&lt;br /&gt;
The follow basic sorting natives were added.  These natives sort an array in-place using pre-defined comparison routines.  You can change the sorting order using an optional third parameter.  By default it is &amp;lt;tt&amp;gt;Sort_Ascending&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;Sort_Descending&amp;lt;/tt&amp;gt; is available as well.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1115 SortIntegers]()&amp;lt;/tt&amp;gt; - Sorts an array of integers.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1116 SortFloats]()&amp;lt;/tt&amp;gt; - Sorts an array of floats.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1117 SortStrings]()&amp;lt;/tt&amp;gt; - Sorts an array of strings.&lt;br /&gt;
&lt;br /&gt;
===Custom Sorting===&lt;br /&gt;
Furthermore, you can also define your own custom comparison functions and have the sorting algorithm run them for you.  This can be useful in a variety of ways.  For example, if you have an array of players and an array of those player's skills, you can easily sort the player ids by skill using this feature.  &lt;br /&gt;
&lt;br /&gt;
Custom sorting requires making a function which compares two elements of your array.  Given elements e1 and e2:&lt;br /&gt;
*Return -1 to mean &amp;quot;e1 comes before e2&amp;quot;&lt;br /&gt;
*Return 0 to mean &amp;quot;e1 is equal to e2&amp;quot;&lt;br /&gt;
*Return 1 to mean &amp;quot;e1 comes after e2&amp;quot;&lt;br /&gt;
For example, a very simple formula to compare integers in this manner is: &amp;lt;tt&amp;gt;e1 - e2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The custom sorting natives are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1118 SortCustom1D]()&amp;lt;/tt&amp;gt; - Sorts a 1D array given a custom comparison function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1119 SortCustom2D]()&amp;lt;/tt&amp;gt; - Sorts a 2D array given a custom comparison function.&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
You can see an example of each native listed above in the [http://svn.tcwonline.org/viewvc.cgi/trunk/plugins/testsuite/sorttest.sma?root=amxmodx&amp;amp;view=log sorting testing] plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
==Core Changes==&lt;br /&gt;
===New Features===&lt;br /&gt;
*The compiler has been heavily optimized and will now compile plugins much faster.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=43012 43012]: You can now specify per-map plugins files.  For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.&lt;br /&gt;
*You can now specify a new &amp;quot;disabled&amp;quot; option after plugin names in plugins.ini files.  This will prevent the plugin from being loaded in any config file, and is useful for disabling plugins in map-specific plugin files.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42871 42871]: Source file name is shown in the binary logs when the plugin is in the debug mode.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed a bug where secondary plugin files would not autoload modules.&lt;br /&gt;
*Fixed a serious corruption bug in callfunc_push_intrf, callfunc_push_floatrf, and callfunc_push_str.  Strings or data passed with these methods could be easily overwritten internally.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41317 41317]: ExecuteForward() string parameters would be trashed on future internal string calls.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41777 41777]: time.txt was not included in the installer.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42213 42213]: &amp;quot;amx_logs&amp;quot; was incorrectly listed as &amp;quot;amx_logsdir&amp;quot; in core.ini.&lt;br /&gt;
*Fixed a rare bug where passing (1&amp;lt;&amp;lt;31) into a %d format-code would print garbage characters.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=23838 23838]: Added natives to sort integers, floats, strings.  Also added natives to sort 1D and 2D arrays using custom algorithms.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42810 42810]: Added callfunc_push_array() to push an array through a callfunc.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42697 42697]: Added SQL_GetQueryString() to find the query string of a query handle.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=29544 29544]: Added nvault_touch() native for updating key timestamps.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41295 41295]: Added CZ model types to the CsInternalModel enumeration.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41635 41635]: All string formatting routines can now use '%u' to print integers as unsigned.  Note that Pawn only supports signed arithmetic.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41585 41585]: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=40967 40967]: set_fail_state() now logs that the plugin is failed.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41375 41375]: cs_set_weapon_silen() now has an additional parameter to toggle whether silencer animation is shown.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=40169 40169]: cs_get_user_team() now has an additional parameter by reference to get the user's internal player model.&lt;br /&gt;
*Added amxx_setpl_curweap() to the native exports table.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42916 42916]: get_user_aiming did not work on Linux.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=40963 40963]: GeoIP did not strip ports from IP addresses.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41483 41483]: xs.inc did not have double-include prevention.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=43313 43313]: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42097 42097]: Hooking FM_ServerDeactivate did not work.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42307 42307]: nvault_open() did not return -1 on failure.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42383 42383]: SQL_ThreadQuery() was not working when called from plugin_end().&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41367 41367]: stats_logging.sma now logs extra weapons from CSX.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42013 42013]: TFC team menu did allow for changing from blue team.  Also, all plmenu plugins showed team change messages in the language of the admin.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41768 41768]: statssounds.sma for TS had the wrong plugin name.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41563 41563]: TFC plmenu.sma had the wrong team names.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41259 41259]: amx_addadmin was messing users.ini upon new entries.&lt;br /&gt;
==Module Fixes==&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41030 41030]: All stats modules could generate files that would break the file parser.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41961 41961]: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42321 42321]: TFC's Get/Set ammo natives would not work as expected because of an incorrect offset in Linux servers.&lt;br /&gt;
*Fixed bug in Fakemeta where DLLFunc_RegisterEncoders would not actually make a call.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3276</id>
		<title>AMX Mod X 1.76 Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3276"/>
		<updated>2006-08-20T21:59:13Z</updated>

		<summary type="html">&lt;p&gt;Faluco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.76 will be a small feature release and contains mostly bug fixes.&lt;br /&gt;
This changelog is brought to you by Batman and ramen.&lt;br /&gt;
&lt;br /&gt;
=New Plugin File Features=&lt;br /&gt;
==Per-Map Plugin Files==&lt;br /&gt;
You can now have per-map plugin configuration files.  AMX Mod X will automatically load any plugins listed in files having the following name: &amp;lt;tt&amp;gt;configs/maps/plugins-&amp;lt;map&amp;gt;.ini&amp;lt;/tt&amp;gt;.  Thus, &amp;lt;tt&amp;gt;de_dust&amp;lt;/tt&amp;gt; specific plugins will be loaded from &amp;lt;tt&amp;gt;configs/maps/plugins-de_dust.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Map-specific plugin files are parsed &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; the main plugins.ini is parsed, and &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; all secondary plugins-*.ini files are parsed in the &amp;lt;tt&amp;gt;configs&amp;lt;/tt&amp;gt; folder.  This means that a map-specific plugin listing inherits all settings above itself.&lt;br /&gt;
&lt;br /&gt;
==Disabling Plugins==&lt;br /&gt;
A second feature was introduced to let users &amp;lt;i&amp;gt;disable&amp;lt;/i&amp;gt; plugins per map.  In any plugins-*.ini file, you may now add a &amp;quot;disabled&amp;quot; flag to a plugin name.  This works like the &amp;quot;debug&amp;quot; flag.  Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
gaben.amxx disabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will block the plugin from being loaded from any other configuration file.  So if &amp;lt;tt&amp;gt;plugins-de_dust.ini&amp;lt;/tt&amp;gt; has the example line above, &amp;lt;tt&amp;gt;gaben.amxx&amp;lt;/tt&amp;gt; will not be loaded from any other plugins file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=New Scripting Features=&lt;br /&gt;
==Sorting==&lt;br /&gt;
AMX Mod X now has a comprehensive array sorting solution.  You can sort using pre-defined array types, or use your own custom comparison functions.  All of the sorting routines use the qsort() function from the C standard library, which is based on the [http://linux.wku.edu/~lamonml/algor/sort/quick.html Quick Sort] algorithm.  &lt;br /&gt;
&lt;br /&gt;
===Basic Sorting===&lt;br /&gt;
The follow basic sorting natives were added.  These natives sort an array in-place using pre-defined comparison routines.  You can change the sorting order using an optional third parameter.  By default it is &amp;lt;tt&amp;gt;Sort_Ascending&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;Sort_Descending&amp;lt;/tt&amp;gt; is available as well.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1115 SortIntegers]()&amp;lt;/tt&amp;gt; - Sorts an array of integers.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1116 SortFloats]()&amp;lt;/tt&amp;gt; - Sorts an array of floats.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1117 SortStrings]()&amp;lt;/tt&amp;gt; - Sorts an array of strings.&lt;br /&gt;
&lt;br /&gt;
===Custom Sorting===&lt;br /&gt;
Furthermore, you can also define your own custom comparison functions and have the sorting algorithm run them for you.  This can be useful in a variety of ways.  For example, if you have an array of players and an array of those player's skills, you can easily sort the player ids by skill using this feature.  &lt;br /&gt;
&lt;br /&gt;
Custom sorting requires making a function which compares two elements of your array.  Given elements e1 and e2:&lt;br /&gt;
*Return -1 to mean &amp;quot;e1 comes before e2&amp;quot;&lt;br /&gt;
*Return 0 to mean &amp;quot;e1 is equal to e2&amp;quot;&lt;br /&gt;
*Return 1 to mean &amp;quot;e1 comes after e2&amp;quot;&lt;br /&gt;
For example, a very simple formula to compare integers in this manner is: &amp;lt;tt&amp;gt;e1 - e2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The custom sorting natives are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1118 SortCustom1D]()&amp;lt;/tt&amp;gt; - Sorts a 1D array given a custom comparison function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1119 SortCustom2D]()&amp;lt;/tt&amp;gt; - Sorts a 2D array given a custom comparison function.&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
You can see an example of each native listed above in the [http://svn.tcwonline.org/viewvc.cgi/trunk/plugins/testsuite/sorttest.sma?root=amxmodx&amp;amp;view=log sorting testing] plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
==Core Changes==&lt;br /&gt;
===New Features===&lt;br /&gt;
*The compiler has been heavily optimized and will now compile plugins much faster.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=43012 43012]: You can now specify per-map plugins files.  For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.&lt;br /&gt;
*You can now specify a new &amp;quot;disabled&amp;quot; option after plugin names in plugins.ini files.  This will prevent the plugin from being loaded in any config file, and is useful for disabling plugins in map-specific plugin files.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42871 42871]: Source file name is shown in the binary logs when the plugin is in the debug mode.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed a bug where secondary plugin files would not autoload modules.&lt;br /&gt;
*Fixed a serious corruption bug in callfunc_push_intrf, callfunc_push_floatrf, and callfunc_push_str.  Strings or data passed with these methods could be easily overwritten internally.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41317 41317]: ExecuteForward() string parameters would be trashed on future internal string calls.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41777 41777]: time.txt was not included in the installer.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42213 42213]: &amp;quot;amx_logs&amp;quot; was incorrectly listed as &amp;quot;amx_logsdir&amp;quot; in core.ini.&lt;br /&gt;
*Fixed a rare bug where passing (1&amp;lt;&amp;lt;31) into a %d format-code would print garbage characters.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=23838 23838]: Added natives to sort integers, floats, strings.  Also added natives to sort 1D and 2D arrays using custom algorithms.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42810 42810]: Added callfunc_push_array() to push an array through a callfunc.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42697 42697]: Added SQL_GetQueryString() to find the query string of a query handle.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=29544 29544]: Added nvault_touch() native for updating key timestamps.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41295 41295]: Added CZ model types to the CsInternalModel enumeration.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41635 41635]: All string formatting routines can now use '%u' to print integers as unsigned.  Note that Pawn only supports signed arithmetic.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41585 41585]: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=40967 40967]: set_fail_state() now logs that the plugin is failed.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41375 41375]: cs_set_weapon_silen() now has an additional parameter to toggle whether silencer animation is shown.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=40169 40169]: cs_get_user_team() now has an additional parameter by reference to get the user's internal player model.&lt;br /&gt;
*Added amxx_setpl_curweap() to the native exports table.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42916 42916]: get_user_aiming did not work on Linux.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=40963 40963]: GeoIP did not strip ports from IP addresses.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41483 41483]: xs.inc did not have double-include prevention.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=43313 43313]: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42097 42097]: Hooking FM_ServerDeactivate did not work.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42307 42307]: nvault_open() did not return -1 on failure.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42383 42383]: SQL_ThreadQuery() was not working when called from plugin_end().&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41367 41367]: stats_logging.sma now logs extra weapons from CSX.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42013 42013]: TFC team menu did allow for changing from blue team.  Also, all plmenu plugins showed team change messages in the language of the admin.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41768 41768]: statssounds.sma for TS had the wrong plugin name.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41563 41563]: TFC plmenu.sma had the wrong team names.&lt;br /&gt;
==Module Fixes==&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41030 41030]: All stats modules could generate files that would break the file parser.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41961 41961]: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42321 42321]: TFC's Get/Set ammo natives would not work as expected because of an incorrect offset in Linux servers.&lt;br /&gt;
*Fixed bug in Fakemeta where DLLFunc_RegisterEncoders would not actually make a call.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3263</id>
		<title>AMX Mod X 1.76 Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3263"/>
		<updated>2006-08-20T01:03:23Z</updated>

		<summary type="html">&lt;p&gt;Faluco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.76 will be a small feature release and contains mostly bug fixes.&lt;br /&gt;
This changelog is brought to you by Batman and ramen.&lt;br /&gt;
&lt;br /&gt;
=New Plugin File Features=&lt;br /&gt;
==Per-Map Plugin Files==&lt;br /&gt;
You can now have per-map plugin configuration files.  AMX Mod X will automatically load any plugins listed in files having the following name: &amp;lt;tt&amp;gt;configs/maps/plugins-&amp;lt;map&amp;gt;.ini&amp;lt;/tt&amp;gt;.  Thus, &amp;lt;tt&amp;gt;de_dust&amp;lt;/tt&amp;gt; specific plugins will be loaded from &amp;lt;tt&amp;gt;configs/maps/plugins-de_dust.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Map-specific plugin files are parsed &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; the main plugins.ini is parsed, and &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; all secondary plugins-*.ini files are parsed in the &amp;lt;tt&amp;gt;configs&amp;lt;/tt&amp;gt; folder.  This means that a map-specific plugin listing inherits all settings above itself.&lt;br /&gt;
&lt;br /&gt;
==Disabling Plugins==&lt;br /&gt;
A second feature was introduced to let users &amp;lt;i&amp;gt;disable&amp;lt;/i&amp;gt; plugins per map.  In any plugins-*.ini file, you may now add a &amp;quot;disabled&amp;quot; flag to a plugin name.  This works like the &amp;quot;debug&amp;quot; flag.  Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
gaben.amxx disabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will block the plugin from being loaded from any other configuration file.  So if &amp;lt;tt&amp;gt;plugins-de_dust.ini&amp;lt;/tt&amp;gt; has the example line above, &amp;lt;tt&amp;gt;gaben.amxx&amp;lt;/tt&amp;gt; will not be loaded from any other plugins file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
==Core Changes==&lt;br /&gt;
===New Features===&lt;br /&gt;
*The compiler has been heavily optimized and will now compile plugins much faster.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=43012 43012]: You can now specify per-map plugins files.  For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.&lt;br /&gt;
*You can now specify a new &amp;quot;disabled&amp;quot; option after plugin names in plugins.ini files.  This will prevent the plugin from being loaded in any config file, and is useful for disabling plugins in map-specific plugin files.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42871 42871]: Source file name is shown in the binary logs when the plugin is in the debug mode.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed a bug where secondary plugin files would not autoload modules.&lt;br /&gt;
*Fixed a serious corruption bug in callfunc_push_intrf, callfunc_push_floatrf, and callfunc_push_str.  Strings or data passed with these methods could be easily overwritten internally.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41317 41317]: ExecuteForward() string parameters would be trashed on future internal string calls.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41777 41777]: time.txt was not included in the installer.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42213 42213]: &amp;quot;amx_logs&amp;quot; was incorrectly listed as &amp;quot;amx_logsdir&amp;quot; in core.ini.&lt;br /&gt;
*Fixed a rare bug where passing (1&amp;lt;&amp;lt;31) into a %d format-code would print garbage characters.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41585 41585]: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41295 41295]: Added CZ model types to the CsInternalModel enumeration.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42697 42697]: Added SQL_GetQueryString() to find the query string of a query handle.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42810 42810]: Added callfunc_push_array() to push an array through a callfunc.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=40967 40967]: set_fail_state() now logs that the plugin is failed.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41375 41375]: cs_set_weapon_silen() now has an additional parameter to toggle whether silencer animation is shown.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=40169 40169]: cs_get_user_team() now has an additional parameter by reference to get the user's internal player model.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41635 41635]: All string formatting routines can now use '%u' to print integers as unsigned.  Note that Pawn only supports signed arithmetic.&lt;br /&gt;
*Added amxx_setpl_curweap() to the native exports table.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42916 42916]: get_user_aiming did not work on Linux.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=40963 40963]: GeoIP did not strip ports from IP addresses.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41483 41483]: xs.inc did not have double-include prevention.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=43313 43313]: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42097 42097]: Hooking FM_ServerDeactivate did not work.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42307 42307]: nvault_open() did not return -1 on failure.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42383 42383]: SQL_ThreadQuery() was not working when called from plugin_end().&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41367 41367]: stats_logging.sma now logs extra weapons from CSX.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42013 42013]: TFC team menu did allow for changing from blue team.  Also, all plmenu plugins showed team change messages in the language of the admin.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41768 41768]: statssounds.sma for TS had the wrong plugin name.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41563 41563]: TFC plmenu.sma had the wrong team names.&lt;br /&gt;
==Module Fixes==&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41030 41030]: All stats modules could generate files that would break the file parser.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41961 41961]: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.&lt;br /&gt;
*Fixed bug in Fakemeta where DLLFunc_RegisterEncoders would not actually make a call.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3260</id>
		<title>AMX Mod X 1.76 Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3260"/>
		<updated>2006-08-19T20:28:27Z</updated>

		<summary type="html">&lt;p&gt;Faluco: request&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.76 will be a small feature release and contains mostly bug fixes.&lt;br /&gt;
This changelog is brought to you by Batman and ramen.&lt;br /&gt;
&lt;br /&gt;
=New Plugin File Features=&lt;br /&gt;
==Per-Map Plugin Files==&lt;br /&gt;
You can now have per-map plugin configuration files.  AMX Mod X will automatically load any plugins listed in files having the following name: &amp;lt;tt&amp;gt;configs/maps/plugins-&amp;lt;map&amp;gt;.ini&amp;lt;/tt&amp;gt;.  Thus, &amp;lt;tt&amp;gt;de_dust&amp;lt;/tt&amp;gt; specific plugins will be loaded from &amp;lt;tt&amp;gt;configs/maps/plugins-de_dust.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Map-specific plugin files are parsed &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; the main plugins.ini is parsed, and &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; all secondary plugins-*.ini files are parsed in the &amp;lt;tt&amp;gt;configs&amp;lt;/tt&amp;gt; folder.  This means that a map-specific plugin listing inherits all settings above itself.&lt;br /&gt;
&lt;br /&gt;
==Disabling Plugins==&lt;br /&gt;
A second feature was introduced to let users &amp;lt;i&amp;gt;disable&amp;lt;/i&amp;gt; plugins per map.  In any plugins-*.ini file, you may now add a &amp;quot;disabled&amp;quot; flag to a plugin name.  This works like the &amp;quot;debug&amp;quot; flag.  Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
gaben.amxx disabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will block the plugin from being loaded from any other configuration file.  So if &amp;lt;tt&amp;gt;plugins-de_dust.ini&amp;lt;/tt&amp;gt; has the example line above, &amp;lt;tt&amp;gt;gaben.amxx&amp;lt;/tt&amp;gt; will not be loaded from any other plugins file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
==Core Changes==&lt;br /&gt;
===New Features===&lt;br /&gt;
*The compiler has been heavily optimized and will now compile plugins much faster.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=43012 43012]: You can now specify per-map plugins files.  For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.&lt;br /&gt;
*You can now specify a new &amp;quot;disabled&amp;quot; option after plugin names in plugins.ini files.  This will prevent the plugin from being loaded in any config file, and is useful for disabling plugins in map-specific plugin files.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42871 42871]: Source file name is shown in the binary logs when the plugin is in the debug mode.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed a bug where secondary plugin files would not autoload modules.&lt;br /&gt;
*Fixed a serious corruption bug in callfunc_push_intrf, callfunc_push_floatrf, and callfunc_push_str.  Strings or data passed with these methods could be easily overwritten internally.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41317 41317]: ExecuteForward() string parameters would be trashed on future internal string calls.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41777 41777]: time.txt was not included in the installer.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42213 42213]: &amp;quot;amx_logs&amp;quot; was incorrectly listed as &amp;quot;amx_logsdir&amp;quot; in core.ini.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41585 41585]: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41295 41295]: Added CZ model types to the CsInternalModel enumeration.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42697 42697]: Added SQL_GetQueryString() to find the query string of a query handle.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42810 42810]: Added callfunc_push_array() to push an array through a callfunc.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=40967 40967]: set_fail_state() now logs that the plugin is failed.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41375 41375]: cs_set_weapon_silen() now has an additional parameter to toggle whether silencer animation is shown.&lt;br /&gt;
*Added amxx_setpl_curweap() to the native exports table.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42916 42916]: get_user_aiming did not work on Linux.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=40963 40963]: GeoIP did not strip ports from IP addresses.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41483 41483]: xs.inc did not have double-include prevention.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=43313 43313]: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42097 42097]: Hooking FM_ServerDeactivate did not work.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42307 42307]: nvault_open() did not return -1 on failure.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42383 42383]: SQL_ThreadQuery() was not working when called from plugin_end().&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41367 41367]: stats_logging.sma now logs extra weapons from CSX.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42013 42013]: TFC team menu did allow for changing from blue team.  Also, all plmenu plugins showed team change messages in the language of the admin.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41768 41768]: statssounds.sma for TS had the wrong plugin name.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41563 41563]: TFC plmenu.sma had the wrong team names.&lt;br /&gt;
==Module Fixes==&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41030 41030]: All stats modules could generate files that would break the file parser.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41961 41961]: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.&lt;br /&gt;
*Fixed bug in Fakemeta where DLLFunc_RegisterEncoders would not actually make a call.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3249</id>
		<title>AMX Mod X 1.76 Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3249"/>
		<updated>2006-08-18T17:33:26Z</updated>

		<summary type="html">&lt;p&gt;Faluco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.76 will be a small feature release and contains mostly bug fixes.&lt;br /&gt;
&lt;br /&gt;
=New Plugin File Features=&lt;br /&gt;
==Per-Map Plugin Files==&lt;br /&gt;
You can now have per-map plugin configuration files.  AMX Mod X will automatically load any plugins listed in files having the following name: &amp;lt;tt&amp;gt;configs/maps/plugins-&amp;lt;map&amp;gt;.ini&amp;lt;/tt&amp;gt;.  Thus, &amp;lt;tt&amp;gt;de_dust&amp;lt;/tt&amp;gt; specific plugins will be loaded from &amp;lt;tt&amp;gt;configs/maps/plugins-de_dust.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Map-specific plugin files are parsed &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; the main plugins.ini is parsed, and &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; all secondary plugins-*.ini files are parsed in the &amp;lt;tt&amp;gt;configs&amp;lt;/tt&amp;gt; folder.  This means that a map-specific plugin listing inherits all settings above itself.&lt;br /&gt;
&lt;br /&gt;
==Disabling Plugins==&lt;br /&gt;
A second feature was introduced to let users &amp;lt;i&amp;gt;disable&amp;lt;/i&amp;gt; plugins per map.  In any plugins-*.ini file, you may now add a &amp;quot;disabled&amp;quot; flag to a plugin name.  This works like the &amp;quot;debug&amp;quot; flag.  Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
gaben.amxx disabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will block the plugin from being loaded from any other configuration file.  So if &amp;lt;tt&amp;gt;plugins-de_dust.ini&amp;lt;/tt&amp;gt; has the example line above, &amp;lt;tt&amp;gt;gaben.amxx&amp;lt;/tt&amp;gt; will not be loaded from any other plugins file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
==Core Changes==&lt;br /&gt;
===New Features===&lt;br /&gt;
*The compiler has been heavily optimized and will now compile plugins much faster.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=43012 43012]: You can now specify per-map plugins files.  For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.&lt;br /&gt;
*You can now specify a new &amp;quot;disabled&amp;quot; option after plugin names in plugins.ini files.  This will prevent the plugin from being loaded in any config file, and is useful for disabling plugins in map-specific plugin files.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed a bug where secondary plugin files would not autoload modules.&lt;br /&gt;
*Fixed a serious corruption bug in callfunc_push_intrf, callfunc_push_floatrf, and callfunc_push_str.  Strings or data passed with these methods could be easily overwritten internally.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41317 41317]: ExecuteForward() string parameters would be trashed on future internal string calls.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41777 41777]: time.txt was not included in the installer.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41585 41585]: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41295 41295]: Added CZ model types to the CsInternalModel enumeration.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42697 42697]: Added SQL_GetQueryString() to find the query string of a query handle.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42810 42810]: Added callfunc_push_array() to push an array through a callfunc.&lt;br /&gt;
*Added amxx_setpl_curweap() to the native exports table.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42916 42916]: get_user_aiming did not work on Linux.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=40963 40963]: GeoIP did not strip ports from IP addresses.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41483 41483]: xs.inc did not have double-include prevention.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=43313 43313]: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41367 41367]: stats_logging.sma now logs extra weapons from CSX.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42013 42013]: TFC team menu did allow for changing from blue team.  Also, all plmenu plugins showed team change messages in the language of the admin.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41768 41768]: statssounds.sma for TS had the wrong plugin name.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41563 41563]: TFC plmenu.sma had the wrong team names.&lt;br /&gt;
==Module Fixes==&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41961 41961]: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.&lt;br /&gt;
*Fixed bug in Fakemeta where DLLFunc_RegisterEncoders would not actually make a call.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3248</id>
		<title>AMX Mod X 1.76 Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3248"/>
		<updated>2006-08-18T17:32:53Z</updated>

		<summary type="html">&lt;p&gt;Faluco: added new bug fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.76 will be a small feature release and contains mostly bug fixes.&lt;br /&gt;
&lt;br /&gt;
=New Plugin File Features=&lt;br /&gt;
==Per-Map Plugin Files==&lt;br /&gt;
You can now have per-map plugin configuration files.  AMX Mod X will automatically load any plugins listed in files having the following name: &amp;lt;tt&amp;gt;configs/maps/plugins-&amp;lt;map&amp;gt;.ini&amp;lt;/tt&amp;gt;.  Thus, &amp;lt;tt&amp;gt;de_dust&amp;lt;/tt&amp;gt; specific plugins will be loaded from &amp;lt;tt&amp;gt;configs/maps/plugins-de_dust.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Map-specific plugin files are parsed &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; the main plugins.ini is parsed, and &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; all secondary plugins-*.ini files are parsed in the &amp;lt;tt&amp;gt;configs&amp;lt;/tt&amp;gt; folder.  This means that a map-specific plugin listing inherits all settings above itself.&lt;br /&gt;
&lt;br /&gt;
==Disabling Plugins==&lt;br /&gt;
A second feature was introduced to let users &amp;lt;i&amp;gt;disable&amp;lt;/i&amp;gt; plugins per map.  In any plugins-*.ini file, you may now add a &amp;quot;disabled&amp;quot; flag to a plugin name.  This works like the &amp;quot;debug&amp;quot; flag.  Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
gaben.amxx disabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will block the plugin from being loaded from any other configuration file.  So if &amp;lt;tt&amp;gt;plugins-de_dust.ini&amp;lt;/tt&amp;gt; has the example line above, &amp;lt;tt&amp;gt;gaben.amxx&amp;lt;/tt&amp;gt; will not be loaded from any other plugins file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
==Core Changes==&lt;br /&gt;
===New Features===&lt;br /&gt;
*The compiler has been heavily optimized and will now compile plugins much faster.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=43012 43012]: You can now specify per-map plugins files.  For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.&lt;br /&gt;
*You can now specify a new &amp;quot;disabled&amp;quot; option after plugin names in plugins.ini files.  This will prevent the plugin from being loaded in any config file, and is useful for disabling plugins in map-specific plugin files.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed a bug where secondary plugin files would not autoload modules.&lt;br /&gt;
*Fixed a serious corruption bug in callfunc_push_intrf, callfunc_push_floatrf, and callfunc_push_str.  Strings or data passed with these methods could be easily overwritten internally.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41317 41317]: ExecuteForward() string parameters would be trashed on future internal string calls.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41777 41777]: time.txt was not included in the installer.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41585 41585]: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41295 41295]: Added CZ model types to the CsInternalModel enumeration.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42697 42697]: Added SQL_GetQueryString() to find the query string of a query handle.&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=42810 42810]: Added callfunc_push_array() to push an array through a callfunc.&lt;br /&gt;
*Added amxx_setpl_curweap() to the native exports table.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42916 42916]: get_user_aiming did not work on Linux.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=40963 40963]: GeoIP did not strip ports from IP addresses.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41483 41483]: xs.inc did not have double-include prevention.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=43313 43313]: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request am[http://forums.alliedmods.net/showthread.php?t=41367 41367]: stats_logging.sma now logs extra weapons from CSX.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=42013 42013]: TFC team menu did allow for changing from blue team.  Also, all plmenu plugins showed team change messages in the language of the admin.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41768 41768]: statssounds.sma for TS had the wrong plugin name.&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41563 41563]: TFC plmenu.sma had the wrong team names.&lt;br /&gt;
==Module Fixes==&lt;br /&gt;
*Fixed am[http://forums.alliedmods.net/showthread.php?t=41961 41961]: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.&lt;br /&gt;
Fixed bug in Fakemeta where DLLFunc_RegisterEncoders would not actually make a call.&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.75_Scripting_Changes&amp;diff=3079</id>
		<title>AMX Mod X 1.75 Scripting Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.75_Scripting_Changes&amp;diff=3079"/>
		<updated>2006-06-10T21:02:39Z</updated>

		<summary type="html">&lt;p&gt;Faluco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The AMX Mod X 1.75 release made important changes.  While backwards compatibility was kept, intended functionality shifted in esoteric areas that will affect some plugins.  Reading this article is highly recommended.&lt;br /&gt;
&lt;br /&gt;
=Module Requirement System=&lt;br /&gt;
As part of the new Automatic Module Loading, the old &amp;lt;tt&amp;gt;#pragma library&amp;lt;/tt&amp;gt; has been deprecated.  You must now use:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#pragma reqlib &amp;lt;library&amp;gt;&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This means &amp;quot;require library&amp;quot;.  Plugins still compiled with &amp;lt;tt&amp;gt;#pragma library&amp;lt;/tt&amp;gt; will still fail on load if the given module is not found.  However, core will try to load each module given the rules below under &amp;quot;Automatic Module Loading&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Auto Plugin Files=&lt;br /&gt;
With the introduction of callfunc and register_native, many people now distribute plugins in large sets.  To make this easier on users, you can now distribute an &amp;quot;extended plugin file.&amp;quot;  For example, say you have five plugins in a set.  Normally, you would have to ask the user to write each name into plugins.ini, like so:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 file1.amxx   ;file1&lt;br /&gt;
 file2.amxx   ;file2&lt;br /&gt;
 file3.amxx   ;file3&lt;br /&gt;
 file4.amxx   ;file4&lt;br /&gt;
 file5.amxx   ;file5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With AMX Mod X 1.75, any file in the configs folder which follows a certain name pattern will be auto-loaded as an additional plugins.ini file.  The pattern is: plugins-*.ini.  &lt;br /&gt;
&lt;br /&gt;
For example, you could distribute &amp;lt;tt&amp;gt;plugins-carmod.ini&amp;lt;/tt&amp;gt; as:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
;put a semi-colon to disable a plugin&lt;br /&gt;
cars_honda.amxx  &lt;br /&gt;
cars_toyota.amxx&lt;br /&gt;
cars_ford.amxx&lt;br /&gt;
cars_bmw.amxx&lt;br /&gt;
cars_gaben.amxx&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This way, you can easily distribute an extractable install, rather than giving the user overcomplicated instructions.  Furthermore, the file is easily disabled by simply modifying the name (for example, &amp;quot;disabled-carmod.ini&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Automatic Module Loading=&lt;br /&gt;
==Overview==&lt;br /&gt;
As of AMX Mod X 1.75, there is a new, powerful automatic module loading system.  That means that &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; is largely deprecated for general use.  Instead, modules are loaded as plugins need them.  This is done dynamically by core before plugins are even loaded, without the need to patch &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; and then change the map.&lt;br /&gt;
&lt;br /&gt;
Modules can now define &amp;quot;Libraries&amp;quot; and &amp;quot;Library Classes&amp;quot;.  A library is a specific identifier that should match the filename of the module.  For example, Engine's defined library is &amp;quot;engine&amp;quot;.  FakeMeta's library is &amp;quot;fakemeta&amp;quot;, and so on.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;library class&amp;quot; defines membership to a set of modules.  For example, CSX has the library name &amp;quot;csx&amp;quot;, but it is part of the library class &amp;quot;xstats&amp;quot;.  Library classes are also used for DBI and SQLX.  This is very useful for being able to require one module type of any implementation.&lt;br /&gt;
&lt;br /&gt;
==New API==&lt;br /&gt;
===Compiler Pragmas===&lt;br /&gt;
This is expanded with a number of new &amp;lt;tt&amp;gt;#pragma&amp;lt;/tt&amp;gt; directives:&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma reqlib &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Requires that a given library must be loaded.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma reqclass &amp;amp;lt;libclass&amp;gt;&amp;lt;/tt&amp;gt; - Requires that a given library class must be loaded.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma loadlib &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Automatically attempts to load a given library (see more info below).&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma expectlib &amp;amp;lt;library1&amp;gt; &amp;amp;lt;library2&amp;gt;&amp;lt;/tt&amp;gt; - If the first library is not loaded, the second one will be attempted to load (not very useful).&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma expectclass &amp;amp;lt;class&amp;gt; &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - If the expected class is not found, the given library will be attempted to load.  This is useful for defining a default module to be loaded with a given class of modules.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma defclasslib &amp;amp;lt;class&amp;gt; &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Same as &amp;lt;tt&amp;gt;expectclass&amp;lt;/tt&amp;gt;, however, &amp;lt;tt&amp;gt;defclasslib&amp;lt;/tt&amp;gt; waits until all expectations are resolved.  This lets plugins override defaults by adding their own expectations.&lt;br /&gt;
&lt;br /&gt;
===Module Filtering===&lt;br /&gt;
The module_filter prototype now includes a second parameter, which tells you whether the requirement is a class or library.&lt;br /&gt;
&lt;br /&gt;
Furthermore, module_exists has been deprecated for LibraryExists().&lt;br /&gt;
&lt;br /&gt;
==How it Works==&lt;br /&gt;
The precise order of events is as follows:&lt;br /&gt;
*When the first entity is spawned, AMX Mod X loads all unloaded modules in &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*After &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; is parsed, &amp;lt;tt&amp;gt;plugins.ini&amp;lt;/tt&amp;gt; is read.  Each file is mapped into a cache.&lt;br /&gt;
*The cache is previewed.&lt;br /&gt;
**First, the &amp;quot;library&amp;quot; table is read.  This table is read for backwards compatibility with AMX Mod X 1.71 and prior.  Each entry is read as a module file shortname, and the module is loaded if it exists.  &lt;br /&gt;
**Next, the &amp;quot;pubtags&amp;quot; table is read.  Each entry is decoded to one of the special #pragma commands.&lt;br /&gt;
***All loadlib commands are executed, and the modules loaded.&lt;br /&gt;
***All expect commands are executed.&lt;br /&gt;
***All defclasslib commands are executed.&lt;br /&gt;
*AMX Mod X then waits until ServerActivate is called.&lt;br /&gt;
*All plugins are loaded.  If the plugin is in the cache, the cache is read instead.  For each plugin...&lt;br /&gt;
**The library table is read.  For each library that is both nonexistant and unhandled by a module filter, the plugin fails to load.&lt;br /&gt;
**The pubtags table is read.  For each reqlib and reqclass entry that are both nonexistant and unhandled by a module filter, the plugin fails to load.&lt;br /&gt;
*The plugin cache is invalidated and the server is considered &amp;quot;loaded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SQLX=&lt;br /&gt;
==Introduction==&lt;br /&gt;
SQLX is a new Database API that supercedes DBI.  Its main feature is that you can load two SQLX modules at once, whereas you cannot with DBI.  It also supports threaded queries, which let you process data without interrupting gameplay from a bad network connection.&lt;br /&gt;
&lt;br /&gt;
These additions come at a hefty price.  The SQLX API is significantly more complex than DBI.  Although some might find it easier to use due to its simpler error checking and iteration, it requires more manual memory management and has less simple abstraction.  Furthermore, taking advantage of the new &amp;lt;tt&amp;gt;SQL_ThreadQuery&amp;lt;/tt&amp;gt; native will require nothing short of a rewrite for most plugins, as it is ''asynchronous'' instead of ''synchronous''.  Because of this, the new SQLX modules also implement the old DBI functionality, for both backwards compatibility and for plugin developers familiar with the old API.  All three APIs - SQL-threaded, SQL-non-threaded, and DBI, are still fully supported.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Since SQLX is an expansive API, showing a single plugin of its usage would be difficult.  It is highly recommended that users interested in the new API look at the [http://cvs.tcwonline.org/viewvc.cgi/amxmodx/plugins/testsuite/sqlxtest.sma?view=log SQLxTest] plugin, which compares two different DBI methods and both SQL methods of querying a database.  It is highly useful for both regression testing and for getting an idea of how the API works.&lt;br /&gt;
&lt;br /&gt;
The most important concept of SQLX is &amp;quot;Handles,&amp;quot; which are a precursor to a system planned for SourceMod.  Handles are datatypes that store internal information that you should not modify.  Whenever you create a handle, you must also free it, with &amp;lt;tt&amp;gt;SQL_FreeHandle&amp;lt;/tt&amp;gt;().&lt;br /&gt;
&lt;br /&gt;
==Native Overview==&lt;br /&gt;
The basic natives of SQLX are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_MakeDbTuple&amp;lt;/tt&amp;gt; (or simple stock version, &amp;lt;tt&amp;gt;SQL_MakeStdTuple&amp;lt;/tt&amp;gt;) - This creates a variable that holds information about a database.  It does not connect to the database.  This is so you don't have to keep retrieving cvar info on every connection.  You do not have to free these handles, although it is a good idea if you create them dynamically.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_Connect&amp;lt;/tt&amp;gt; - Connects to a database and returns a new Handle, or &amp;lt;tt&amp;gt;Empty_Handle&amp;lt;/tt&amp;gt; on failure.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_PrepareQuery&amp;lt;/tt&amp;gt; - Prepares a query for execution, and returns a new Handle to the query.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_Execute&amp;lt;/tt&amp;gt; - Executes a prepared query, and returns 0 on failure (1 on success).&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_MoreResults&amp;lt;/tt&amp;gt; - Returns 1 if there are more results in the query result queue, 0 if none.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_ReadResult&amp;lt;/tt&amp;gt; - Reads the current row result by the column's numerical index, similar to dbi_field/dbi_result.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_NextRow&amp;lt;/tt&amp;gt; - Advances to the next result row.  '''Compatibility Warning''': This does not need to be called first! Unlike &amp;lt;tt&amp;gt;dbi_nextrow&amp;lt;/tt&amp;gt;, the query is automatically at the first row.  If you call &amp;lt;tt&amp;gt;SQL_NextRow&amp;lt;/tt&amp;gt; before &amp;lt;tt&amp;gt;SQL_ReadResult&amp;lt;/tt&amp;gt;, your are actually skipping a row.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_FreeHandle&amp;lt;/tt&amp;gt; - Frees a Handle.  You must do this or else memory will leak.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_ThreadQuery&amp;lt;/tt&amp;gt; - Places a query and connection info into a threaded queue.  In another thread, the connection is established, the query is executed, and the connection is dropped.  The query results are then posted back into the main thread and given to the plugin on the next server-frame.  &lt;br /&gt;
**Note that while powerful, the mechanism is very simplistic.  Similar to &amp;lt;tt&amp;gt;set_task&amp;lt;/tt&amp;gt;, you must differentiate multiple queries having the same callback by packing binary data into an array.  Furthermore, you can only make one query at a time, since the queue is &amp;quot;push one, resolve one, pop one.&amp;quot;  If you plan on making five queries in a row in order to get aggregate information about a player, you must make each of these five queries in separate stages, and you must also take into account asynchronous factors such as the player dropping during the middle of a query.  (One way to do this is to pack the player's authid and client index into the callback data and verify it when the query finishes.)&lt;br /&gt;
&lt;br /&gt;
=New Natives / Native Changes=&lt;br /&gt;
==Register Message==&lt;br /&gt;
The &amp;lt;tt&amp;gt;register_message&amp;lt;/tt&amp;gt; set of natives, including &amp;lt;tt&amp;gt;get/set_msg_block&amp;lt;/tt&amp;gt;, has been moved to Core.  This is to facilitate users who prefer to use FakeMeta, and like the simplicity and speed of using Engine's message interception functions.  &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
This change is backwards compatible.&lt;br /&gt;
&lt;br /&gt;
==Argument Formatting==&lt;br /&gt;
The &amp;lt;tt&amp;gt;format_args&amp;lt;/tt&amp;gt; function is now replaced with a much faster, more compatible &amp;lt;tt&amp;gt;vformat&amp;lt;/tt&amp;gt; function.  Its usage is slightly different (read the include file, &amp;lt;tt&amp;gt;string.inc&amp;lt;/tt&amp;gt;), but it accepts %L, whereas format_args does not.  A quick example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;debugprint(const fmt[], ...)&lt;br /&gt;
{&lt;br /&gt;
   static temp[2048]&lt;br /&gt;
   vformat(temp, sizeof(temp)-1, fmt, 2)&lt;br /&gt;
   log_message(&amp;quot;[DEBUG] %s&amp;quot;, temp)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Other Core Natives==&lt;br /&gt;
*&amp;lt;tt&amp;gt;register_plugin&amp;lt;/tt&amp;gt; - Now returns a plugin id.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_amxx_verstring&amp;lt;/tt&amp;gt; - Returns the AMX Mod X version string.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_weaponid&amp;lt;/tt&amp;gt; - Gets a weapon id from a weapon name.&lt;br /&gt;
&lt;br /&gt;
==FakeMeta==&lt;br /&gt;
===New Natives===&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_orig_retval&amp;lt;/tt&amp;gt; - Gets the original return value of an engine or game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;copy_infokey_buffer&amp;lt;/tt&amp;gt; - Copies the given infobuffer pointer into output buffer.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_cd&amp;lt;/tt&amp;gt; - Gets or sets members of a clientdata data structure (used with UpdateClientData).&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_es&amp;lt;/tt&amp;gt; - Gets or sets members of an entity_state data structure (used with AddToFullPack).&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_uc&amp;lt;/tt&amp;gt; - Gets or sets members of a usecmd data structure (used with CmdStart).&lt;br /&gt;
&lt;br /&gt;
===New Engine/GameDLL Functions===&lt;br /&gt;
The &amp;lt;tt&amp;gt;register_forward&amp;lt;/tt&amp;gt; native now allows for hooking a number of new functions from the engine or game DLL including:&lt;br /&gt;
*&amp;lt;tt&amp;gt;UpdateClientData&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;AddToFullPack&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CmdStart&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CmdEnd&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateInstBaselines&amp;lt;/tt&amp;gt; - Game DLL function&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateInstBaseline&amp;lt;/tt&amp;gt; - Engine function&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateBaseline&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetInfoKeyBuffer&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;AlertMessage&amp;lt;/tt&amp;gt; - This now can be called via &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;ClientPrintf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These functions can also be called via &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;dllfunc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Breaking Changes===&lt;br /&gt;
Using &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt; in order to call &amp;lt;tt&amp;gt;EngFunc_InfoKeyValue&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;EngFunc_SetKeyValue&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;EngFunc_SetClientKeyValue&amp;lt;/tt&amp;gt; now requires passing an infobuffer pointer. An infobuffer pointer can be obtained by calling &amp;lt;tt&amp;gt;EngFunc_GetInfoKeyBuffer&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;some_function(id, name[])&lt;br /&gt;
{&lt;br /&gt;
   new infokey = engfunc(EngFunc_GetInfoKeyBuffer, id)&lt;br /&gt;
   engfunc(EngFunc_SetClientKeyValue, id, infokey, &amp;quot;model&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you hook ClientUserInfoChanged via Fakemeta, an infobuffer pointer is now also forwarded to your function in addition to the client id.&lt;br /&gt;
&lt;br /&gt;
==Cstrike==&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_get_user_mapzones&amp;lt;/tt&amp;gt; - Returns bitwise flags of where on the map a player is located such as buy zone, bomb site, hostage rescue zone, VIP safety zone, and escape zone.&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_set_user_vip&amp;lt;/tt&amp;gt; - Now takes two additional (but optional) parameters for determining whether or not the player model and scoreboard get updated.&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_set_user_zoom&amp;lt;/tt&amp;gt; - Sets a zooming type on a player for any weapon.&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_get_user_zoom&amp;lt;/tt&amp;gt; - Returns the zooming type of a player.&lt;br /&gt;
&lt;br /&gt;
==New Stocks==&lt;br /&gt;
===Engine===&lt;br /&gt;
*&amp;lt;tt&amp;gt;IsInWorld&amp;lt;/tt&amp;gt; - Checks if an entity is within the bounds of the world (from HLSDK).&lt;br /&gt;
&lt;br /&gt;
===FakeMeta===&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_UpdateClientData&amp;lt;/tt&amp;gt; - Calls UpdateClientData game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_AddToFullPack&amp;lt;/tt&amp;gt; - Calls AddToFullPack game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CmdStart&amp;lt;/tt&amp;gt; - Calls CmdStart game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CmdEnd&amp;lt;/tt&amp;gt; - Calls CmdEnd game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CreateBaseline&amp;lt;/tt&amp;gt; - Calls CreateBaseline game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CreateInstBaselines&amp;lt;/tt&amp;gt; - Calls CreateInstancedBaselines game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_CreateInstBaseline&amp;lt;/tt&amp;gt; - Calls CreateInstancedBaseline engine function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_GetInfoKeyBuffer&amp;lt;/tt&amp;gt; - Calls GetInfoKeyBuffer engine function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_ClientPrintf&amp;lt;/tt&amp;gt; - Calls ClientPrintf engine function.&lt;br /&gt;
&lt;br /&gt;
==New Constants==&lt;br /&gt;
Various sound constants (&amp;lt;tt&amp;gt;SND_SPAWNING&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SND_STOP&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SND_CHANGE_VOL&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;SND_CHANGE_PITCH&amp;lt;/tt&amp;gt;) from the HL SDK as well as a constant for pi were added to &amp;lt;tt&amp;gt;amxconst.inc&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;TE_*&amp;lt;/tt&amp;gt; (temp entity) message constants have also been added which will automatically be included with &amp;lt;tt&amp;gt;#include &amp;lt;amxmodx&amp;gt;&amp;lt;/tt&amp;gt;. And finally, a new &amp;lt;tt&amp;gt;hlsdk_const.inc&amp;lt;/tt&amp;gt; file has been added that contains many more constants from the SDK. This is automatically included with &amp;lt;tt&amp;gt;#include &amp;lt;engine&amp;gt;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;#include &amp;lt;fakemeta&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Module API=&lt;br /&gt;
The AMX Mod X module API received a small overhaul for 1.75.&lt;br /&gt;
&lt;br /&gt;
==Versioning/Interface Additions==&lt;br /&gt;
The internal module interface version is 4.  However, modules from M/SDK 3 will still load.  &lt;br /&gt;
&lt;br /&gt;
M/SDK Version 4 modules have two new members of public information: the library string, and the library class string.  These contain comma delimited names of whatever libraries or library classes the module would like to be registered.&lt;br /&gt;
&lt;br /&gt;
For backwards compatibility, M/SDK Version 4 modules have an automatically empty library class string, and a library string equal to the logtag string.&lt;br /&gt;
&lt;br /&gt;
==New Callbacks==&lt;br /&gt;
Modules can now be informed of when plugins are about to be unloaded, and when plugins have been fully unloaded.  This means that modules don't have to hook ServerActivate and ServerActivate_Post (implementation dependent), don't need to be loaded by Metamod, and don't need to detach simply to release resources.&lt;br /&gt;
&lt;br /&gt;
==New Functions==&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_GetLocalInfo&amp;lt;/tt&amp;gt; - Intended for modules using LOCALINFO, which required a Metamod attachment.  This is equal to AMX Mod X's core function &amp;lt;tt&amp;gt;get_localinfo&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_OverrideNatives&amp;lt;/tt&amp;gt; - Given a native list, this specifies that any other module already providing these natives will no longer provide them.  This was added to force backwards compatibility between SQLITE and MySQLX.  Usage is not recommended.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_FindLibrary&amp;lt;/tt&amp;gt; - Essentially the same function as LibraryExists() for plugins.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_AddLibraries&amp;lt;/tt&amp;gt; - Adds a comma delimited list of libraries or library classes.  You must specify a &amp;quot;parent&amp;quot; pointer that identifies the module.  This is easily accomplished by taking the address of any static variable.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_RemoveLibraries&amp;lt;/tt&amp;gt; - Removes all library entries with the given parent pointer.  This is useful if your module adds custom entries not in its defined list.  &lt;br /&gt;
&lt;br /&gt;
==MSVC8 Compatibility==&lt;br /&gt;
M/SDK Version 4 now contains preprocessor definitions for compatibility with Microsoft's Visual Studio 2005/8.0 (provided by [[User:Damaged Soul|Damaged Soul]]).  These macros can be turned off in the &amp;lt;tt&amp;gt;moduleconfig.h&amp;lt;/tt&amp;gt; file by uncommenting the definition of &amp;lt;tt&amp;gt;NO_MSVC8_AUTO_COMPAT&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Minor Changes=&lt;br /&gt;
==Compiler Defines==&lt;br /&gt;
Since &amp;lt;tt&amp;gt;__DATE__&amp;lt;/tt&amp;gt; was fixed in 1.75, the macro &amp;lt;tt&amp;gt;__TIME__&amp;lt;/tt&amp;gt; was also added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
This changelog is tentative.  Developers will be editing it as things are changed.&lt;br /&gt;
&lt;br /&gt;
* Core Changes&lt;br /&gt;
** Modules are now automatically loaded by detecting plugin usage.&lt;br /&gt;
*** modules.ini is now primarily deprecated, except for SQL and unsupported libraries.&lt;br /&gt;
** Rewrote SQLX modules (again).  You can now load multiple SQL modules and toggle them per-plugin.&lt;br /&gt;
*** Added new SQL API called SQLX.  DBI was kept backwards-compatible.&lt;br /&gt;
*** Added new function to thread SQL queries (which prevents lag from a bad connection).&lt;br /&gt;
** Fixed some very small memory leaks.&lt;br /&gt;
** Fixed binary logging building wrong on Linux.&lt;br /&gt;
** Fixed some debugging crashes.&lt;br /&gt;
** Fixed serious bug when creating plugin_pause/plugin_unpause forwards.&lt;br /&gt;
** Fixed serious crash bug involving set_hudmessage and plugins using high hudchannels.&lt;br /&gt;
** Added natives:&lt;br /&gt;
*** fputs()&lt;br /&gt;
*** get_weaponid()&lt;br /&gt;
*** rename_file()&lt;br /&gt;
*** vformat()&lt;br /&gt;
** Any file starting with &amp;quot;plugins-&amp;quot; and ending in &amp;quot;.ini&amp;quot; will now be treated as an extended plugins file.  This is useful for distributing sets of plugins separately, and easily disabling them with a name change.&lt;br /&gt;
&lt;br /&gt;
* Fakemeta Changes&lt;br /&gt;
** Added new hookable/callable functions:&lt;br /&gt;
*** AddToFullPack&lt;br /&gt;
*** AlertMessage&lt;br /&gt;
*** ClientPrintf&lt;br /&gt;
*** ClientUserInfoChanged&lt;br /&gt;
*** CmdEnd&lt;br /&gt;
*** CmdStart&lt;br /&gt;
*** CreateBaseline&lt;br /&gt;
*** CreateInstancedBaseline&lt;br /&gt;
*** GetInfoKeyBuffer&lt;br /&gt;
*** InfoKeyValue&lt;br /&gt;
*** UpdateClientData&lt;br /&gt;
*** SetClientKeyValue&lt;br /&gt;
*** SetKeyValue&lt;br /&gt;
** Added new natives:&lt;br /&gt;
*** copy_infokey_buffer&lt;br /&gt;
*** get_orig_retval&lt;br /&gt;
** Fixed various trace bugs in FakeMeta with certain natives.&lt;br /&gt;
** Fixed some unhooking on server-deactivate problems in FakeMeta.&lt;br /&gt;
&lt;br /&gt;
* Scripting Changes:&lt;br /&gt;
** Added __DATE__ and __TIME__ auto-macros to the compiler.&lt;br /&gt;
** Added many HLSDK constants and improved include organization.&lt;br /&gt;
** Added new compiler #pragma directives for using the module autoloading system.&lt;br /&gt;
** Added cs_get_user_mapzones (thanks VEN!).&lt;br /&gt;
** Added cs_set_user_zoom.&lt;br /&gt;
** Added cs_get_user_zoom.&lt;br /&gt;
** Added IsInWorld() stock (thanks Twilight Suzuka!).&lt;br /&gt;
** Added nvault_remove().&lt;br /&gt;
** Moved various natives from Engine and into Core:&lt;br /&gt;
*** register_message&lt;br /&gt;
*** get_msg_args&lt;br /&gt;
*** get/set_msg_arg_type&lt;br /&gt;
*** get/set_msg_arg_int&lt;br /&gt;
*** get/set_msg_arg_float&lt;br /&gt;
*** get/set_msg_arg_string&lt;br /&gt;
*** get_msg_origin&lt;br /&gt;
*** get/set_msg_block&lt;br /&gt;
*** velocity_by_aim&lt;br /&gt;
*** vector_to_angle&lt;br /&gt;
*** angle_vector&lt;br /&gt;
*** vector_length&lt;br /&gt;
*** vector_distance&lt;br /&gt;
*** precache_generic&lt;br /&gt;
** Dynamic natives that are paused now also pause parent plugins (with an error).&lt;br /&gt;
** register_plugin() now returns the plugin ID.&lt;br /&gt;
** Fixed a corruption bug in strip_user_weapons().&lt;br /&gt;
** Fixed a bug in set_view() (thanks jtp10181!).&lt;br /&gt;
** Fixed is_in_viewcone() always returning 0.&lt;br /&gt;
** Fixed is_visible causing a crash, improved accuracy.&lt;br /&gt;
** Fixed a crash bug in get_tr2() (thanks Orangutanz!).&lt;br /&gt;
** Fixed cs_get_user_buyzone() returning existence in other areas.&lt;br /&gt;
** Fixed a rare floatround() bug where values ending strictly in .5 were IEEE rounded.&lt;br /&gt;
** Fixed a bug where removing the current parent task could damage the task queue.&lt;br /&gt;
** Fixed a bug in get_entity_visibility (thanks VEN!).&lt;br /&gt;
** Removed non-existant take_damage() entry.&lt;br /&gt;
** Expanded XS Stock Library with addition of xs_vec_make2d.&lt;br /&gt;
** Expanded usage of cs_set_user_vip().&lt;br /&gt;
** Improved get_brush_entity_origin() and ViewContents (thanks Orangutanz!).&lt;br /&gt;
&lt;br /&gt;
* Plugin Changes:&lt;br /&gt;
** Added amx_showrcon command to show rcon results in admincmd.sma.&lt;br /&gt;
** Added weapon restriction compatibility for bots in CS (KWo).&lt;br /&gt;
** Added admin identifier (asterisk which is red if colors are available) to all menus with a user list.&lt;br /&gt;
** Upgraded admin.sma to the new SQLX API.&lt;br /&gt;
** Fixed a bug in amx_reloadadmins not giving admins new access.&lt;br /&gt;
** Fixed a weapon restriction exploit in restmenu.sma.&lt;br /&gt;
** Fixed an HTML exploit in /top15 displaying player names.&lt;br /&gt;
** Fixed various and plentiful amx_addadmin bugs.&lt;br /&gt;
** Fixed telemenu.sma not letting you teleport yourself (thanks jtp10181!).&lt;br /&gt;
** Fixed a bug with adminslots.sma lowering the slots by 1.&lt;br /&gt;
** Fixed overlapping hud messages with miscstats.&lt;br /&gt;
&lt;br /&gt;
* Module API Changes:&lt;br /&gt;
** Added and fixed module API for inter-module communication.&lt;br /&gt;
** Added native overriding and replacing to module API.&lt;br /&gt;
** Added plugin unloading/unloaded callbacks to module API.&lt;br /&gt;
** Added MSVC8 project files to most CVS projects.&lt;br /&gt;
&lt;br /&gt;
* Configuration Changes:&lt;br /&gt;
** Added amx_sql_type cvar to sql.cfg.&lt;br /&gt;
** Re-organized and simplified modules.ini.&lt;br /&gt;
** Error logging can now be redirected to separate logs.&lt;br /&gt;
** Fixed modules.ini parsing bugs and simplified parsing.&lt;br /&gt;
** Fixed a double entry in cvars.ini.&lt;br /&gt;
&lt;br /&gt;
* Other Changes:&lt;br /&gt;
** Added a Bulgarian translation (thanks lubb!).&lt;br /&gt;
** Added a leetspeak translation (thanks, I think, Twilight Suzuka!).&lt;br /&gt;
** Improved FTP option of the graphical installer.&lt;br /&gt;
** Updated the GeoIP library to June.&lt;br /&gt;
** Updated PCRE from v6.1 to v6.4.&lt;br /&gt;
** Updated sqLite from 3.3.4 to 3.3.5.&lt;br /&gt;
** Fixed a steam account path bug in the installer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AMX Mod X]]&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.75_Scripting_Changes&amp;diff=3056</id>
		<title>AMX Mod X 1.75 Scripting Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.75_Scripting_Changes&amp;diff=3056"/>
		<updated>2006-06-05T11:28:16Z</updated>

		<summary type="html">&lt;p&gt;Faluco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The AMX Mod X 1.75 release made important changes.  While backwards compatibility was kept, intended functionality shifted in esoteric areas that will affect some plugins.  Reading this article is highly recommended.&lt;br /&gt;
&lt;br /&gt;
=Module Requirement System=&lt;br /&gt;
As part of the new Automatic Module Loading, the old &amp;lt;tt&amp;gt;#pragma library&amp;lt;/tt&amp;gt; has been deprecated.  You must now use:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#pragma reqlib &amp;lt;library&amp;gt;&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This means &amp;quot;require library&amp;quot;.  Plugins still compiled with &amp;lt;tt&amp;gt;#pragma library&amp;lt;/tt&amp;gt; will still fail on load if the given module is not found.  However, core will try to load each module given the rules below under &amp;quot;Automatic Module Loading&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Automatic Module Loading=&lt;br /&gt;
==Overview==&lt;br /&gt;
As of AMX Mod X 1.75, there is a new, powerful automatic module loading system.  That means that &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; is largely deprecated for general use.  Instead, modules are loaded as plugins need them.  This is done dynamically by core before plugins are even loaded, without the need to patch &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; and then change the map.&lt;br /&gt;
&lt;br /&gt;
Modules can now define &amp;quot;Libraries&amp;quot; and &amp;quot;Library Classes&amp;quot;.  A library is a specific identifier that should match the filename of the module.  For example, Engine's defined library is &amp;quot;engine&amp;quot;.  FakeMeta's library is &amp;quot;fakemeta&amp;quot;, and so on.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;library class&amp;quot; defines membership to a set of modules.  For example, CSX has the library name &amp;quot;csx&amp;quot;, but it is part of the library class &amp;quot;xstats&amp;quot;.  Library classes are also used for DBI and SQLX.  This is very useful for being able to require one module type of any implementation.&lt;br /&gt;
&lt;br /&gt;
==New API==&lt;br /&gt;
===Compiler Pragmas===&lt;br /&gt;
This is expanded with a number of new &amp;lt;tt&amp;gt;#pragma&amp;lt;/tt&amp;gt; directives:&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma reqlib &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Requires that a given library must be loaded.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma reqclass &amp;amp;lt;libclass&amp;gt;&amp;lt;/tt&amp;gt; - Requires that a given library class must be loaded.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma loadlib &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Automatically attempts to load a given library (see more info below).&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma expectlib &amp;amp;lt;library1&amp;gt; &amp;amp;lt;library2&amp;gt;&amp;lt;/tt&amp;gt; - If the first library is not loaded, the second one will be attempted to load (not very useful).&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma expectclass &amp;amp;lt;class&amp;gt; &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - If the expected class is not found, the given library will be attempted to load.  This is useful for defining a default module to be loaded with a given class of modules.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma defclasslib &amp;amp;lt;class&amp;gt; &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Same as &amp;lt;tt&amp;gt;expectclass&amp;lt;/tt&amp;gt;, however, &amp;lt;tt&amp;gt;defclasslib&amp;lt;/tt&amp;gt; waits until all expectations are resolved.  This lets plugins override defaults by adding their own expectations.&lt;br /&gt;
&lt;br /&gt;
===Module Filtering===&lt;br /&gt;
The module_filter prototype now includes a second parameter, which tells you whether the requirement is a class or library.&lt;br /&gt;
&lt;br /&gt;
Furthermore, module_exists has been deprecated for LibraryExists().&lt;br /&gt;
&lt;br /&gt;
==How it Works==&lt;br /&gt;
The precise order of events is as follows:&lt;br /&gt;
*When the first entity is spawned, AMX Mod X loads all unloaded modules in &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*After &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; is parsed, &amp;lt;tt&amp;gt;plugins.ini&amp;lt;/tt&amp;gt; is read.  Each file is mapped into a cache.&lt;br /&gt;
*The cache is previewed.&lt;br /&gt;
**First, the &amp;quot;library&amp;quot; table is read.  This table is read for backwards compatibility with AMX Mod X 1.71 and prior.  Each entry is read as a module file shortname, and the module is loaded if it exists.  &lt;br /&gt;
**Next, the &amp;quot;pubtags&amp;quot; table is read.  Each entry is decoded to one of the special #pragma commands.&lt;br /&gt;
***All loadlib commands are executed, and the modules loaded.&lt;br /&gt;
***All expect commands are executed.&lt;br /&gt;
***All defclasslib commands are executed.&lt;br /&gt;
*AMX Mod X then waits until ServerActivate is called.&lt;br /&gt;
*All plugins are loaded.  If the plugin is in the cache, the cache is read instead.  For each plugin...&lt;br /&gt;
**The library table is read.  For each library that is both nonexistant and unhandled by a module filter, the plugin fails to load.&lt;br /&gt;
**The pubtags table is read.  For each reqlib and reqclass entry that are both nonexistant and unhandled by a module filter, the plugin fails to load.&lt;br /&gt;
*The plugin cache is invalidated and the server is considered &amp;quot;loaded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SQLX=&lt;br /&gt;
==Introduction==&lt;br /&gt;
SQLX is a new Database API that supercedes DBI.  Its main feature is that you can load two SQLX modules at once, whereas you cannot with DBI.  It also supports threaded queries, which let you process data without interrupting gameplay from a bad network connection.&lt;br /&gt;
&lt;br /&gt;
These additions come at a hefty price.  The SQLX API is significantly more complex than DBI.  Although some might find it easier to use due to its simpler error checking and iteration, it requires more manual memory management and has less simple abstraction.  Furthermore, taking advantage of the new &amp;lt;tt&amp;gt;SQL_ThreadQuery&amp;lt;/tt&amp;gt; native will require nothing short of a rewrite for most plugins, as it is ''asynchronous'' instead of ''synchronous''.  Because of this, the new SQLX modules also implement the old DBI functionality, for both backwards compatibility and for plugin developers familiar with the old API.  All three APIs - SQL-threaded, SQL-non-threaded, and DBI, are still fully supported.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Since SQLX is an expansive API, showing a single plugin of its usage would be difficult.  It is highly recommended that users interested in the new API look at the [http://cvs.tcwonline.org/viewvc.cgi/amxmodx/plugins/testsuite/sqlxtest.sma?view=log SQLxTest] plugin, which compares two different DBI methods and both SQL methods of querying a database.  It is highly useful for both regression testing and for getting an idea of how the API works.&lt;br /&gt;
&lt;br /&gt;
The most important concept of SQLX is &amp;quot;Handles,&amp;quot; which are a precursor to a system planned for SourceMod.  Handles are datatypes that store internal information that you should not modify.  Whenever you create a handle, you must also free it, with &amp;lt;tt&amp;gt;SQL_FreeHandle&amp;lt;/tt&amp;gt;().&lt;br /&gt;
&lt;br /&gt;
==Native Overview==&lt;br /&gt;
The basic natives of SQLX are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_MakeDbTuple&amp;lt;/tt&amp;gt; (or simple stock version, &amp;lt;tt&amp;gt;SQL_MakeStdTuple&amp;lt;/tt&amp;gt;) - This creates a variable that holds information about a database.  It does not connect to the database.  This is so you don't have to keep retrieving cvar info on every connection.  You do not have to free these handles, although it is a good idea if you create them dynamically.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_Connect&amp;lt;/tt&amp;gt; - Connects to a database and returns a new Handle, or &amp;lt;tt&amp;gt;Empty_Handle&amp;lt;/tt&amp;gt; on failure.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_PrepareQuery&amp;lt;/tt&amp;gt; - Prepares a query for execution, and returns a new Handle to the query.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_Execute&amp;lt;/tt&amp;gt; - Executes a prepared query, and returns 0 on failure (1 on success).&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_MoreResults&amp;lt;/tt&amp;gt; - Returns 1 if there are more results in the query result queue, 0 if none.&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_ReadResult&amp;lt;/tt&amp;gt; - Reads the current row result by the column's numerical index, similar to dbi_field/dbi_result.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_NextRow&amp;lt;/tt&amp;gt; - Advances to the next result row.  '''Compatibility Warning''': This does not need to be called first! Unlike &amp;lt;tt&amp;gt;dbi_nextrow&amp;lt;/tt&amp;gt;, the query is automatically at the first row.  If you call &amp;lt;tt&amp;gt;SQL_NextRow&amp;lt;/tt&amp;gt; before &amp;lt;tt&amp;gt;SQL_ReadResult&amp;lt;/tt&amp;gt;, your are actually skipping a row.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_FreeHandle&amp;lt;/tt&amp;gt; - Frees a Handle.  You must do this or else memory will leak.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_ThreadQuery&amp;lt;/tt&amp;gt; - Places a query and connection info into a threaded queue.  In another thread, the connection is established, the query is executed, and the connection is dropped.  The query results are then posted back into the main thread and given to the plugin on the next server-frame.  &lt;br /&gt;
**Note that while powerful, the mechanism is very simplistic.  Similar to &amp;lt;tt&amp;gt;set_task&amp;lt;/tt&amp;gt;, you must differentiate multiple queries having the same callback by packing binary data into an array.  Furthermore, you can only make one query at a time, since the queue is &amp;quot;push one, resolve one, pop one.&amp;quot;  If you plan on making five queries in a row in order to get aggregate information about a player, you must make each of these five queries in separate stages, and you must also take into account asynchronous factors such as the player dropping during the middle of a query.  (One way to do this is to pack the player's authid and client index into the callback data and verify it when the query finishes.)&lt;br /&gt;
&lt;br /&gt;
=New Natives / Native Changes=&lt;br /&gt;
==Register Message==&lt;br /&gt;
The &amp;lt;tt&amp;gt;register_message&amp;lt;/tt&amp;gt; set of natives, including &amp;lt;tt&amp;gt;get/set_msg_block&amp;lt;/tt&amp;gt;, has been moved to Core.  This is to facilitate users who prefer to use FakeMeta, and like the simplicity and speed of using Engine's message interception functions.  &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
This change is backwards compatible.&lt;br /&gt;
&lt;br /&gt;
==Argument Formatting==&lt;br /&gt;
The &amp;lt;tt&amp;gt;format_args&amp;lt;/tt&amp;gt; function is now replaced with a much faster, more compatible &amp;lt;tt&amp;gt;vformat&amp;lt;/tt&amp;gt; function.  Its usage is slightly different (read the include file, &amp;lt;tt&amp;gt;string.inc&amp;lt;/tt&amp;gt;), but it accepts %L, whereas format_args does not.  A quick example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;debugprint(const fmt[], ...)&lt;br /&gt;
{&lt;br /&gt;
   static temp[2048]&lt;br /&gt;
   vformat(temp, sizeof(temp)-1, fmt, 2)&lt;br /&gt;
   log_message(&amp;quot;[DEBUG] %s&amp;quot;, temp)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Other Core Natives==&lt;br /&gt;
*&amp;lt;tt&amp;gt;register_plugin&amp;lt;/tt&amp;gt; - Now returns a plugin id.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_amxx_verstring&amp;lt;/tt&amp;gt; - Returns the AMX Mod X version string.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_weaponid&amp;lt;/tt&amp;gt; - Gets a weapon id from a weapon name.&lt;br /&gt;
&lt;br /&gt;
==FakeMeta==&lt;br /&gt;
===New Natives===&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_orig_retval&amp;lt;/tt&amp;gt; - Gets the original return value of an engine or game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;copy_infokey_buffer&amp;lt;/tt&amp;gt; - Copies the given infobuffer pointer into output buffer.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_cd&amp;lt;/tt&amp;gt; - Gets or sets members of a clientdata data structure (used with UpdateClientData).&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_es&amp;lt;/tt&amp;gt; - Gets or sets members of an entity_state data structure (used with AddToFullPack).&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_uc&amp;lt;/tt&amp;gt; - Gets or sets members of a usecmd data structure (used with CmdStart).&lt;br /&gt;
&lt;br /&gt;
===New Engine/GameDLL Functions===&lt;br /&gt;
The &amp;lt;tt&amp;gt;register_forward&amp;lt;/tt&amp;gt; native now allows for hooking a number of new functions from the engine or game DLL including:&lt;br /&gt;
*&amp;lt;tt&amp;gt;UpdateClientData&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;AddToFullPack&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CmdStart&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CmdEnd&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateInstBaselines&amp;lt;/tt&amp;gt; - Game DLL function&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateInstBaseline&amp;lt;/tt&amp;gt; - Engine function&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateBaseline&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetInfoKeyBuffer&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;AlertMessage&amp;lt;/tt&amp;gt; - This now can be called via &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;ClientPrinf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These functions can also be called via &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;dllfunc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Breaking Changes===&lt;br /&gt;
Using &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt; in order to call &amp;lt;tt&amp;gt;EngFunc_InfoKeyValue&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;EngFunc_SetKeyValue&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;EngFunc_SetClientKeyValue&amp;lt;/tt&amp;gt; now requires passing an infobuffer pointer. An infobuffer pointer can be obtained by calling &amp;lt;tt&amp;gt;EngFunc_GetInfoKeyBuffer&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;some_function(id, name[])&lt;br /&gt;
{&lt;br /&gt;
   new infokey = engfunc(EngFunc_GetInfoKeyBuffer, id)&lt;br /&gt;
   engfunc(EngFunc_SetClientKeyValue, id, infokey, &amp;quot;model&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you hook ClientUserInfoChanged via Fakemeta, an infobuffer pointer is now also forwarded to your function in addition to the client id.&lt;br /&gt;
&lt;br /&gt;
==Cstrike==&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_get_user_mapzones&amp;lt;/tt&amp;gt; - Returns bitwise flags of where on the map a player is located such as buy zone, bomb site, hostage rescue zone, VIP safety zone, and escape zone.&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_set_user_vip&amp;lt;/tt&amp;gt; - Now takes two additional (but optional) parameters for determining whether or not the player model and scoreboard get updated.&lt;br /&gt;
&lt;br /&gt;
==New Stocks==&lt;br /&gt;
===Engine===&lt;br /&gt;
*&amp;lt;tt&amp;gt;IsInWorld&amp;lt;/tt&amp;gt; - Checks if an entity is within the bounds of the world (from HLSDK).&lt;br /&gt;
&lt;br /&gt;
===FakeMeta===&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_UpdateClientData&amp;lt;/tt&amp;gt; - Calls UpdateClientData game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_AddToFullPack&amp;lt;/tt&amp;gt; - Calls AddToFullPack game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CmdStart&amp;lt;/tt&amp;gt; - Calls CmdStart game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CmdEnd&amp;lt;/tt&amp;gt; - Calls CmdEnd game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CreateBaseline&amp;lt;/tt&amp;gt; - Calls CreateBaseline game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CreateInstBaselines&amp;lt;/tt&amp;gt; - Calls CreateInstancedBaselines game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_CreateInstBaseline&amp;lt;/tt&amp;gt; - Calls CreateInstancedBaseline engine function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_GetInfoKeyBuffer&amp;lt;/tt&amp;gt; - Calls GetInfoKeyBuffer engine function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_ClientPrintf&amp;lt;/tt&amp;gt; - Calls ClientPrintf engine function.&lt;br /&gt;
&lt;br /&gt;
==New Constants==&lt;br /&gt;
Various sound constants (&amp;lt;tt&amp;gt;SND_SPAWNING&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SND_STOP&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SND_CHANGE_VOL&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;SND_CHANGE_PITCH&amp;lt;/tt&amp;gt;) from the HL SDK as well as a constant for pi were added to &amp;lt;tt&amp;gt;amxconst.inc&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;TE_*&amp;lt;/tt&amp;gt; (temp entity) message constants have also been added which will automatically be included with &amp;lt;tt&amp;gt;#include &amp;lt;amxmodx&amp;gt;&amp;lt;/tt&amp;gt;. And finally, a new &amp;lt;tt&amp;gt;hlsdk_const.inc&amp;lt;/tt&amp;gt; file has been added that contains many more constants from the SDK. This is automatically included with &amp;lt;tt&amp;gt;#include &amp;lt;engine&amp;gt;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;#include &amp;lt;fakemeta&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Module API=&lt;br /&gt;
The AMX Mod X module API received a small overhaul for 1.75.&lt;br /&gt;
&lt;br /&gt;
==Versioning/Interface Additions==&lt;br /&gt;
The internal module interface version is 4.  However, modules from M/SDK 3 will still load.  &lt;br /&gt;
&lt;br /&gt;
M/SDK Version 4 modules have two new members of public information: the library string, and the library class string.  These contain comma delimited names of whatever libraries or library classes the module would like to be registered.&lt;br /&gt;
&lt;br /&gt;
For backwards compatibility, M/SDK Version 4 modules have an automatically empty library class string, and a library string equal to the logtag string.&lt;br /&gt;
&lt;br /&gt;
==New Callbacks==&lt;br /&gt;
Modules can now be informed of when plugins are about to be unloaded, and when plugins have been fully unloaded.  This means that modules don't have to hook ServerActivate and ServerActivate_Post (implementation dependent), don't need to be loaded by Metamod, and don't need to detach simply to release resources.&lt;br /&gt;
&lt;br /&gt;
==New Functions==&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_GetLocalInfo&amp;lt;/tt&amp;gt; - Intended for modules using LOCALINFO, which required a Metamod attachment.  This is equal to AMX Mod X's core function &amp;lt;tt&amp;gt;get_localinfo&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_OverrideNatives&amp;lt;/tt&amp;gt; - Given a native list, this specifies that any other module already providing these natives will no longer provide them.  This was added to force backwards compatibility between SQLITE and MySQLX.  Usage is not recommended.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_FindLibrary&amp;lt;/tt&amp;gt; - Essentially the same function as LibraryExists() for plugins.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_AddLibraries&amp;lt;/tt&amp;gt; - Adds a comma delimited list of libraries or library classes.  You must specify a &amp;quot;parent&amp;quot; pointer that identifies the module.  This is easily accomplished by taking the address of any static variable.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_RemoveLibraries&amp;lt;/tt&amp;gt; - Removes all library entries with the given parent pointer.  This is useful if your module adds custom entries not in its defined list.  &lt;br /&gt;
&lt;br /&gt;
==MSVC8 Compatibility==&lt;br /&gt;
M/SDK Version 4 now contains preprocessor definitions for compatibility with Microsoft's Visual Studio 2005/8.0 (provided by [[User:Damaged Soul|Damaged Soul]]).  These macros can be turned off in the &amp;lt;tt&amp;gt;moduleconfig.h&amp;lt;/tt&amp;gt; file by uncommenting the definition of &amp;lt;tt&amp;gt;NO_MSVC8_AUTO_COMPAT&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Minor Changes=&lt;br /&gt;
==Compiler Defines==&lt;br /&gt;
Since &amp;lt;tt&amp;gt;__DATE__&amp;lt;/tt&amp;gt; was fixed in 1.75, the macro &amp;lt;tt&amp;gt;__TIME__&amp;lt;/tt&amp;gt; was also added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
This changelog is tentative.  Developers will be editing it as things are changed.&lt;br /&gt;
&lt;br /&gt;
* Core Changes&lt;br /&gt;
** Modules are now automatically loaded by detecting plugin usage.&lt;br /&gt;
*** modules.ini is now primarily deprecated, except for SQL and unsupported libraries.&lt;br /&gt;
** Added new SQLX modules.  You can now load multiple SQL modules and toggle them per-plugin.&lt;br /&gt;
*** Added new SQL API called SQLX.  DBI was kept backwards-compatible.&lt;br /&gt;
*** Added new function to thread SQL queries (which prevents lag from a bad connection).&lt;br /&gt;
** Fixed some very small memory leaks.&lt;br /&gt;
** Fixed binary logging building wrong on Linux.&lt;br /&gt;
** Fixed some debugging crashes.&lt;br /&gt;
** Fixed serious bug when creating plugin_pause/plugin_unpause forwards.&lt;br /&gt;
** Fixed serious crash bug involving set_hudmessage and plugins using high hudchannels.&lt;br /&gt;
** Added natives:&lt;br /&gt;
*** fputs()&lt;br /&gt;
*** get_weaponid()&lt;br /&gt;
*** rename_file()&lt;br /&gt;
*** vformat()&lt;br /&gt;
&lt;br /&gt;
* Fakemeta Changes&lt;br /&gt;
** Added new hookable/callable functions:&lt;br /&gt;
*** AddToFullPack&lt;br /&gt;
*** AlertMessage&lt;br /&gt;
*** ClientPrintf&lt;br /&gt;
*** ClientUserInfoChanged&lt;br /&gt;
*** CmdEnd&lt;br /&gt;
*** CmdStart&lt;br /&gt;
*** CreateBaseline&lt;br /&gt;
*** CreateInstancedBaseline&lt;br /&gt;
*** GetInfoKeyBuffer&lt;br /&gt;
*** InfoKeyValue&lt;br /&gt;
*** UpdateClientData&lt;br /&gt;
*** SetClientKeyValue&lt;br /&gt;
*** SetKeyValue&lt;br /&gt;
** Added new natives:&lt;br /&gt;
*** copy_infokey_buffer&lt;br /&gt;
*** get_orig_retval&lt;br /&gt;
** Fixed various trace bugs in FakeMeta with certain natives.&lt;br /&gt;
** Fixed some unhooking on server-deactivate problems in FakeMeta.&lt;br /&gt;
&lt;br /&gt;
* Scripting Changes:&lt;br /&gt;
** Added __DATE__ and __TIME__ auto-macros to the compiler.&lt;br /&gt;
** Added many HLSDK constants and improved include organization.&lt;br /&gt;
** Added new compiler #pragma directives for using the module autoloading system.&lt;br /&gt;
** Added cs_get_user_mapzones (thanks VEN!).&lt;br /&gt;
** Added IsInWorld() stock (thanks Twilight Suzuka!).&lt;br /&gt;
** Added nvault_remove().&lt;br /&gt;
** Moved various natives from Engine and into Core:&lt;br /&gt;
*** register_message&lt;br /&gt;
*** get_msg_args&lt;br /&gt;
*** get/set_msg_arg_type&lt;br /&gt;
*** get/set_msg_arg_int&lt;br /&gt;
*** get/set_msg_arg_float&lt;br /&gt;
*** get/set_msg_arg_string&lt;br /&gt;
*** get_msg_origin&lt;br /&gt;
*** get/set_msg_block&lt;br /&gt;
*** velocity_by_aim&lt;br /&gt;
*** vector_to_angle&lt;br /&gt;
*** angle_vector&lt;br /&gt;
*** vector_length&lt;br /&gt;
*** vector_distance&lt;br /&gt;
*** precache_generic&lt;br /&gt;
** Dynamic natives that are paused now also pause parent plugins (with an error).&lt;br /&gt;
** register_plugin() now returns the plugin ID.&lt;br /&gt;
** Fixed a corruption bug in strip_user_weapons().&lt;br /&gt;
** Fixed a bug in set_view() (thanks jtp10181!).&lt;br /&gt;
** Fixed is_in_viewcone() always returning 0.&lt;br /&gt;
** Fixed is_visible causing a crash, improved accuracy.&lt;br /&gt;
** Fixed a crash bug in get_tr2() (thanks Orangutanz!).&lt;br /&gt;
** Fixed cs_get_user_buyzone() returning existence in other areas.&lt;br /&gt;
** Fixed a rare floatround() bug where values ending strictly in .5 were IEEE rounded.&lt;br /&gt;
** Fixed a bug where removing the current parent task could damage the task queue.&lt;br /&gt;
** Fixed a bug in get_entity_visibility (thanks VEN!).&lt;br /&gt;
** Removed non-existant take_damage() entry.&lt;br /&gt;
** Expanded XS Stock Library with addition of xs_vec_make2d.&lt;br /&gt;
** Expanded usage of cs_set_user_vip().&lt;br /&gt;
** Improved get_brush_entity_origin() and ViewContents (thanks Orangutanz!).&lt;br /&gt;
&lt;br /&gt;
* Plugin Changes:&lt;br /&gt;
** Added amx_showrcon command to show rcon results in admincmd.sma.&lt;br /&gt;
** Added weapon restriction compatibility for bots in CS (KWo).&lt;br /&gt;
** Upgraded admin.sma to the new SQLX API.&lt;br /&gt;
** Fixed a bug in amx_reloadadmins not giving admins new access.&lt;br /&gt;
** Fixed a weapon restriction exploit in restmenu.sma.&lt;br /&gt;
** Fixed an HTML exploit in /top15 displaying player names.&lt;br /&gt;
** Fixed various and plentiful amx_addadmin bugs.&lt;br /&gt;
** Fixed telemenu.sma not letting you teleport yourself (thanks jtp10181!).&lt;br /&gt;
** Fixed a bug with adminslots.sma lowering the slots by 1.&lt;br /&gt;
** Fixed overlapping hud messages with miscstats.&lt;br /&gt;
&lt;br /&gt;
* Module API Changes:&lt;br /&gt;
** Added and fixed module API for inter-module communication.&lt;br /&gt;
** Added native overriding and replacing to module API.&lt;br /&gt;
** Added plugin unloading/unloaded callbacks to module API.&lt;br /&gt;
** Added MSVC8 project files to most CVS projects.&lt;br /&gt;
&lt;br /&gt;
* Configuration Changes:&lt;br /&gt;
** Added amx_sql_type cvar to sql.cfg.&lt;br /&gt;
** Re-organized and simplified modules.ini.&lt;br /&gt;
** Error logging can now be redirected to separate logs.&lt;br /&gt;
** Fixed modules.ini parsing bugs and simplified parsing.&lt;br /&gt;
** Fixed a double entry in cvars.ini.&lt;br /&gt;
&lt;br /&gt;
* Other Changes:&lt;br /&gt;
** Added a Bulgarian translation (thanks lubb!).&lt;br /&gt;
** Added a leetspeak translation (thanks, I think, Twilight Suzuka!).&lt;br /&gt;
** Updated the GeoIP library to June.&lt;br /&gt;
** Updated PCRE from v6.1 to v6.4.&lt;br /&gt;
** Updated sqLite from 3.3.4 to 3.3.5.&lt;br /&gt;
** Fixed a steam account path bug in the installer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AMX Mod X]]&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.75_Scripting_Changes&amp;diff=3048</id>
		<title>AMX Mod X 1.75 Scripting Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.75_Scripting_Changes&amp;diff=3048"/>
		<updated>2006-06-04T21:57:41Z</updated>

		<summary type="html">&lt;p&gt;Faluco: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The AMX Mod X 1.75 release made important changes.  While backwards compatibility was kept, intended functionality shifted in esoteric areas that will affect some plugins.  Reading this article is highly recommended.&lt;br /&gt;
&lt;br /&gt;
=Module Requirement System=&lt;br /&gt;
As part of the new Automatic Module Loading, the old &amp;lt;tt&amp;gt;#pragma library&amp;lt;/tt&amp;gt; has been deprecated.  You must now use:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#pragma reqlib &amp;lt;library&amp;gt;&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This means &amp;quot;require library&amp;quot;.  Plugins still compiled with &amp;lt;tt&amp;gt;#pragma library&amp;lt;/tt&amp;gt; will still fail on load if the given module is not found.  However, core will try to load each module given the rules below under &amp;quot;Automatic Module Loading&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Automatic Module Loading=&lt;br /&gt;
==Overview==&lt;br /&gt;
As of AMX Mod X 1.75, there is a new, powerful automatic module loading system.  That means that &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; is largely deprecated for general use.  Instead, modules are loaded as plugins need them.  This is done dynamically by core before plugins are even loaded, without the need to patch &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; and then change the map.&lt;br /&gt;
&lt;br /&gt;
Modules can now define &amp;quot;Libraries&amp;quot; and &amp;quot;Library Classes&amp;quot;.  A library is a specific identifier that should match the filename of the module.  For example, Engine's defined library is &amp;quot;engine&amp;quot;.  FakeMeta's library is &amp;quot;fakemeta&amp;quot;, and so on.&lt;br /&gt;
&lt;br /&gt;
A &amp;quot;library class&amp;quot; defines membership to a set of modules.  For example, CSX has the library name &amp;quot;csx&amp;quot;, but it is part of the library class &amp;quot;xstats&amp;quot;.  Library classes are also used for DBI and SQLX.  This is very useful for being able to require one module type of any implementation.&lt;br /&gt;
&lt;br /&gt;
==New API==&lt;br /&gt;
===Compiler Pragmas===&lt;br /&gt;
This is expanded with a number of new &amp;lt;tt&amp;gt;#pragma&amp;lt;/tt&amp;gt; directives:&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma reqlib &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Requires that a given library must be loaded.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma reqclass &amp;amp;lt;libclass&amp;gt;&amp;lt;/tt&amp;gt; - Requires that a given library class must be loaded.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma loadlib &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Automatically attempts to load a given library (see more info below).&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma expectlib &amp;amp;lt;library1&amp;gt; &amp;amp;lt;library2&amp;gt;&amp;lt;/tt&amp;gt; - If the first library is not loaded, the second one will be attempted to load (not very useful).&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma expectclass &amp;amp;lt;class&amp;gt; &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - If the expected class is not found, the given library will be attempted to load.  This is useful for defining a default module to be loaded with a given class of modules.&lt;br /&gt;
*&amp;lt;tt&amp;gt;#pragma defclasslib &amp;amp;lt;class&amp;gt; &amp;amp;lt;library&amp;gt;&amp;lt;/tt&amp;gt; - Same as &amp;lt;tt&amp;gt;expectclass&amp;lt;/tt&amp;gt;, however, &amp;lt;tt&amp;gt;defclasslib&amp;lt;/tt&amp;gt; waits until all expectations are resolved.  This lets plugins override defaults by adding their own expectations.&lt;br /&gt;
&lt;br /&gt;
===Module Filtering===&lt;br /&gt;
The module_filter prototype now includes a second parameter, which tells you whether the requirement is a class or library.&lt;br /&gt;
&lt;br /&gt;
Furthermore, module_exists has been deprecated for LibraryExists().&lt;br /&gt;
&lt;br /&gt;
==How it Works==&lt;br /&gt;
The precise order of events is as follows:&lt;br /&gt;
*When the first entity is spawned, AMX Mod X loads all unloaded modules in &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*After &amp;lt;tt&amp;gt;modules.ini&amp;lt;/tt&amp;gt; is parsed, &amp;lt;tt&amp;gt;plugins.ini&amp;lt;/tt&amp;gt; is read.  Each file is mapped into a cache.&lt;br /&gt;
*The cache is previewed.&lt;br /&gt;
**First, the &amp;quot;library&amp;quot; table is read.  This table is read for backwards compatibility with AMX Mod X 1.71 and prior.  Each entry is read as a module file shortname, and the module is loaded if it exists.  &lt;br /&gt;
**Next, the &amp;quot;pubtags&amp;quot; table is read.  Each entry is decoded to one of the special #pragma commands.&lt;br /&gt;
***All loadlib commands are executed, and the modules loaded.&lt;br /&gt;
***All expect commands are executed.&lt;br /&gt;
***All defclasslib commands are executed.&lt;br /&gt;
*AMX Mod X then waits until ServerActivate is called.&lt;br /&gt;
*All plugins are loaded.  If the plugin is in the cache, the cache is read instead.  For each plugin...&lt;br /&gt;
**The library table is read.  For each library that is both nonexistant and unhandled by a module filter, the plugin fails to load.&lt;br /&gt;
**The pubtags table is read.  For each reqlib and reqclass entry that are both nonexistant and unhandled by a module filter, the plugin fails to load.&lt;br /&gt;
*The plugin cache is invalidated and the server is considered &amp;quot;loaded&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=SQLX=&lt;br /&gt;
==Introduction==&lt;br /&gt;
SQLX is a new Database API that supercedes DBI.  Its main feature is that you can load two SQLX modules at once, whereas you cannot with DBI.  It also supports threaded queries, which let you process data without interrupting gameplay from a bad network connection.&lt;br /&gt;
&lt;br /&gt;
These additions come at a hefty price.  The SQLX API is significantly more complex than DBI.  Although some might find it easier to use due to its simpler error checking and iteration, it requires more manual memory management and has less simple abstraction.  Furthermore, taking advantage of the new &amp;lt;tt&amp;gt;SQL_ThreadQuery&amp;lt;/tt&amp;gt; native will require nothing short of a rewrite for most plugins, as it is ''asynchronous'' instead of ''synchronous''.  Because of this, the new SQLX modules also implement the old DBI functionality, for both backwards compatibility and for plugin developers familiar with the old API.  All three APIs - SQL-threaded, SQL-non-threaded, and DBI, are still fully supported.&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
Since SQLX is an expansive API, showing a single plugin of its usage would be difficult.  It is highly recommended that users interested in the new API look at the [http://cvs.tcwonline.org/viewvc.cgi/amxmodx/plugins/testsuite/sqlxtest.sma?view=log SQLxTest] plugin, which compares two different DBI methods and both SQL methods of querying a database.  It is highly useful for both regression testing and for getting an idea of how the API works.&lt;br /&gt;
&lt;br /&gt;
The most important concept of SQLX is &amp;quot;Handles,&amp;quot; which are a precursor to a system planned for SourceMod.  Handles are datatypes that store internal information that you should not modify.  Whenever you create a handle, you must also free it, with &amp;lt;tt&amp;gt;SQL_FreeHandle&amp;lt;/tt&amp;gt;().&lt;br /&gt;
&lt;br /&gt;
==Native Overview==&lt;br /&gt;
The basic natives of SQLX are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_MakeDbTuple&amp;lt;/tt&amp;gt; (or simple stock version, &amp;lt;tt&amp;gt;SQL_MakeStdTuple&amp;lt;/tt&amp;gt;) - This creates a variable that holds information about a database.  It does not connect to the database.  This is so you don't have to keep retrieving cvar info on every connection.  You do not have to free these handles, although it is a good idea if you create them dynamically.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_Connect&amp;lt;/tt&amp;gt; - Connects to a database and returns a new Handle, or &amp;lt;tt&amp;gt;Empty_Handle&amp;lt;/tt&amp;gt; on failure.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_PrepareQuery&amp;lt;/tt&amp;gt; - Prepares a query for execution, and returns a new Handle to the query.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_Execute&amp;lt;/tt&amp;gt; - Executes a prepared query, and returns 0 on failure (1 on success).&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_MoreResults&amp;lt;/tt&amp;gt; - Returns 1 if there are more results in the query result queue, 0 if none.&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_ReadResult&amp;lt;/tt&amp;gt; - Reads the current row result by the column's numerical index, similar to dbi_field/dbi_result.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_NextRow&amp;lt;/tt&amp;gt; - Advances to the next result row.  '''Compatibility Warning''': This does not need to be called first! Unlike &amp;lt;tt&amp;gt;dbi_nextrow&amp;lt;/tt&amp;gt;, the query is automatically at the first row.  If you call &amp;lt;tt&amp;gt;SQL_NextRow&amp;lt;/tt&amp;gt; before &amp;lt;tt&amp;gt;SQL_ReadResult&amp;lt;/tt&amp;gt;, your are actually skipping a row.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_FreeHandle&amp;lt;/tt&amp;gt; - Frees a Handle.  You must do this or else memory will leak.&lt;br /&gt;
*&amp;lt;tt&amp;gt;SQL_ThreadQuery&amp;lt;/tt&amp;gt; - Places a query and connection info into a threaded queue.  In another thread, the connection is established, the query is executed, and the connection is dropped.  The query results are then posted back into the main thread and given to the plugin on the next server-frame.  &lt;br /&gt;
**Note that while powerful, the mechanism is very simplistic.  Similar to &amp;lt;tt&amp;gt;set_task&amp;lt;/tt&amp;gt;, you must differentiate multiple queries having the same callback by packing binary data into an array.  Furthermore, you can only make one query at a time, since the queue is &amp;quot;push one, resolve one, pop one.&amp;quot;  If you plan on making five queries in a row in order to get aggregate information about a player, you must make each of these five queries in separate stages, and you must also take into account asynchronous factors such as the player dropping during the middle of a query.  (One way to do this is to pack the player's authid and client index into the callback data and verify it when the query finishes.)&lt;br /&gt;
&lt;br /&gt;
=New Natives / Native Changes=&lt;br /&gt;
==Register Message==&lt;br /&gt;
The &amp;lt;tt&amp;gt;register_message&amp;lt;/tt&amp;gt; set of natives, including &amp;lt;tt&amp;gt;get/set_msg_block&amp;lt;/tt&amp;gt;, has been moved to Core.  This is to facilitate users who prefer to use FakeMeta, and like the simplicity and speed of using Engine's message interception functions.  &lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
This change is backwards compatible.&lt;br /&gt;
&lt;br /&gt;
==Argument Formatting==&lt;br /&gt;
The &amp;lt;tt&amp;gt;format_args&amp;lt;/tt&amp;gt; function is now replaced with a much faster, more compatible &amp;lt;tt&amp;gt;vformat&amp;lt;/tt&amp;gt; function.  Its usage is slightly different (read the include file, &amp;lt;tt&amp;gt;string.inc&amp;lt;/tt&amp;gt;), but it accepts %L, whereas format_args does not.  A quick example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;debugprint(const fmt[], ...)&lt;br /&gt;
{&lt;br /&gt;
   static temp[2048]&lt;br /&gt;
   vformat(temp, sizeof(temp)-1, fmt, 2)&lt;br /&gt;
   log_message(&amp;quot;[DEBUG] %s&amp;quot;, temp)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Other Core Natives==&lt;br /&gt;
*&amp;lt;tt&amp;gt;register_plugin&amp;lt;/tt&amp;gt; - Now returns a plugin id.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_amxx_verstring&amp;lt;/tt&amp;gt; - Returns the AMX Mod X version string.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_weaponid&amp;lt;/tt&amp;gt; - Gets a weapon id from a weapon name.&lt;br /&gt;
&lt;br /&gt;
==FakeMeta==&lt;br /&gt;
===New Natives===&lt;br /&gt;
*&amp;lt;tt&amp;gt;get_orig_retval&amp;lt;/tt&amp;gt; - Gets the original return value of an engine or game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;copy_infokey_buffer&amp;lt;/tt&amp;gt; - Copies the given infobuffer pointer into output buffer.&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_cd&amp;lt;/tt&amp;gt; - Gets or sets members of a clientdata data structure (used with UpdateClientData).&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_es&amp;lt;/tt&amp;gt; - Gets or sets members of an entity_state data structure (used with AddToFullPack).&lt;br /&gt;
*&amp;lt;tt&amp;gt;get/set_uc&amp;lt;/tt&amp;gt; - Gets or sets members of a usecmd data structure (used with CmdStart).&lt;br /&gt;
&lt;br /&gt;
===New Engine/GameDLL Functions===&lt;br /&gt;
The &amp;lt;tt&amp;gt;register_forward&amp;lt;/tt&amp;gt; native now allows for hooking a number of new functions from the engine or game DLL including:&lt;br /&gt;
*&amp;lt;tt&amp;gt;UpdateClientData&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;AddToFullPack&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CmdStart&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CmdEnd&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateInstBaselines&amp;lt;/tt&amp;gt; - Game DLL function&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateInstBaseline&amp;lt;/tt&amp;gt; - Engine function&lt;br /&gt;
*&amp;lt;tt&amp;gt;CreateBaseline&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;GetInfoKeyBuffer&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;AlertMessage&amp;lt;/tt&amp;gt; - This now can be called via &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt;&lt;br /&gt;
*&amp;lt;tt&amp;gt;ClientPrinf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These functions can also be called via &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;dllfunc&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Breaking Changes===&lt;br /&gt;
Using &amp;lt;tt&amp;gt;engfunc&amp;lt;/tt&amp;gt; in order to call &amp;lt;tt&amp;gt;EngFunc_InfoKeyValue&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;EngFunc_SetKeyValue&amp;lt;/tt&amp;gt;, or &amp;lt;tt&amp;gt;EngFunc_SetClientKeyValue&amp;lt;/tt&amp;gt; now requires passing an infobuffer pointer. An infobuffer pointer can be obtained by calling &amp;lt;tt&amp;gt;EngFunc_GetInfoKeyBuffer&amp;lt;/tt&amp;gt;. For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;some_function(id, name[])&lt;br /&gt;
{&lt;br /&gt;
   new infokey = engfunc(EngFunc_GetInfoKeyBuffer, id)&lt;br /&gt;
   engfunc(EngFunc_SetClientKeyValue, id, infokey, &amp;quot;model&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you hook ClientUserInfoChanged via Fakemeta, an infobuffer pointer is now also forwarded to your function in addition to the client id.&lt;br /&gt;
&lt;br /&gt;
==Cstrike==&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_get_user_mapzones&amp;lt;/tt&amp;gt; - Returns bitwise flags of where on the map a player is located such as buy zone, bomb site, hostage rescue zone, VIP safety zone, and escape zone.&lt;br /&gt;
*&amp;lt;tt&amp;gt;cs_set_user_vip&amp;lt;/tt&amp;gt; - Now takes two additional (but optional) parameters for determining whether or not the player model and scoreboard get updated.&lt;br /&gt;
&lt;br /&gt;
==New Stocks==&lt;br /&gt;
===Engine===&lt;br /&gt;
*&amp;lt;tt&amp;gt;IsInWorld&amp;lt;/tt&amp;gt; - Checks if an entity is within the bounds of the world (from HLSDK).&lt;br /&gt;
&lt;br /&gt;
===FakeMeta===&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_UpdateClientData&amp;lt;/tt&amp;gt; - Calls UpdateClientData game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_AddToFullPack&amp;lt;/tt&amp;gt; - Calls AddToFullPack game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CmdStart&amp;lt;/tt&amp;gt; - Calls CmdStart game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CmdEnd&amp;lt;/tt&amp;gt; - Calls CmdEnd game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CreateBaseline&amp;lt;/tt&amp;gt; - Calls CreateBaseline game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DF_CreateInstBaselines&amp;lt;/tt&amp;gt; - Calls CreateInstancedBaselines game DLL function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_CreateInstBaseline&amp;lt;/tt&amp;gt; - Calls CreateInstancedBaseline engine function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_GetInfoKeyBuffer&amp;lt;/tt&amp;gt; - Calls GetInfoKeyBuffer engine function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EF_ClientPrintf&amp;lt;/tt&amp;gt; - Calls ClientPrintf engine function.&lt;br /&gt;
&lt;br /&gt;
==New Constants==&lt;br /&gt;
Various sound constants (&amp;lt;tt&amp;gt;SND_SPAWNING&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SND_STOP&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SND_CHANGE_VOL&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;SND_CHANGE_PITCH&amp;lt;/tt&amp;gt;) from the HL SDK as well as a constant for pi were added to &amp;lt;tt&amp;gt;amxconst.inc&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;TE_*&amp;lt;/tt&amp;gt; (temp entity) message constants have also been added which will automatically be included with &amp;lt;tt&amp;gt;#include &amp;lt;amxmodx&amp;gt;&amp;lt;/tt&amp;gt;. And finally, a new &amp;lt;tt&amp;gt;hlsdk_const.inc&amp;lt;/tt&amp;gt; file has been added that contains many more constants from the SDK. This is automatically included with &amp;lt;tt&amp;gt;#include &amp;lt;engine&amp;gt;&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;#include &amp;lt;fakemeta&amp;gt;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Module API=&lt;br /&gt;
The AMX Mod X module API received a small overhaul for 1.75.&lt;br /&gt;
&lt;br /&gt;
==Versioning/Interface Additions==&lt;br /&gt;
The internal module interface version is 4.  However, modules from M/SDK 3 will still load.  &lt;br /&gt;
&lt;br /&gt;
M/SDK Version 4 modules have two new members of public information: the library string, and the library class string.  These contain comma delimited names of whatever libraries or library classes the module would like to be registered.&lt;br /&gt;
&lt;br /&gt;
For backwards compatibility, M/SDK Version 4 modules have an automatically empty library class string, and a library string equal to the logtag string.&lt;br /&gt;
&lt;br /&gt;
==New Callbacks==&lt;br /&gt;
Modules can now be informed of when plugins are about to be unloaded, and when plugins have been fully unloaded.  This means that modules don't have to hook ServerActivate and ServerActivate_Post (implementation dependent), don't need to be loaded by Metamod, and don't need to detach simply to release resources.&lt;br /&gt;
&lt;br /&gt;
==New Functions==&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_GetLocalInfo&amp;lt;/tt&amp;gt; - Intended for modules using LOCALINFO, which required a Metamod attachment.  This is equal to AMX Mod X's core function &amp;lt;tt&amp;gt;get_localinfo&amp;lt;/tt&amp;gt;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_OverrideNatives&amp;lt;/tt&amp;gt; - Given a native list, this specifies that any other module already providing these natives will no longer provide them.  This was added to force backwards compatibility between SQLITE and MySQLX.  Usage is not recommended.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_FindLibrary&amp;lt;/tt&amp;gt; - Essentially the same function as LibraryExists() for plugins.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_AddLibraries&amp;lt;/tt&amp;gt; - Adds a comma delimited list of libraries or library classes.  You must specify a &amp;quot;parent&amp;quot; pointer that identifies the module.  This is easily accomplished by taking the address of any static variable.&lt;br /&gt;
*&amp;lt;tt&amp;gt;MF_RemoveLibraries&amp;lt;/tt&amp;gt; - Removes all library entries with the given parent pointer.  This is useful if your module adds custom entries not in its defined list.  &lt;br /&gt;
&lt;br /&gt;
==MSVC8 Compatibility==&lt;br /&gt;
M/SDK Version 4 now contains preprocessor definitions for compatibility with Microsoft's Visual Studio 2005/8.0 (provided by [[User:Damaged Soul|Damaged Soul]]).  These macros can be turned off in the &amp;lt;tt&amp;gt;moduleconfig.h&amp;lt;/tt&amp;gt; file by uncommenting the definition of &amp;lt;tt&amp;gt;NO_MSVC8_AUTO_COMPAT&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Minor Changes=&lt;br /&gt;
==Compiler Defines==&lt;br /&gt;
Since &amp;lt;tt&amp;gt;__DATE__&amp;lt;/tt&amp;gt; was fixed in 1.75, the macro &amp;lt;tt&amp;gt;__TIME__&amp;lt;/tt&amp;gt; was also added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Full Changelog=&lt;br /&gt;
This changelog is tentative.  Developers will be editing it as things are changed.&lt;br /&gt;
&lt;br /&gt;
* Core Changes&lt;br /&gt;
** Modules are now automatically loaded by detecting plugin usage.&lt;br /&gt;
*** modules.ini is now primarily deprecated, except for SQL and unsupported libraries.&lt;br /&gt;
** Added new SQLX modules.  You can now load multiple SQL modules and toggle them per-plugin.&lt;br /&gt;
*** Added new SQL API called SQLX.  DBI was kept backwards-compatible.&lt;br /&gt;
*** Added new function to thread SQL queries (which prevents lag from a bad connection).&lt;br /&gt;
** Fixed some very small memory leaks.&lt;br /&gt;
** Fixed binary logging building wrong on Linux.&lt;br /&gt;
** Fixed some debugging crashes.&lt;br /&gt;
** Fixed serious bug when creating plugin_pause/plugin_unpause forwards.&lt;br /&gt;
** Fixed serious crash bug involving set_hudmessage and plugins using high hudchannels.&lt;br /&gt;
** Added natives:&lt;br /&gt;
*** fputs()&lt;br /&gt;
*** get_weaponid()&lt;br /&gt;
*** rename_file()&lt;br /&gt;
*** vformat()&lt;br /&gt;
&lt;br /&gt;
* Fakemeta Changes&lt;br /&gt;
** Added new hookable/callable functions:&lt;br /&gt;
*** AddToFullPack&lt;br /&gt;
*** AlertMessage&lt;br /&gt;
*** ClientPrintf&lt;br /&gt;
*** ClientUserInfoChanged&lt;br /&gt;
*** CmdEnd&lt;br /&gt;
*** CmdStart&lt;br /&gt;
*** CreateBaseline&lt;br /&gt;
*** CreateInstancedBaseline&lt;br /&gt;
*** GetInfoKeyBuffer&lt;br /&gt;
*** InfoKeyValue&lt;br /&gt;
*** UpdateClientData&lt;br /&gt;
*** SetClientKeyValue&lt;br /&gt;
*** SetKeyValue&lt;br /&gt;
** Added new natives:&lt;br /&gt;
*** copy_infokey_buffer&lt;br /&gt;
*** get_orig_retval&lt;br /&gt;
** Fixed various trace bugs in FakeMeta with certain natives.&lt;br /&gt;
** Fixed some unhooking on server-deactivate problems in FakeMeta.&lt;br /&gt;
&lt;br /&gt;
* Scripting Changes:&lt;br /&gt;
** Added __DATE__ and __TIME__ auto-macros to the compiler.&lt;br /&gt;
** Added many HLSDK constants and improved include organization.&lt;br /&gt;
** Added new compiler #pragma directives for using the module autoloading system.&lt;br /&gt;
** Added cs_get_user_mapzones (thanks VEN!).&lt;br /&gt;
** Added IsInWorld() stock (thanks Twilight Suzuka!).&lt;br /&gt;
** Added nvault_remove().&lt;br /&gt;
** Moved register_message from Engine and into Core.&lt;br /&gt;
** Dynamic natives that are paused now also pause parent plugins (with an error).&lt;br /&gt;
** register_plugin() now returns the plugin ID.&lt;br /&gt;
** Fixed a corruption bug in strip_user_weapons().&lt;br /&gt;
** Fixed a bug in set_view() (thanks jtp10181!).&lt;br /&gt;
** Fixed is_in_viewcone() always returning 0.&lt;br /&gt;
** Fixed is_visible causing a crash, improved accuracy.&lt;br /&gt;
** Fixed a crash bug in get_tr2() (thanks Orangutanz!).&lt;br /&gt;
** Fixed cs_get_user_buyzone() returning existence in other areas.&lt;br /&gt;
** Fixed a rare floatround() bug where values ending strictly in .5 were IEEE rounded.&lt;br /&gt;
** Fixed a bug where removing the current parent task could damage the task queue.&lt;br /&gt;
** Fixed a bug in get_entity_visibility (thanks VEN!).&lt;br /&gt;
** Removed non-existant take_damage() entry.&lt;br /&gt;
** Expanded XS Stock Library with addition of xs_vec_make2d.&lt;br /&gt;
** Expanded usage of cs_set_user_vip().&lt;br /&gt;
** Improved get_brush_entity_origin() and ViewContents (thanks Orangutanz!).&lt;br /&gt;
&lt;br /&gt;
* Plugin Changes:&lt;br /&gt;
** Added amx_showrcon command to show rcon results in admincmd.sma.&lt;br /&gt;
** Added weapon restriction compatibility for CS (KWo).&lt;br /&gt;
** Upgraded admin.sma to the new SQLX API.&lt;br /&gt;
** Fixed a bug in amx_reloadadmins not giving admins new access.&lt;br /&gt;
** Fixed a weapon restriction exploit in restmenu.sma.&lt;br /&gt;
** Fixed an HTML exploit in /top15 displaying player names.&lt;br /&gt;
** Fixed various and plentiful amx_addadmin bugs.&lt;br /&gt;
** Fixed telemenu.sma not letting you teleport yourself (thanks jtp10181!).&lt;br /&gt;
** Fixed a bug with adminslots.sma lowering the slots by 1.&lt;br /&gt;
** Fixed overlapping hud messages with miscstats.&lt;br /&gt;
&lt;br /&gt;
* Module API Changes:&lt;br /&gt;
** Added and fixed module API for inter-module communication.&lt;br /&gt;
** Added native overriding and replacing to module API.&lt;br /&gt;
** Added plugin unloading/unloaded callbacks to module API.&lt;br /&gt;
** Added MSVC8 project files to most CVS projects.&lt;br /&gt;
&lt;br /&gt;
* Configuration Changes:&lt;br /&gt;
** Added amx_sql_type cvar to sql.cfg.&lt;br /&gt;
** Re-organized and simplified modules.ini.&lt;br /&gt;
** Error logging can now be redirected to separate logs.&lt;br /&gt;
** Fixed modules.ini parsing bugs and simplified parsing.&lt;br /&gt;
** Fixed a double entry in cvars.ini.&lt;br /&gt;
&lt;br /&gt;
* Other Changes:&lt;br /&gt;
** Added a Bulgarian translation (thanks lubb!).&lt;br /&gt;
** Added a leetspeak translation (thanks, I think, Twilight Suzuka!).&lt;br /&gt;
** Updated the GeoIP library to June.&lt;br /&gt;
** Updated PCRE from v6.1 to v6.4.&lt;br /&gt;
** Updated sqLite from 3.3.4 to 3.3.5.&lt;br /&gt;
** Fixed a steam account path bug in the installer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AMX Mod X]]&lt;/div&gt;</summary>
		<author><name>Faluco</name></author>
		
	</entry>
</feed>