<?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=Twilight+Suzuka</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=Twilight+Suzuka"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/Twilight_Suzuka"/>
	<updated>2026-04-29T06:21:50Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2537</id>
		<title>Optimizing Plugins (AMX Mod X Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2537"/>
		<updated>2006-02-01T02:58:32Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
[[Admin-Mod]] and [[AMX Mod X]] became very popular because of their easy to use scripting language.  However, the words &amp;quot;scripting language&amp;quot; come with a lot of loaded preconceptions.  Most people assume that because it's scripted:&lt;br /&gt;
*You can't possibly make it any faster&lt;br /&gt;
*It's pre-compiled, so it's already quite fast&lt;br /&gt;
*Details don't matter, as it's only &amp;quot;scripting&amp;quot; anyway&lt;br /&gt;
&lt;br /&gt;
Especially, with [[Pawn]] (formerly Small), none of these are true.  The compiler, in fact, is very poor at optimizing, and you can '''greatly''' increase the speed and efficiency of your plugins by keeping a few rules in mind.  Remember - it's more important to minimize instructions than it is to minimize lines of code.&lt;br /&gt;
&lt;br /&gt;
===Terms===&lt;br /&gt;
To read this document, you will need to understand a few concepts beforehand:&lt;br /&gt;
*&amp;lt;tt&amp;gt;BRANCHING&amp;lt;/tt&amp;gt; - When the processor takes a different path of code.  For example, to call a function or to use an if statement, the processor will &amp;quot;branch&amp;quot;.  Modern processors attempt to predict pathways with &amp;quot;branch prediction&amp;quot;, but it's best to avoid branching a lot if possible.&lt;br /&gt;
*&amp;lt;tt&amp;gt;STACK ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, all local data is stored on the stack, a big chunk of continuous memory.  Whenever you create a variable on the stack, it is automatically written with zeroes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;HEAP ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, temporary data that needs to be referenced by a native is stored on the heap, another area of contiguous, but less restrictive memory.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DATA SECTION&amp;lt;/tt&amp;gt; - This is an area of memory built into your .amxx file.  In fact, it &amp;quot;becomes&amp;quot; the heap at load time.  All your strings and arrays are hardcoded into this area.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EXPENSIVENESS&amp;lt;/tt&amp;gt; - To be &amp;quot;expensive&amp;quot; in computer science means an operation requires a lot of CPU processing.  It usually does not refer to memory size, only to processing cycles and time.  Addition is inexpensive, floating power operations are expensive.  However, both are inexpensive in comparison to writing a file.  An inexpensive operation can also be called &amp;quot;cheap&amp;quot;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;BIG-OH NOTATION&amp;lt;/tt&amp;gt; - O(*) notation refers to the expensiveness of an algorithm.  If something is O(n), it occurs in linear time -- meaning that for N items, it will complete relative to N.  O(N^2) means with N items, it will complete relative to N^2.  O(1) means &amp;quot;constant time&amp;quot; - no matter what N is, it will run in the same amount of time.&lt;br /&gt;
&lt;br /&gt;
==Compiler Optimizations==&lt;br /&gt;
These optimizations have to do with changing how your code is compiled.  While the syntax may remain the same, you are not only increasing compile time, but increasing your plugin's efficiency and speed at run time.&lt;br /&gt;
&lt;br /&gt;
===Always Save Results===&lt;br /&gt;
Observe the example code snippet below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (get_user_team(player) == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_SPECTATOR) {&lt;br /&gt;
    //...code&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This is a mild example of &amp;quot;cache your results&amp;quot;.  When the compiler generates assembly for this code, it will (in pseudo code) generate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice the problem?  We have called &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; an extra two times than necessary.  The result doesn't change, so we can save it.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
if (team == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (team == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} //...etc&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Now, the compiler will only generate this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; were an expensive operation (it's relatively cheap), we would have recalculated the entire result each branch of the &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Switch instead of If===&lt;br /&gt;
If you can, you should use &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; cases instead of &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;.  This is because for an if statement, the compiler must branch to each consecutive &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.  Using the example from above, observe the switch version:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
switch (team)&lt;br /&gt;
{&lt;br /&gt;
  case TEAM_T:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_CT:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_SPECTATOR:&lt;br /&gt;
     //code...&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will generate what's called a &amp;quot;case table&amp;quot;.  Rather than worm through displaced &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; tests, the compiler generates a table of possible values, which the virtual machine knows to browse through:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Don't Re-index Arrays===&lt;br /&gt;
A common practive in Small is to &amp;quot;save space&amp;quot; by re-indexing arrays.  There are a few myths behind this, such as saving memory, assuming the compiler does it for you, or readability.  Fact: none of these are true.  Observe the code below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new players[32], num, team&lt;br /&gt;
get_players(players, num)&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   if (!is_user_connected(players[i]))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(players[i])&lt;br /&gt;
   set_user_frags(players[i], 0)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
For this, the compiler generates code similar to:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
See what happened?  The compiler does not cache array indexing.  Because we've used &amp;lt;tt&amp;gt;players[i]&amp;lt;/tt&amp;gt; each time, every instance generates 4-6 (or more) instructions which load &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt;, the address of &amp;lt;tt&amp;gt;players&amp;lt;/tt&amp;gt;, computes the final location, and then grabs the data out of memory.  It is much faster to do:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   if (!is_user_connected(player))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(player)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Not only is this more readable, but look at how much cruft we've shaved off the compiler's generated code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   STORE player&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In a large loop you can drastically reduce codesize in this manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Global vs Local and Variables in Loops===&lt;br /&gt;
It is important to realize that every variable in [[Pawn]] is automatically zeroed.  For global variables, they are static and permanent, thus they are zeroed when your plugin is loaded.  Variables in functions, however, must be zeroed dynamically.  This is a slow and tedious operation, and you should not only avoid relying on it when necessary, but you should keep that fact in mind when using arrays.&lt;br /&gt;
&lt;br /&gt;
[[Arrays]] in [[Pawn]] are &amp;quot;cells&amp;quot; of data.  Each cell is four or eight bytes, depending on whether your processor is 32bit or 64bit.  To create an array of 4096 cells, for example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new array[4096]&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The compiler generates code to manually zero every single one of the 16,384 bytes in that location.  Normally, this isn't too bad -- but it can be absolutely deadly in a function which is called quite often.  For example, &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is called on every [[server tick]] in [[AMX Mod X]].  To declare an array of that size in &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is highly unnecessary.  Instead, you can take advantage of the fact that not only are globals free of charge, but &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; does not need to be re-entrant.  That is, you will never call &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; inside of &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt;, so making the variable global will not bring up the problem of one instance of the function overwriting data from another instance of the same function.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_serverframe_array[4096]&lt;br /&gt;
public server_frame()&lt;br /&gt;
{&lt;br /&gt;
  //...code that uses g_serverframe_array&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will execute conseridably faster.  You can do this with smaller arrays too.&lt;br /&gt;
&lt;br /&gt;
Likewise, it is equally important to avoid declaring arrays inside of loops.  Consider the following block of code:&lt;br /&gt;
&amp;lt;pawn&amp;gt;for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   new message[255], name[32], player&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
If there are 32 players, this loop will actually resize and zero out over 1K of memory thirty two times in a row.  Not good!  However, on the other hand, it's nice that the message is zeroed out for us each time.  &amp;lt;tt&amp;gt;Tip:&amp;lt;/tt&amp;gt; you often only need to zero out the first character of a string.  This will make the entire string empty.  The code below is much more efficient:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new message[255], name[32], player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   name[0] = '\0'&lt;br /&gt;
   message[0] = '\0'&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This has the effect of safely making the string empty beforehand, as well as largely reducing a lot of run-time overhead.&lt;br /&gt;
&lt;br /&gt;
===Static vs Global===&lt;br /&gt;
A way to drastically improve the memory footprint of your functions without the potentially confusing and damaging method of global variables can be found in static variables.&lt;br /&gt;
&lt;br /&gt;
A variable declared with the keyword &amp;quot;static&amp;quot; instead of &amp;quot;new&amp;quot; operates in the same way a global does (it is created only once) but the variable is still local to the function; this means it generates much easier to read code, while drastically improving speed.&lt;br /&gt;
&lt;br /&gt;
As such, one should always consider using a static variable or array in a situation where a global variable could be substituted for speed, but you want to keep your code neat and easy to analyze.&lt;br /&gt;
&lt;br /&gt;
===Constant variables===&lt;br /&gt;
You can declare a variable &amp;quot;constant&amp;quot; by adding the &amp;quot;const&amp;quot; keyword before the variable name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;new const AMX_GABEN[] = &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
&lt;br /&gt;
What this does is prevents the variable from being changed; essentially, you've locked the variable to a certain value. In this way, a constant can offer a type safe method of simplifying code, unlike a define, which is not type safe.&lt;br /&gt;
&lt;br /&gt;
In addition, constant variables are often optimized out, resulting in quicker and smaller code.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===For Loop Comparisons===&lt;br /&gt;
A common mistake is to write code like this:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
for (new i=0; i&amp;lt;strlen(string); i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This plays off a similar principle from before: cache results.  The compiler will actually recompute your string length on each iteration of the loop.  This will have even worse effects if your string changes mid-loop.  A more sensible method is:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
new len = strlen(string)&lt;br /&gt;
for (new i=0; i&amp;lt;len; i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tips and Tricks==&lt;br /&gt;
===Lookup Tables===&lt;br /&gt;
Precompute what can be precomputed.  For example, say you have a mapping of weapon indices to names:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (weapon == CSW_AK47)&lt;br /&gt;
   copy(name, len, &amp;quot;weapon_ak47&amp;quot;)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Ignoring the fact that we have &amp;lt;tt&amp;gt;get_weapon_name&amp;lt;/tt&amp;gt; in [[AMX Mod X]], this is inefficient.  We could precompute this result in a table:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_WeaponNamesTable[TOTAL_WEAPONS] = {&lt;br /&gt;
   //..0 to CSW_AK47-1&lt;br /&gt;
   &amp;quot;weapon_ak47&amp;quot;,&lt;br /&gt;
   //..CSW_AK47+1 to TOTAL_WEAPONS-1&lt;br /&gt;
};&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Perfect Hashing===&lt;br /&gt;
:TODO: explain this&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Local Strings===&lt;br /&gt;
The [[Pawn]] compiler does not optimize the DATA section, which stores all hardcoded strings and global arrays.  If you reference the same hardcoded string 500 times in your plugin, it will appear 500 different times.  If this seems bad enough, it actually does this with all strings.  For example, the empty string (&amp;quot;&amp;quot;) appears everywhere in the include files, usually used as a default parameter to many natives.  This too is copied into the data section for each unique reference.  &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;set_cvar_string(&amp;quot;amx_gaben&amp;quot;, get_cvar_string(&amp;quot;amx_gaben&amp;quot;) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will create two copies of &amp;quot;amx_gaben&amp;quot; in the DATA section.  While this doesn't really hurt, it does increase the size of your plugin.  &lt;br /&gt;
&lt;br /&gt;
Similarly, this has the same problem:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#define AMX_GABEN &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The only way to avoid this mess is to use global variables.  As stated earlier, they're basically free storage.&lt;br /&gt;
&amp;lt;pawn&amp;gt;new AMX_GABEN[] = &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, while not necessary, this will reduce your plugin's size in memory and on disk.  If you're already using defines, you can make this switch easily.&lt;br /&gt;
&lt;br /&gt;
In order to prevent this from changing, you may want to declare it constant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;new const AMX_GABEN[] = &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now it is a perfectly safe method of storage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2536</id>
		<title>Optimizing Plugins (AMX Mod X Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2536"/>
		<updated>2006-02-01T02:55:26Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
[[Admin-Mod]] and [[AMX Mod X]] became very popular because of their easy to use scripting language.  However, the words &amp;quot;scripting language&amp;quot; come with a lot of loaded preconceptions.  Most people assume that because it's scripted:&lt;br /&gt;
*You can't possibly make it any faster&lt;br /&gt;
*It's pre-compiled, so it's already quite fast&lt;br /&gt;
*Details don't matter, as it's only &amp;quot;scripting&amp;quot; anyway&lt;br /&gt;
&lt;br /&gt;
Especially, with [[Pawn]] (formerly Small), none of these are true.  The compiler, in fact, is very poor at optimizing, and you can '''greatly''' increase the speed and efficiency of your plugins by keeping a few rules in mind.  Remember - it's more important to minimize instructions than it is to minimize lines of code.&lt;br /&gt;
&lt;br /&gt;
===Terms===&lt;br /&gt;
To read this document, you will need to understand a few concepts beforehand:&lt;br /&gt;
*&amp;lt;tt&amp;gt;BRANCHING&amp;lt;/tt&amp;gt; - When the processor takes a different path of code.  For example, to call a function or to use an if statement, the processor will &amp;quot;branch&amp;quot;.  Modern processors attempt to predict pathways with &amp;quot;branch prediction&amp;quot;, but it's best to avoid branching a lot if possible.&lt;br /&gt;
*&amp;lt;tt&amp;gt;STACK ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, all local data is stored on the stack, a big chunk of continuous memory.  Whenever you create a variable on the stack, it is automatically written with zeroes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;HEAP ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, temporary data that needs to be referenced by a native is stored on the heap, another area of contiguous, but less restrictive memory.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DATA SECTION&amp;lt;/tt&amp;gt; - This is an area of memory built into your .amxx file.  In fact, it &amp;quot;becomes&amp;quot; the heap at load time.  All your strings and arrays are hardcoded into this area.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EXPENSIVENESS&amp;lt;/tt&amp;gt; - To be &amp;quot;expensive&amp;quot; in computer science means an operation requires a lot of CPU processing.  It usually does not refer to memory size, only to processing cycles and time.  Addition is inexpensive, floating power operations are expensive.  However, both are inexpensive in comparison to writing a file.  An inexpensive operation can also be called &amp;quot;cheap&amp;quot;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;BIG-OH NOTATION&amp;lt;/tt&amp;gt; - O(*) notation refers to the expensiveness of an algorithm.  If something is O(n), it occurs in linear time -- meaning that for N items, it will complete relative to N.  O(N^2) means with N items, it will complete relative to N^2.  O(1) means &amp;quot;constant time&amp;quot; - no matter what N is, it will run in the same amount of time.&lt;br /&gt;
&lt;br /&gt;
==Compiler Optimizations==&lt;br /&gt;
These optimizations have to do with changing how your code is compiled.  While the syntax may remain the same, you are not only increasing compile time, but increasing your plugin's efficiency and speed at run time.&lt;br /&gt;
&lt;br /&gt;
===Always Save Results===&lt;br /&gt;
Observe the example code snippet below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (get_user_team(player) == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_SPECTATOR) {&lt;br /&gt;
    //...code&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This is a mild example of &amp;quot;cache your results&amp;quot;.  When the compiler generates assembly for this code, it will (in pseudo code) generate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice the problem?  We have called &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; an extra two times than necessary.  The result doesn't change, so we can save it.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
if (team == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (team == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} //...etc&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Now, the compiler will only generate this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; were an expensive operation (it's relatively cheap), we would have recalculated the entire result each branch of the &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Switch instead of If===&lt;br /&gt;
If you can, you should use &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; cases instead of &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;.  This is because for an if statement, the compiler must branch to each consecutive &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.  Using the example from above, observe the switch version:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
switch (team)&lt;br /&gt;
{&lt;br /&gt;
  case TEAM_T:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_CT:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_SPECTATOR:&lt;br /&gt;
     //code...&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will generate what's called a &amp;quot;case table&amp;quot;.  Rather than worm through displaced &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; tests, the compiler generates a table of possible values, which the virtual machine knows to browse through:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Don't Re-index Arrays===&lt;br /&gt;
A common practive in Small is to &amp;quot;save space&amp;quot; by re-indexing arrays.  There are a few myths behind this, such as saving memory, assuming the compiler does it for you, or readability.  Fact: none of these are true.  Observe the code below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new players[32], num, team&lt;br /&gt;
get_players(players, num)&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   if (!is_user_connected(players[i]))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(players[i])&lt;br /&gt;
   set_user_frags(players[i], 0)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
For this, the compiler generates code similar to:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
See what happened?  The compiler does not cache array indexing.  Because we've used &amp;lt;tt&amp;gt;players[i]&amp;lt;/tt&amp;gt; each time, every instance generates 4-6 (or more) instructions which load &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt;, the address of &amp;lt;tt&amp;gt;players&amp;lt;/tt&amp;gt;, computes the final location, and then grabs the data out of memory.  It is much faster to do:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   if (!is_user_connected(player))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(player)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Not only is this more readable, but look at how much cruft we've shaved off the compiler's generated code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   STORE player&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In a large loop you can drastically reduce codesize in this manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Global vs Local and Variables in Loops===&lt;br /&gt;
It is important to realize that every variable in [[Pawn]] is automatically zeroed.  For global variables, they are static and permanent, thus they are zeroed when your plugin is loaded.  Variables in functions, however, must be zeroed dynamically.  This is a slow and tedious operation, and you should not only avoid relying on it when necessary, but you should keep that fact in mind when using arrays.&lt;br /&gt;
&lt;br /&gt;
[[Arrays]] in [[Pawn]] are &amp;quot;cells&amp;quot; of data.  Each cell is four or eight bytes, depending on whether your processor is 32bit or 64bit.  To create an array of 4096 cells, for example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new array[4096]&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The compiler generates code to manually zero every single one of the 16,384 bytes in that location.  Normally, this isn't too bad -- but it can be absolutely deadly in a function which is called quite often.  For example, &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is called on every [[server tick]] in [[AMX Mod X]].  To declare an array of that size in &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is highly unnecessary.  Instead, you can take advantage of the fact that not only are globals free of charge, but &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; does not need to be re-entrant.  That is, you will never call &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; inside of &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt;, so making the variable global will not bring up the problem of one instance of the function overwriting data from another instance of the same function.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_serverframe_array[4096]&lt;br /&gt;
public server_frame()&lt;br /&gt;
{&lt;br /&gt;
  //...code that uses g_serverframe_array&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will execute conseridably faster.  You can do this with smaller arrays too.&lt;br /&gt;
&lt;br /&gt;
Likewise, it is equally important to avoid declaring arrays inside of loops.  Consider the following block of code:&lt;br /&gt;
&amp;lt;pawn&amp;gt;for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   new message[255], name[32], player&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
If there are 32 players, this loop will actually resize and zero out over 1K of memory thirty two times in a row.  Not good!  However, on the other hand, it's nice that the message is zeroed out for us each time.  &amp;lt;tt&amp;gt;Tip:&amp;lt;/tt&amp;gt; you often only need to zero out the first character of a string.  This will make the entire string empty.  The code below is much more efficient:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new message[255], name[32], player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   name[0] = '\0'&lt;br /&gt;
   message[0] = '\0'&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This has the effect of safely making the string empty beforehand, as well as largely reducing a lot of run-time overhead.&lt;br /&gt;
&lt;br /&gt;
===Static vs Global===&lt;br /&gt;
A way to drastically improve the memory footprint of your functions without the potentially confusing and damaging method of global variables can be found in static variables.&lt;br /&gt;
&lt;br /&gt;
A variable declared with the keyword &amp;quot;static&amp;quot; instead of &amp;quot;new&amp;quot; operates in the same way a global does (it is created only once) but the variable is still local to the function; this means it generates much easier to read code, while drastically improving speed.&lt;br /&gt;
&lt;br /&gt;
As such, one should always consider using a static variable or array in a situation where a global variable could be substituted for speed, but you want to keep your code neat and easy to analyze.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===For Loop Comparisons===&lt;br /&gt;
A common mistake is to write code like this:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
for (new i=0; i&amp;lt;strlen(string); i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This plays off a similar principle from before: cache results.  The compiler will actually recompute your string length on each iteration of the loop.  This will have even worse effects if your string changes mid-loop.  A more sensible method is:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
new len = strlen(string)&lt;br /&gt;
for (new i=0; i&amp;lt;len; i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tips and Tricks==&lt;br /&gt;
===Lookup Tables===&lt;br /&gt;
Precompute what can be precomputed.  For example, say you have a mapping of weapon indices to names:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (weapon == CSW_AK47)&lt;br /&gt;
   copy(name, len, &amp;quot;weapon_ak47&amp;quot;)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Ignoring the fact that we have &amp;lt;tt&amp;gt;get_weapon_name&amp;lt;/tt&amp;gt; in [[AMX Mod X]], this is inefficient.  We could precompute this result in a table:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_WeaponNamesTable[TOTAL_WEAPONS] = {&lt;br /&gt;
   //..0 to CSW_AK47-1&lt;br /&gt;
   &amp;quot;weapon_ak47&amp;quot;,&lt;br /&gt;
   //..CSW_AK47+1 to TOTAL_WEAPONS-1&lt;br /&gt;
};&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Perfect Hashing===&lt;br /&gt;
:TODO: explain this&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Local Strings===&lt;br /&gt;
The [[Pawn]] compiler does not optimize the DATA section, which stores all hardcoded strings and global arrays.  If you reference the same hardcoded string 500 times in your plugin, it will appear 500 different times.  If this seems bad enough, it actually does this with all strings.  For example, the empty string (&amp;quot;&amp;quot;) appears everywhere in the include files, usually used as a default parameter to many natives.  This too is copied into the data section for each unique reference.  &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;set_cvar_string(&amp;quot;amx_gaben&amp;quot;, get_cvar_string(&amp;quot;amx_gaben&amp;quot;) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will create two copies of &amp;quot;amx_gaben&amp;quot; in the DATA section.  While this doesn't really hurt, it does increase the size of your plugin.  &lt;br /&gt;
&lt;br /&gt;
Similarly, this has the same problem:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#define AMX_GABEN &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The only way to avoid this mess is to use global variables.  As stated earlier, they're basically free storage.&lt;br /&gt;
&amp;lt;pawn&amp;gt;new AMX_GABEN[] = &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, while not necessary, this will reduce your plugin's size in memory and on disk.  If you're already using defines, you can make this switch easily.&lt;br /&gt;
&lt;br /&gt;
In order to prevent this from changing, you may want to declare it constant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;new const AMX_GABEN[] = &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now it is a perfectly safe method of storage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2535</id>
		<title>Optimizing Plugins (AMX Mod X Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2535"/>
		<updated>2006-02-01T02:53:43Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
[[Admin-Mod]] and [[AMX Mod X]] became very popular because of their easy to use scripting language.  However, the words &amp;quot;scripting language&amp;quot; come with a lot of loaded preconceptions.  Most people assume that because it's scripted:&lt;br /&gt;
*You can't possibly make it any faster&lt;br /&gt;
*It's pre-compiled, so it's already quite fast&lt;br /&gt;
*Details don't matter, as it's only &amp;quot;scripting&amp;quot; anyway&lt;br /&gt;
&lt;br /&gt;
Especially, with [[Pawn]] (formerly Small), none of these are true.  The compiler, in fact, is very poor at optimizing, and you can '''greatly''' increase the speed and efficiency of your plugins by keeping a few rules in mind.  Remember - it's more important to minimize instructions than it is to minimize lines of code.&lt;br /&gt;
&lt;br /&gt;
===Terms===&lt;br /&gt;
To read this document, you will need to understand a few concepts beforehand:&lt;br /&gt;
*&amp;lt;tt&amp;gt;BRANCHING&amp;lt;/tt&amp;gt; - When the processor takes a different path of code.  For example, to call a function or to use an if statement, the processor will &amp;quot;branch&amp;quot;.  Modern processors attempt to predict pathways with &amp;quot;branch prediction&amp;quot;, but it's best to avoid branching a lot if possible.&lt;br /&gt;
*&amp;lt;tt&amp;gt;STACK ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, all local data is stored on the stack, a big chunk of continuous memory.  Whenever you create a variable on the stack, it is automatically written with zeroes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;HEAP ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, temporary data that needs to be referenced by a native is stored on the heap, another area of contiguous, but less restrictive memory.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DATA SECTION&amp;lt;/tt&amp;gt; - This is an area of memory built into your .amxx file.  In fact, it &amp;quot;becomes&amp;quot; the heap at load time.  All your strings and arrays are hardcoded into this area.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EXPENSIVENESS&amp;lt;/tt&amp;gt; - To be &amp;quot;expensive&amp;quot; in computer science means an operation requires a lot of CPU processing.  It usually does not refer to memory size, only to processing cycles and time.  Addition is inexpensive, floating power operations are expensive.  However, both are inexpensive in comparison to writing a file.  An inexpensive operation can also be called &amp;quot;cheap&amp;quot;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;BIG-OH NOTATION&amp;lt;/tt&amp;gt; - O(*) notation refers to the expensiveness of an algorithm.  If something is O(n), it occurs in linear time -- meaning that for N items, it will complete relative to N.  O(N^2) means with N items, it will complete relative to N^2.  O(1) means &amp;quot;constant time&amp;quot; - no matter what N is, it will run in the same amount of time.&lt;br /&gt;
&lt;br /&gt;
==Compiler Optimizations==&lt;br /&gt;
These optimizations have to do with changing how your code is compiled.  While the syntax may remain the same, you are not only increasing compile time, but increasing your plugin's efficiency and speed at run time.&lt;br /&gt;
&lt;br /&gt;
===Always Save Results===&lt;br /&gt;
Observe the example code snippet below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (get_user_team(player) == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_SPECTATOR) {&lt;br /&gt;
    //...code&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This is a mild example of &amp;quot;cache your results&amp;quot;.  When the compiler generates assembly for this code, it will (in pseudo code) generate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice the problem?  We have called &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; an extra two times than necessary.  The result doesn't change, so we can save it.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
if (team == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (team == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} //...etc&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Now, the compiler will only generate this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; were an expensive operation (it's relatively cheap), we would have recalculated the entire result each branch of the &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Switch instead of If===&lt;br /&gt;
If you can, you should use &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; cases instead of &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;.  This is because for an if statement, the compiler must branch to each consecutive &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.  Using the example from above, observe the switch version:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
switch (team)&lt;br /&gt;
{&lt;br /&gt;
  case TEAM_T:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_CT:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_SPECTATOR:&lt;br /&gt;
     //code...&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will generate what's called a &amp;quot;case table&amp;quot;.  Rather than worm through displaced &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; tests, the compiler generates a table of possible values, which the virtual machine knows to browse through:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Don't Re-index Arrays===&lt;br /&gt;
A common practive in Small is to &amp;quot;save space&amp;quot; by re-indexing arrays.  There are a few myths behind this, such as saving memory, assuming the compiler does it for you, or readability.  Fact: none of these are true.  Observe the code below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new players[32], num, team&lt;br /&gt;
get_players(players, num)&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   if (!is_user_connected(players[i]))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(players[i])&lt;br /&gt;
   set_user_frags(players[i], 0)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
For this, the compiler generates code similar to:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
See what happened?  The compiler does not cache array indexing.  Because we've used &amp;lt;tt&amp;gt;players[i]&amp;lt;/tt&amp;gt; each time, every instance generates 4-6 (or more) instructions which load &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt;, the address of &amp;lt;tt&amp;gt;players&amp;lt;/tt&amp;gt;, computes the final location, and then grabs the data out of memory.  It is much faster to do:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   if (!is_user_connected(player))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(player)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Not only is this more readable, but look at how much cruft we've shaved off the compiler's generated code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   STORE player&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In a large loop you can drastically reduce codesize in this manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Global vs Local and Variables in Loops===&lt;br /&gt;
It is important to realize that every variable in [[Pawn]] is automatically zeroed.  For global variables, they are static and permanent, thus they are zeroed when your plugin is loaded.  Variables in functions, however, must be zeroed dynamically.  This is a slow and tedious operation, and you should not only avoid relying on it when necessary, but you should keep that fact in mind when using arrays.&lt;br /&gt;
&lt;br /&gt;
[[Arrays]] in [[Pawn]] are &amp;quot;cells&amp;quot; of data.  Each cell is four or eight bytes, depending on whether your processor is 32bit or 64bit.  To create an array of 4096 cells, for example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new array[4096]&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The compiler generates code to manually zero every single one of the 16,384 bytes in that location.  Normally, this isn't too bad -- but it can be absolutely deadly in a function which is called quite often.  For example, &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is called on every [[server tick]] in [[AMX Mod X]].  To declare an array of that size in &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is highly unnecessary.  Instead, you can take advantage of the fact that not only are globals free of charge, but &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; does not need to be re-entrant.  That is, you will never call &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; inside of &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt;, so making the variable global will not bring up the problem of one instance of the function overwriting data from another instance of the same function.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_serverframe_array[4096]&lt;br /&gt;
public server_frame()&lt;br /&gt;
{&lt;br /&gt;
  //...code that uses g_serverframe_array&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will execute conseridably faster.  You can do this with smaller arrays too.&lt;br /&gt;
&lt;br /&gt;
Likewise, it is equally important to avoid declaring arrays inside of loops.  Consider the following block of code:&lt;br /&gt;
&amp;lt;pawn&amp;gt;for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   new message[255], name[32], player&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
If there are 32 players, this loop will actually resize and zero out over 1K of memory thirty two times in a row.  Not good!  However, on the other hand, it's nice that the message is zeroed out for us each time.  &amp;lt;tt&amp;gt;Tip:&amp;lt;/tt&amp;gt; you often only need to zero out the first character of a string.  This will make the entire string empty.  The code below is much more efficient:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new message[255], name[32], player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   name[0] = '\0'&lt;br /&gt;
   message[0] = '\0'&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This has the effect of safely making the string empty beforehand, as well as largely reducing a lot of run-time overhead.&lt;br /&gt;
&lt;br /&gt;
===Static vs Global===&lt;br /&gt;
A way to drastically improve the memory footprint of your functions without the potentially confusing and damaging method of global variables can be found in static variables.&lt;br /&gt;
&lt;br /&gt;
A variable declared with the keyword &amp;quot;static&amp;quot; instead of &amp;quot;new&amp;quot; operates in the same way a global does (it is created only once) but the variable is still local to the function; this means it generates much easier to read code, while drastically improving speed.&lt;br /&gt;
&lt;br /&gt;
As such, one should always consider using a static variable or array in a situation where a global variable could be substituted for speed, but you want to keep your code neat and easy to analyze.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===For Loop Comparisons===&lt;br /&gt;
A common mistake is to write code like this:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
for (new i=0; i&amp;lt;strlen(string); i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This plays off a similar principle from before: cache results.  The compiler will actually recompute your string length on each iteration of the loop.  This will have even worse effects if your string changes mid-loop.  A more sensible method is:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
new len = strlen(string)&lt;br /&gt;
for (new i=0; i&amp;lt;len; i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tips and Tricks==&lt;br /&gt;
===Lookup Tables===&lt;br /&gt;
Precompute what can be precomputed.  For example, say you have a mapping of weapon indices to names:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (weapon == CSW_AK47)&lt;br /&gt;
   copy(name, len, &amp;quot;weapon_ak47&amp;quot;)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Ignoring the fact that we have &amp;lt;tt&amp;gt;get_weapon_name&amp;lt;/tt&amp;gt; in [[AMX Mod X]], this is inefficient.  We could precompute this result in a table:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_WeaponNamesTable[TOTAL_WEAPONS] = {&lt;br /&gt;
   //..0 to CSW_AK47-1&lt;br /&gt;
   &amp;quot;weapon_ak47&amp;quot;,&lt;br /&gt;
   //..CSW_AK47+1 to TOTAL_WEAPONS-1&lt;br /&gt;
};&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Perfect Hashing===&lt;br /&gt;
:TODO: explain this&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Local Strings===&lt;br /&gt;
The [[Pawn]] compiler does not optimize the DATA section, which stores all hardcoded strings and global arrays.  If you reference the same hardcoded string 500 times in your plugin, it will appear 500 different times.  If this seems bad enough, it actually does this with all strings.  For example, the empty string (&amp;quot;&amp;quot;) appears everywhere in the include files, usually used as a default parameter to many natives.  This too is copied into the data section for each unique reference.  &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;set_cvar_string(&amp;quot;amx_gaben&amp;quot;, get_cvar_string(&amp;quot;amx_gaben&amp;quot;) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will create two copies of &amp;quot;amx_gaben&amp;quot; in the DATA section.  While this doesn't really hurt, it does increase the size of your plugin.  &lt;br /&gt;
&lt;br /&gt;
Similarly, this has the same problem:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#define AMX_GABEN &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The only way to avoid this mess is to use global variables.  As stated earlier, they're basically free storage.&lt;br /&gt;
&amp;lt;pawn&amp;gt;new AMX_GABEN[] = &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, while not necessary, this will reduce your plugin's size in memory and on disk.  If you're already using defines, you can make this switch easily.&lt;br /&gt;
&lt;br /&gt;
{{qnotice|Be careful that if you use this global array method, you do not allow the array to be modified.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2534</id>
		<title>Optimizing Plugins (AMX Mod X Scripting)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=2534"/>
		<updated>2006-02-01T02:52:25Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
[[Admin-Mod]] and [[AMX Mod X]] became very popular because of their easy to use scripting language.  However, the words &amp;quot;scripting language&amp;quot; come with a lot of loaded preconceptions.  Most people assume that because it's scripted:&lt;br /&gt;
*You can't possibly make it any faster&lt;br /&gt;
*It's pre-compiled, so it's already quite fast&lt;br /&gt;
*Details don't matter, as it's only &amp;quot;scripting&amp;quot; anyway&lt;br /&gt;
&lt;br /&gt;
Especially, with [[Pawn]] (formerly Small), none of these are true.  The compiler, in fact, is very poor at optimizing, and you can '''greatly''' increase the speed and efficiency of your plugins by keeping a few rules in mind.  Remember - it's more important to minimize instructions than it is to minimize lines of code.&lt;br /&gt;
&lt;br /&gt;
===Terms===&lt;br /&gt;
To read this document, you will need to understand a few concepts beforehand:&lt;br /&gt;
*&amp;lt;tt&amp;gt;BRANCHING&amp;lt;/tt&amp;gt; - When the processor takes a different path of code.  For example, to call a function or to use an if statement, the processor will &amp;quot;branch&amp;quot;.  Modern processors attempt to predict pathways with &amp;quot;branch prediction&amp;quot;, but it's best to avoid branching a lot if possible.&lt;br /&gt;
*&amp;lt;tt&amp;gt;STACK ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, all local data is stored on the stack, a big chunk of continuous memory.  Whenever you create a variable on the stack, it is automatically written with zeroes.&lt;br /&gt;
*&amp;lt;tt&amp;gt;HEAP ALLOCATION&amp;lt;/tt&amp;gt; - In Pawn, temporary data that needs to be referenced by a native is stored on the heap, another area of contiguous, but less restrictive memory.&lt;br /&gt;
*&amp;lt;tt&amp;gt;DATA SECTION&amp;lt;/tt&amp;gt; - This is an area of memory built into your .amxx file.  In fact, it &amp;quot;becomes&amp;quot; the heap at load time.  All your strings and arrays are hardcoded into this area.&lt;br /&gt;
*&amp;lt;tt&amp;gt;EXPENSIVENESS&amp;lt;/tt&amp;gt; - To be &amp;quot;expensive&amp;quot; in computer science means an operation requires a lot of CPU processing.  It usually does not refer to memory size, only to processing cycles and time.  Addition is inexpensive, floating power operations are expensive.  However, both are inexpensive in comparison to writing a file.  An inexpensive operation can also be called &amp;quot;cheap&amp;quot;.&lt;br /&gt;
*&amp;lt;tt&amp;gt;BIG-OH NOTATION&amp;lt;/tt&amp;gt; - O(*) notation refers to the expensiveness of an algorithm.  If something is O(n), it occurs in linear time -- meaning that for N items, it will complete relative to N.  O(N^2) means with N items, it will complete relative to N^2.  O(1) means &amp;quot;constant time&amp;quot; - no matter what N is, it will run in the same amount of time.&lt;br /&gt;
&lt;br /&gt;
==Compiler Optimizations==&lt;br /&gt;
These optimizations have to do with changing how your code is compiled.  While the syntax may remain the same, you are not only increasing compile time, but increasing your plugin's efficiency and speed at run time.&lt;br /&gt;
&lt;br /&gt;
===Always Save Results===&lt;br /&gt;
Observe the example code snippet below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (get_user_team(player) == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (get_user_team(player) == TEAM_SPECTATOR) {&lt;br /&gt;
    //...code&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This is a mild example of &amp;quot;cache your results&amp;quot;.  When the compiler generates assembly for this code, it will (in pseudo code) generate:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Notice the problem?  We have called &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; an extra two times than necessary.  The result doesn't change, so we can save it.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
if (team == TEAM_T)&lt;br /&gt;
{&lt;br /&gt;
    //...code&lt;br /&gt;
} else if (team == TEAM_CT) {&lt;br /&gt;
    //...code&lt;br /&gt;
} //...etc&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Now, the compiler will only generate this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
  COMPARE+BRANCH&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If &amp;lt;tt&amp;gt;get_user_team&amp;lt;/tt&amp;gt; were an expensive operation (it's relatively cheap), we would have recalculated the entire result each branch of the &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Switch instead of If===&lt;br /&gt;
If you can, you should use &amp;lt;tt&amp;gt;switch&amp;lt;/tt&amp;gt; cases instead of &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;.  This is because for an if statement, the compiler must branch to each consecutive &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; case.  Using the example from above, observe the switch version:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new team = get_user_team(player)&lt;br /&gt;
switch (team)&lt;br /&gt;
{&lt;br /&gt;
  case TEAM_T:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_CT:&lt;br /&gt;
     //code...&lt;br /&gt;
  case TEAM_SPECTATOR:&lt;br /&gt;
     //code...&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will generate what's called a &amp;quot;case table&amp;quot;.  Rather than worm through displaced &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt; tests, the compiler generates a table of possible values, which the virtual machine knows to browse through:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  CALL get_user_team&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
  COMPARE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Don't Re-index Arrays===&lt;br /&gt;
A common practive in Small is to &amp;quot;save space&amp;quot; by re-indexing arrays.  There are a few myths behind this, such as saving memory, assuming the compiler does it for you, or readability.  Fact: none of these are true.  Observe the code below:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new players[32], num, team&lt;br /&gt;
get_players(players, num)&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   if (!is_user_connected(players[i]))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(players[i])&lt;br /&gt;
   set_user_frags(players[i], 0)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
For this, the compiler generates code similar to:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
See what happened?  The compiler does not cache array indexing.  Because we've used &amp;lt;tt&amp;gt;players[i]&amp;lt;/tt&amp;gt; each time, every instance generates 4-6 (or more) instructions which load &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt;, the address of &amp;lt;tt&amp;gt;players&amp;lt;/tt&amp;gt;, computes the final location, and then grabs the data out of memory.  It is much faster to do:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   if (!is_user_connected(player))&lt;br /&gt;
      continue;&lt;br /&gt;
   team = get_user_team(player)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Not only is this more readable, but look at how much cruft we've shaved off the compiler's generated code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
:LOOP_BEGIN&lt;br /&gt;
   LOAD i&lt;br /&gt;
   LOAD players&lt;br /&gt;
   CALC&lt;br /&gt;
   LOAD players[i]&lt;br /&gt;
   STORE player&lt;br /&gt;
   CALL is_user_connected&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL get_user_team&lt;br /&gt;
   LOAD player&lt;br /&gt;
   CALL set_user_frags&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In a large loop you can drastically reduce codesize in this manner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Global vs Local and Variables in Loops===&lt;br /&gt;
It is important to realize that every variable in [[Pawn]] is automatically zeroed.  For global variables, they are static and permanent, thus they are zeroed when your plugin is loaded.  Variables in functions, however, must be zeroed dynamically.  This is a slow and tedious operation, and you should not only avoid relying on it when necessary, but you should keep that fact in mind when using arrays.&lt;br /&gt;
&lt;br /&gt;
[[Arrays]] in [[Pawn]] are &amp;quot;cells&amp;quot; of data.  Each cell is four or eight bytes, depending on whether your processor is 32bit or 64bit.  To create an array of 4096 cells, for example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new array[4096]&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The compiler generates code to manually zero every single one of the 16,384 bytes in that location.  Normally, this isn't too bad -- but it can be absolutely deadly in a function which is called quite often.  For example, &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is called on every [[server tick]] in [[AMX Mod X]].  To declare an array of that size in &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; is highly unnecessary.  Instead, you can take advantage of the fact that not only are globals free of charge, but &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; does not need to be re-entrant.  That is, you will never call &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt; inside of &amp;lt;tt&amp;gt;server_frame&amp;lt;/tt&amp;gt;, so making the variable global will not bring up the problem of one instance of the function overwriting data from another instance of the same function.  Observe:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_serverframe_array[4096]&lt;br /&gt;
public server_frame()&lt;br /&gt;
{&lt;br /&gt;
  //...code that uses g_serverframe_array&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will execute conseridably faster.  You can do this with smaller arrays too.&lt;br /&gt;
&lt;br /&gt;
Likewise, it is equally important to avoid declaring arrays inside of loops.  Consider the following block of code:&lt;br /&gt;
&amp;lt;pawn&amp;gt;for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   new message[255], name[32], player&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
If there are 32 players, this loop will actually resize and zero out over 1K of memory thirty two times in a row.  Not good!  However, on the other hand, it's nice that the message is zeroed out for us each time.  &amp;lt;tt&amp;gt;Tip:&amp;lt;/tt&amp;gt; you often only need to zero out the first character of a string.  This will make the entire string empty.  The code below is much more efficient:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new message[255], name[32], player&lt;br /&gt;
for (new i=0; i&amp;lt;num; i++)&lt;br /&gt;
{&lt;br /&gt;
   player = players[i]&lt;br /&gt;
   name[0] = '\0'&lt;br /&gt;
   message[0] = '\0'&lt;br /&gt;
   get_user_name(player, name, 31)&lt;br /&gt;
   format(message, 254, &amp;quot;Hello, %s&amp;quot;, name)&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This has the effect of safely making the string empty beforehand, as well as largely reducing a lot of run-time overhead.&lt;br /&gt;
&lt;br /&gt;
===Static vs Global===&lt;br /&gt;
A way to drastically improve the memory footprint of your functions without the potentially confusing and damaging method of global variables can be found in static variables.&lt;br /&gt;
&lt;br /&gt;
A variable declared with the keyword &amp;quot;static&amp;quot; instead of &amp;quot;new&amp;quot; operates in the same way a global does (it is created only once) but the variable is still local to the function; this means it generates much easier to read code, while drastically improving speed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===For Loop Comparisons===&lt;br /&gt;
A common mistake is to write code like this:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
for (new i=0; i&amp;lt;strlen(string); i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This plays off a similar principle from before: cache results.  The compiler will actually recompute your string length on each iteration of the loop.  This will have even worse effects if your string changes mid-loop.  A more sensible method is:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new string[256] = &amp;quot;something long&amp;quot;&lt;br /&gt;
new len = strlen(string)&lt;br /&gt;
for (new i=0; i&amp;lt;len; i++)&lt;br /&gt;
   //...code&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Tips and Tricks==&lt;br /&gt;
===Lookup Tables===&lt;br /&gt;
Precompute what can be precomputed.  For example, say you have a mapping of weapon indices to names:&lt;br /&gt;
&amp;lt;pawn&amp;gt;if (weapon == CSW_AK47)&lt;br /&gt;
   copy(name, len, &amp;quot;weapon_ak47&amp;quot;)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
Ignoring the fact that we have &amp;lt;tt&amp;gt;get_weapon_name&amp;lt;/tt&amp;gt; in [[AMX Mod X]], this is inefficient.  We could precompute this result in a table:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_WeaponNamesTable[TOTAL_WEAPONS] = {&lt;br /&gt;
   //..0 to CSW_AK47-1&lt;br /&gt;
   &amp;quot;weapon_ak47&amp;quot;,&lt;br /&gt;
   //..CSW_AK47+1 to TOTAL_WEAPONS-1&lt;br /&gt;
};&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Perfect Hashing===&lt;br /&gt;
:TODO: explain this&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Local Strings===&lt;br /&gt;
The [[Pawn]] compiler does not optimize the DATA section, which stores all hardcoded strings and global arrays.  If you reference the same hardcoded string 500 times in your plugin, it will appear 500 different times.  If this seems bad enough, it actually does this with all strings.  For example, the empty string (&amp;quot;&amp;quot;) appears everywhere in the include files, usually used as a default parameter to many natives.  This too is copied into the data section for each unique reference.  &lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;set_cvar_string(&amp;quot;amx_gaben&amp;quot;, get_cvar_string(&amp;quot;amx_gaben&amp;quot;) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
This will create two copies of &amp;quot;amx_gaben&amp;quot; in the DATA section.  While this doesn't really hurt, it does increase the size of your plugin.  &lt;br /&gt;
&lt;br /&gt;
Similarly, this has the same problem:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#define AMX_GABEN &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
The only way to avoid this mess is to use global variables.  As stated earlier, they're basically free storage.&lt;br /&gt;
&amp;lt;pawn&amp;gt;new AMX_GABEN[] = &amp;quot;amx_gaben&amp;quot;&lt;br /&gt;
set_cvar_string(AMX_GABEN, get_cvar_string(AMX_GABEN) + 1)&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Again, while not necessary, this will reduce your plugin's size in memory and on disk.  If you're already using defines, you can make this switch easily.&lt;br /&gt;
&lt;br /&gt;
{{qnotice|Be careful that if you use this global array method, you do not allow the array to be modified.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Hawk552&amp;diff=2347</id>
		<title>User:Hawk552</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Hawk552&amp;diff=2347"/>
		<updated>2006-01-19T22:33:02Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* AMX(X) Experience */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Hawk552==&lt;br /&gt;
&lt;br /&gt;
Hello, my name is Hawk552.&lt;br /&gt;
&lt;br /&gt;
==Something==&lt;br /&gt;
stuff&lt;br /&gt;
&lt;br /&gt;
==AMX(X) Experience==&lt;br /&gt;
Sucks a coding really badly. Hated by all, loved by none.&lt;br /&gt;
&lt;br /&gt;
==gaben==&lt;br /&gt;
&lt;br /&gt;
hello pm, yams.&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2064</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2064"/>
		<updated>2006-01-15T21:59:21Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* TwistedEuphoria */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions.&lt;br /&gt;
This story is, remarkably, about Twisty's birth:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From that moment on, not much changed. &lt;br /&gt;
&lt;br /&gt;
Twisty didn't move more than an inch until his tenth birthday, when he was plyed with alcohol to move towards a large peice of cake. This is also the day that Twisty became an orphan, as his parents were caught plying many young girls with alcohol, along with Twisty. In a feat of untold horror, the police uncovered an amount of child pornography that made the great egyptian pyramids look like mole hills.&lt;br /&gt;
&lt;br /&gt;
At this point, Twisty was over 500 pounds, and used a computer with OSX on it.&lt;br /&gt;
&lt;br /&gt;
Currently, Twisty is at a much more acceptable weight, and uses a PC, but unfortunately, he still doesn't move much. In a feat of untold will, he has managed to link with IRC telepathically, so that he can sleep and chat with friends. Well, not really &amp;quot;friends&amp;quot;, more like people...that work and talk with other people....that they hate.&lt;br /&gt;
&lt;br /&gt;
Twisty has a great deal of telekenetic skill, as he refuses to move very much. Unfortunately, he is also very lazy, and telekenesis takes a lot of energy and concentration.&lt;br /&gt;
&lt;br /&gt;
Twisty also has the innate ability to see ghosts. At some point, he had orange hair, and was actually muscular, as his fat imploded into him due to the immense tidal forces, forming muscle somehow, and met some girl, stole her virginity and powerz, and got a kickass sword. Luckily for all humanity, some homeless guy named Aizen managed to steal the sword from him. In a fit of rage, Twisty locked himself in his basement. He has not come out since.&lt;br /&gt;
&lt;br /&gt;
For a detailed analysis of these events in Twisty's life, read the manga &amp;quot;Bleach&amp;quot;. While slightly exaggerated for marketing purpose, it is Twisty's teenage years. More or less.&lt;br /&gt;
&lt;br /&gt;
=== A average day with the Twisted One ===&lt;br /&gt;
All he does is sleep, masturbate, and communicate online. Thats it. Stop reading. Theres no more to tell! I'm serious!&lt;br /&gt;
&lt;br /&gt;
=== Twisty on virginity ===&lt;br /&gt;
Twisty will take your virginity. If you think this is impossible, because you've already lost yours, you are wrong.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Dead wrong &amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2063</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2063"/>
		<updated>2006-01-15T21:57:51Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions.&lt;br /&gt;
This story is, remarkably, about Twisty's birth:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From that moment on, not much changed. &lt;br /&gt;
&lt;br /&gt;
Twisty didn't move more than an inch until his tenth birthday, when he was plyed with alcohol to move towards a large peice of cake. This is also the day that Twisty became an orphan, as his parents were caught plying many young girls with alcohol, along with Twisty. In a feat of untold horror, the police uncovered an amount of child pornography that made the great egyptian pyramids look like mole hills.&lt;br /&gt;
&lt;br /&gt;
At this point, Twisty was over 500 pounds, and used a computer with OSX on it.&lt;br /&gt;
&lt;br /&gt;
Currently, Twisty is at a much more acceptable weight, and uses a PC, but unfortunately, he still doesn't move much. In a feat of untold will, he has managed to link with IRC telepathically, so that he can sleep and chat with friends. Well, not really &amp;quot;friends&amp;quot;, more like people...that work and talk with other people....that they hate.&lt;br /&gt;
&lt;br /&gt;
Twisty has a great deal of telekenetic skill, as he refuses to move very much. Unfortunately, he is also very lazy, and telekenesis takes a lot of energy and concentration.&lt;br /&gt;
&lt;br /&gt;
Twisty also has the innate ability to see ghosts. At some point, he had orange hair, and was actually muscular, as his fat imploded into him due to the immense tidal forces, forming muscle somehow, and met some girl, stole her virginity and powerz, and got a kickass sword. Luckily for all humanity, some homeless guy named Aizen managed to steal the sword from him. In a fit of rage, Twisty locked himself in his basement. He has not come out since.&lt;br /&gt;
&lt;br /&gt;
For a detailed analysis of these events in Twisty's life, read the manga &amp;quot;Bleach&amp;quot;. While slightly exaggerated for marketing purpose, it is Twisty's teenage years. More or less.&lt;br /&gt;
&lt;br /&gt;
=== A average day with the Twisted One ===&lt;br /&gt;
All he does is sleep, masturbate, and communicate online. Thats it. Stop reading. Theres no more to tell! I'm serious!&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2062</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2062"/>
		<updated>2006-01-15T21:54:14Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* A average day with the Twisted One */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions.&lt;br /&gt;
This story is, remarkably, about Twisty's birth:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From that moment on, not much changed. Twisty didn't move more than an inch until his tenth birthday, when he was plyed with alcohol to move towards a large peice of cake. This is also the day that Twisty became an orphan, as his parents were caught plying many young girls with alcohol, along with Twisty. In a feat of untold horror, the police uncovered an amount of child pornography that made the great egyptian pyramids look like mole hills.&lt;br /&gt;
&lt;br /&gt;
At this point, Twisty was over 500 pounds, and used a computer with OSX on it.&lt;br /&gt;
&lt;br /&gt;
Currently, Twisty is at a much more acceptable weight, and uses a PC, but unfortunately, he still doesn't move much. In a feat of untold will, he has managed to link with IRC telepathically, so that he can sleep and chat with friends. Well, not really &amp;quot;friends&amp;quot;, more like people...that work and talk with other people....that they hate.&lt;br /&gt;
&lt;br /&gt;
=== A average day with the Twisted One ===&lt;br /&gt;
All he does is sleep, masturbate, and communicate online. Thats it. Stop reading. Theres no more to tell! I'm serious!&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2061</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2061"/>
		<updated>2006-01-15T21:53:56Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions.&lt;br /&gt;
This story is, remarkably, about Twisty's birth:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From that moment on, not much changed. Twisty didn't move more than an inch until his tenth birthday, when he was plyed with alcohol to move towards a large peice of cake. This is also the day that Twisty became an orphan, as his parents were caught plying many young girls with alcohol, along with Twisty. In a feat of untold horror, the police uncovered an amount of child pornography that made the great egyptian pyramids look like mole hills.&lt;br /&gt;
&lt;br /&gt;
At this point, Twisty was over 500 pounds, and used a computer with OSX on it.&lt;br /&gt;
&lt;br /&gt;
Currently, Twisty is at a much more acceptable weight, and uses a PC, but unfortunately, he still doesn't move much. In a feat of untold will, he has managed to link with IRC telepathically, so that he can sleep and chat with friends. Well, not really &amp;quot;friends&amp;quot;, more like people...that work and talk with other people....that they hate.&lt;br /&gt;
&lt;br /&gt;
=== A average day with the Twisted One ===&lt;br /&gt;
All he does is sleep, masturbate, and communicate online. Thats it. Stop reading. Theres no more to tell!&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2060</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2060"/>
		<updated>2006-01-15T21:52:49Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions.&lt;br /&gt;
This story is, remarkably, about Twisty's birth:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From that moment on, not much changed. Twisty didn't move more than an inch until his tenth birthday, when he was plyed with alcohol to move towards a large peice of cake. This is also the day that Twisty became an orphan, as his parents were caught plying many young girls with alcohol, along with Twisty. In a feat of untold horror, the police uncovered an amount of child pornography that made the great egyptian pyramids look like mole hills.&lt;br /&gt;
&lt;br /&gt;
At this point, Twisty was over 500 pounds, and used a computer with OSX on it.&lt;br /&gt;
&lt;br /&gt;
Currently, Twisty is at a much more acceptable weight, and uses a PC, but unfortunately, he still doesn't move much. In a feat of untold will, he has managed to link with IRC telepathically, so that he can sleep and chat with friends. Well, not really &amp;quot;friends&amp;quot;, more like people...that work and talk with other people....that they hate.&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2059</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2059"/>
		<updated>2006-01-15T21:50:14Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions.&lt;br /&gt;
This story is, remarkably, about Twisty's birth:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From that moment on, not much changed. Twisty didn't move more than an inch until his tenth birthday, when he was plyed with alcohol to move towards a large peice of cake. &lt;br /&gt;
&lt;br /&gt;
At this point, Twisty was over 500 pounds, and used a computer with OSX on it.&lt;br /&gt;
&lt;br /&gt;
Currently, Twisty is at a much more acceptable weight, and uses a PC, but unfortunately, he still doesn't move much. In a feat of untold will, he has managed to link with IRC telepathically, so that he can sleep and chat with friends. Well, not really &amp;quot;friends&amp;quot;, more like people...that work and talk with other people....that they hate.&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2058</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2058"/>
		<updated>2006-01-15T21:49:56Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions.&lt;br /&gt;
This story is, remarkably, about Twisty's birth:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From that moment on, not much changed. Twisty didn't move more than an inch until his tenth birthday, when he was plyed with alcohol to move towards a large peice of cake. &lt;br /&gt;
&lt;br /&gt;
At this point, Twisty was over 500 pounds, and used a mac.&lt;br /&gt;
&lt;br /&gt;
Currently, Twisty is at a much more acceptable weight, and uses a PC, but unfortunately, he still doesn't move much. In a feat of untold will, he has managed to link with IRC telepathically, so that he can sleep and chat with friends. Well, not really &amp;quot;friends&amp;quot;, more like people...that work and talk with other people....that they hate.&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2056</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2056"/>
		<updated>2006-01-15T21:47:11Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2055</id>
		<title>User:Twistedeuphoria</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twistedeuphoria&amp;diff=2055"/>
		<updated>2006-01-15T21:46:59Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== TwistedEuphoria==&lt;br /&gt;
Euphoria, known as &amp;quot;Twisty&amp;quot; or &amp;quot;The twisted one&amp;quot; by his firneds (of whom you are NOT a part of), is an insane but quite lazy and lethargic man, who is also a basement dweller. He is the only person to date to have communicated over IRC without moving.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
From the moment he was born, Twisty's parents knew he would be a failure of epic proportions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
euphoriasai	once the doctor hit me and i didnt move&amp;lt;br&amp;gt;&lt;br /&gt;
euphoriasai	then i was like oh hey i should move&amp;lt;br&amp;lt;&lt;br /&gt;
euphoriasai	then i did&lt;br /&gt;
euphoriasai	true story&lt;br /&gt;
BAILOPAN	then you collapsed from exhaustion&lt;br /&gt;
euphoriasai	yeah that moving thing is overrated&lt;br /&gt;
&amp;lt;/pr&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1629</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1629"/>
		<updated>2006-01-15T03:33:00Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Average conversation with BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. Also, there was this guy that they all really hated, so they made him sacrifice himself, telling him some crap about how it would help them seal the fox into the child. Total bullshit. Anyway, that child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all for himself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him into a normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
=== Average conversation with BAILOPAN ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
[20:45] BAILOPAN: Stop there ... I don't support AMX&amp;lt;br&amp;gt;&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: awwww :-(&amp;lt;br&amp;gt;&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: could you help me though plz!!!&amp;lt;br&amp;gt;&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: this server is in memory of the victims of hurricane katrina&amp;lt;br&amp;gt;&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: do it for them! lol&amp;lt;br&amp;gt;&lt;br /&gt;
[20:46] BAILOPAN: I don't care if God commissioned the server&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I was here&lt;br /&gt;
: --[[User:Freecode|Freecode]] 17:36, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1628</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1628"/>
		<updated>2006-01-15T03:32:38Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. Also, there was this guy that they all really hated, so they made him sacrifice himself, telling him some crap about how it would help them seal the fox into the child. Total bullshit. Anyway, that child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all for himself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him into a normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
=== Average conversation with BAILOPAN ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
[20:45] BAILOPAN: Stop there ... I don't support AMX&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: awwww :-(&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: could you help me though plz!!!&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: this server is in memory of the victims of hurricane katrina&lt;br /&gt;
[20:45] uNDeR aGGeD PiMP: do it for them! lol&lt;br /&gt;
[20:46] BAILOPAN: I don't care if God commissioned the server&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I was here&lt;br /&gt;
: --[[User:Freecode|Freecode]] 17:36, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1515</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1515"/>
		<updated>2006-01-14T18:59:40Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. Also, there was this guy that they all really hated, so they made him sacrifice himself, telling him some crap about how it would help them seal the fox into the child. Total bullshit. Anyway, that child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him into a normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1511</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1511"/>
		<updated>2006-01-14T18:52:52Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him into a normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1503</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1503"/>
		<updated>2006-01-14T18:28:28Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1485</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1485"/>
		<updated>2006-01-14T18:02:39Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
[[Image:BAILOPAN.png|Theoretical picture of BAILOPAN]]&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1484</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1484"/>
		<updated>2006-01-14T17:59:00Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* What to do when you see a Wild BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1483</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1483"/>
		<updated>2006-01-14T17:58:48Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How to get BAILOPAN to release a bugfix on time ===&lt;br /&gt;
Sorry, its impossible. I'm still trying to do it - Melanie&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:57, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1482</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1482"/>
		<updated>2006-01-14T17:55:42Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location.&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1471</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1471"/>
		<updated>2006-01-14T17:35:33Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* What to do when you see a Wild BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|User:BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1470</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1470"/>
		<updated>2006-01-14T17:35:19Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* What to do when you see a Wild BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|BAILOPAN}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1469</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1469"/>
		<updated>2006-01-14T17:35:07Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Battling a Tam BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tame BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1468</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1468"/>
		<updated>2006-01-14T17:34:39Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== Battling a Tam BAILOPAN ===&lt;br /&gt;
Due to his demonic powers, as well as his l33t coding skillz, BAILOPAN is a challenging opponent.&lt;br /&gt;
&lt;br /&gt;
==== Battling in the physical realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Yams&lt;br /&gt;
** Turtles&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Fire&lt;br /&gt;
** Wind&lt;br /&gt;
** Beating-you-to-death-with-a-stick&lt;br /&gt;
&lt;br /&gt;
==== Battling in the digital realm ====&lt;br /&gt;
* BAILOPAN's weaknesses&lt;br /&gt;
** Timers&lt;br /&gt;
** Abstract Data Types&lt;br /&gt;
** Breasts&lt;br /&gt;
&lt;br /&gt;
* BAILOPAN's strengths&lt;br /&gt;
** Dodging deadlines&lt;br /&gt;
** Abusive commentary&lt;br /&gt;
** Beating-you-to-death-with-bugs&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1466</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1466"/>
		<updated>2006-01-14T17:27:22Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Abilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
* Can be lured with Yams&lt;br /&gt;
* Has an insatiable lust for turtles&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1465</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1465"/>
		<updated>2006-01-14T17:26:59Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Abilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
* Number one annoying idiot ninja&lt;br /&gt;
** Sorry, Naruto again.&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:Twilight_Suzuka&amp;diff=1464</id>
		<title>User:Twilight Suzuka</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:Twilight_Suzuka&amp;diff=1464"/>
		<updated>2006-01-14T17:25:55Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Twilight Suzuka, Coder amongst Nooblets.&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1463</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1463"/>
		<updated>2006-01-14T17:25:23Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, battling the evil Microsoft empire for control of their megahurtz, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1462</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1462"/>
		<updated>2006-01-14T17:23:24Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Abilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
* Can teleport to a location where people cannot bug him about the new AMX Mod X version&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1461</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1461"/>
		<updated>2006-01-14T17:21:42Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* What to do when you see a Wild BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|Bailopan scares me shitless|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1460</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1460"/>
		<updated>2006-01-14T17:21:14Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* What to do when you see a Wild BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|&amp;quot;Bailopan scares me shitless&amp;quot;|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1459</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1459"/>
		<updated>2006-01-14T17:20:47Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* What to do when you see a Wild BAILOPAN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
As Gaben once said:  {{Gaben|&amp;lt;text&amp;gt;|&amp;lt;source&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1458</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1458"/>
		<updated>2006-01-14T17:19:43Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Childhood */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1457</id>
		<title>User:BAILOPAN (What)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:BAILOPAN_(What)&amp;diff=1457"/>
		<updated>2006-01-14T17:19:33Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
== BAILOPAN ==&lt;br /&gt;
BAILOPAN, official leader of the AMX Mod X developement team, as of his overthrow of the SniperBeamer.&lt;br /&gt;
He is ready to move to a more defensible location&lt;br /&gt;
&lt;br /&gt;
=== Childhood ===&lt;br /&gt;
When BAILOPAN was small, his village had to combat a giant nine tailed fox. They decided to simply seal it into a small child, so that they wouldn't have to deal with it for a while, and they could scorn the child. That child...was BAILOPAN. Er...Naruto. Sorry.&lt;br /&gt;
&lt;br /&gt;
BAILOPAN, raised by wolves and ...demons... quickly raised high into the ranks of Microsoft, eventually being thrown down from the tallest Microsoft building, so that Bill Gates could continue to keep his unholy regime all fo rhimself. Hoping that the fall would cripple or even kill the unholy child, Bill Gates also threw pennies at him from hundreds of yard in the air, in an attempt to kill of BAILOPAN.&lt;br /&gt;
&lt;br /&gt;
He failed.&lt;br /&gt;
&lt;br /&gt;
After several mission impossible -esq missions, BAILOPAN decided that the only way to deal with this was to forget it. Using his chakra, he burninated the part of his brain with the memories, thus rendering him intoa  normal child. &lt;br /&gt;
&lt;br /&gt;
Until, of course, the day he found Admin Mod...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abilities ===&lt;br /&gt;
BAILOPAN has several key abilities:&lt;br /&gt;
* Ability to outrun speeding trains.&lt;br /&gt;
* Can dodge bullets at will.&lt;br /&gt;
* Chuck Norris is afraid of him&lt;br /&gt;
* He can fly!&lt;br /&gt;
** Wait, that is SuperMan&lt;br /&gt;
* He can break code like no tomarrow!&lt;br /&gt;
* Ability to dodge deadlines in a single bound!&lt;br /&gt;
&lt;br /&gt;
Disadvantages:&lt;br /&gt;
* Timers illude him&lt;br /&gt;
* He is confused by bright lights&lt;br /&gt;
* Has an insatiable taste for megahurtz&lt;br /&gt;
&lt;br /&gt;
=== What to do when you see a Wild BAILOPAN ===&lt;br /&gt;
Kiss your ass goodbye, because you sir, are dead.&lt;br /&gt;
&lt;br /&gt;
[[User:Twilight Suzuka|Twilight Suzuka]] 12:19, 14 January 2006 (EST)&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Help:Editing&amp;diff=1456</id>
		<title>Help:Editing</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Help:Editing&amp;diff=1456"/>
		<updated>2006-01-14T17:16:34Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To read more about editing a wiki, see the MediaWiki editing documentation here: [http://meta.wikimedia.org/wiki/Help:Editing MediaWiki Editing]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Help:Editing&amp;diff=1455</id>
		<title>Help:Editing</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Help:Editing&amp;diff=1455"/>
		<updated>2006-01-14T17:16:08Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To read more about editing a wiki, see the MediaWiki editing documentation here: [http://meta.wikimedia.org/wiki/Help:Editing MediaWiki Editing]&lt;br /&gt;
&lt;br /&gt;
{{H:h|editor toc}}&lt;br /&gt;
This Editing Overview has a lot of '''[[w:wikitext|wikitext]]''' examples. You may want to keep this page open in a separate browser window for reference while you edit.&lt;br /&gt;
&lt;br /&gt;
Each of the topics covered here is covered somewhere else in more detail.  Please look in the box on the right for the topic you are interested in.&lt;br /&gt;
== Editing basics ==&lt;br /&gt;
&lt;br /&gt;
;Start editing&lt;br /&gt;
:To start editing a [[w:MediaWiki|MediaWiki]] page, click on the &amp;quot;'''Edit this page'''&amp;quot; (or just &amp;quot;'''edit'''&amp;quot;) link at one of its edges. This will bring you to the '''edit page''': a page with a text box containing the ''[[w:wikitext|wikitext]]'': the editable source code from which the server produces the webpage. ''If you just want to experiment, please do so in the [[{{ns:4}}:Sandbox|sandbox]], not here''.&lt;br /&gt;
&lt;br /&gt;
;Summarize your changes&lt;br /&gt;
:You should write a short [[Help:Edit summary|edit summary]] in the small field below the edit-box. You may use shorthand to describe your changes, as described in the [[{{ns:4}}:Edit summary legend|legend]].&lt;br /&gt;
&lt;br /&gt;
;Preview before saving&lt;br /&gt;
:When you have finished, press [[Help:Show preview|preview]] to see how your changes will look -- '''before''' you make them permanent.  Repeat the edit/preview process until you are satisfied, then click &amp;quot;Save&amp;quot; and your changes will be immediately applied to the article.&lt;br /&gt;
&lt;br /&gt;
{{:Help:Wikitext quick reference}} &amp;lt;!-- Edit this at [[Help:Wikitext quick reference]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{:Help:Editing tips and tricks}} &amp;lt;!-- Edit this at [[Help:Editing tips and tricks]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Minor edits ==&lt;br /&gt;
&lt;br /&gt;
A [[Help:Logging in|logged-in]] user can mark an edit as &amp;quot;minor&amp;quot;. [[Help:Minor edit|Minor edit]]s are generally spelling corrections, formatting, and minor rearrangement of text. Users may choose to ''hide'' minor edits when viewing [[Help:Recent changes|Recent Changes]].&lt;br /&gt;
&lt;br /&gt;
Marking a significant change as a minor edit is considered bad Wikiquette. If you have accidentally marked an edit as minor, make a [[Help:Dummy edit|dummy edit]], verify that the &amp;quot;&amp;lt;small&amp;gt;'''[&amp;amp;nbsp;] This is a minor edit'''&amp;lt;/small&amp;gt;&amp;quot; check-box is unchecked, and explain in the edit summary that the previous edit was not minor.&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[Help:Editing FAQ]]&lt;br /&gt;
*[[Help:Automatic conversion of wikitext]]&lt;br /&gt;
*[[Help:Calculation]]&lt;br /&gt;
*[[Help:Editing toolbar]]&lt;br /&gt;
*[[Help:HTML in wikitext]]&lt;br /&gt;
*[[Help:Administration#Page_protection| Protecting pages]]&lt;br /&gt;
*[[Help:Starting a new page]]&lt;br /&gt;
*[[Help:Variable]]&lt;br /&gt;
*[[w:UseModWiki|UseModWiki]] and [[w:Wikipedia:PHP script|Wikipedia:PHP script]].&lt;br /&gt;
*[[w:HTML element|HTML elements]].&lt;br /&gt;
*[[w:en:User:Pilaf/Live Preview|Live preview]] - a way to preview your edits without contacting the server.&lt;br /&gt;
*[[:Image:Special characters Verdana IE.png]] - shows special characters with codes, and also shows problem characters.&lt;br /&gt;
*{{tim|fs}} - font size&lt;br /&gt;
*{{tim|co}} - color&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
*[http://home.earthlink.net/~awinkelried/keyboard_shortcuts.html Special characters in HTML]   &lt;br /&gt;
{{h:f|enname=Editing}}&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Scripting_Commands_(AMX_Mod_X)&amp;diff=1400</id>
		<title>Scripting Commands (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Scripting_Commands_(AMX_Mod_X)&amp;diff=1400"/>
		<updated>2006-01-14T14:11:03Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Function Reference]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Scripting_Cvars_(AMX_Mod_X)&amp;diff=1396</id>
		<title>Scripting Cvars (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Scripting_Cvars_(AMX_Mod_X)&amp;diff=1396"/>
		<updated>2006-01-14T14:07:52Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CVARs, or Console VARiables, are an easy and effecient way to incorporate user defined variations within code. Internally, all CVAR's are stored as strings, but can be recovered in any format.&lt;br /&gt;
&lt;br /&gt;
CVARs come in two flavors: server and client.&lt;br /&gt;
&lt;br /&gt;
== Server Side CVARs ==&lt;br /&gt;
Server side CVARs are stored within the HL1 engine, and can be altered through server console commands. &lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
Server side CVARs are easy to create and manipulate.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;register_cvar(const name[],const string[],flags = 0,Float:fvalue = 0.0);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: The last parameter is for backwards compatibility only, and serves no purpose in AMXx.&lt;br /&gt;
It is recommended you register CVARs during &amp;lt;tt&amp;gt;plugin_init&amp;lt;/tt&amp;gt;, so that other plugins may alter them at &amp;lt;tt&amp;gt;plugin_cfg&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Parameters:&lt;br /&gt;
** name[] : The name of the CVAR you want to register&lt;br /&gt;
** string[] : The default value of the CVAR&lt;br /&gt;
** flags : See [[CVARs in AMXx#flags]].&lt;br /&gt;
&lt;br /&gt;
==== Getting Value ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
/* Gets a cvar float. */&lt;br /&gt;
Float:get_cvar_float(const cvarname[]);&lt;br /&gt;
&lt;br /&gt;
/* Gets a cvar integer value. */&lt;br /&gt;
get_cvar_num(const cvarname[]);&lt;br /&gt;
&lt;br /&gt;
/* Reads a cvar value. */&lt;br /&gt;
get_cvar_string(const cvarname[],output[],iLen);&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
==== Setting Value ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
/* Sets a cvar to given value. */&lt;br /&gt;
set_cvar_string(const cvar[],const value[]);&lt;br /&gt;
&lt;br /&gt;
/* Sets a cvar to given float. */&lt;br /&gt;
set_cvar_float(const cvar[],Float:value);&lt;br /&gt;
&lt;br /&gt;
/* Sets a cvar with integer value. */&lt;br /&gt;
set_cvar_num(const cvarname[],value);&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
==== Flags ====&lt;br /&gt;
&lt;br /&gt;
These flags can be used for the third parameter in the &amp;lt;tt&amp;gt;register_cvar&amp;lt;/tt&amp;gt; native:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
/* Flags for register_cvar() */&lt;br /&gt;
#define	FCVAR_ARCHIVE		1	/* set to cause it to be saved to vars.rc */&lt;br /&gt;
#define	FCVAR_USERINFO		2	/* changes the client's info string */&lt;br /&gt;
#define	FCVAR_SERVER		4	/* notifies players when changed */&lt;br /&gt;
#define FCVAR_EXTDLL		8	/* defined by external DLL */&lt;br /&gt;
#define FCVAR_CLIENTDLL		16	/* defined by the client dll */&lt;br /&gt;
#define FCVAR_PROTECTED		32	/* It's a server cvar, but we don't send the data since it's a password, etc.  Sends 1 if it's not bland/zero, 0 otherwise as value */&lt;br /&gt;
#define FCVAR_SPONLY		64	/* This cvar cannot be changed by clients connected to a multiplayer server. */&lt;br /&gt;
#define FCVAR_PRINTABLEONLY	128	/* This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). */&lt;br /&gt;
#define FCVAR_UNLOGGED		256	/* If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log */&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One may also alter these flags dynamically, using the flag natives:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
/* Returns a cvar flags. */&lt;br /&gt;
get_cvar_flags(const cvar[]);&lt;br /&gt;
&lt;br /&gt;
/* Sets a cvar flags (not allowed for amx_version,&lt;br /&gt;
* fun_version and sv_cheats cvars). */&lt;br /&gt;
set_cvar_flags(const cvar[],flags);&lt;br /&gt;
&lt;br /&gt;
/* Removes a cvar flags (not allowed for amx_version,&lt;br /&gt;
* fun_version and sv_cheats cvars). */&lt;br /&gt;
remove_cvar_flags(const cvar[],flags = -1);&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These allow you to dynamically alter flags; dynamic protection, dynamic logging, etc etc.&lt;br /&gt;
&lt;br /&gt;
== Client Side CVARs ==&lt;br /&gt;
Client side CVARs, like server side CVARs, allow bits of code to be dynamic. However, since they are in the client, we cannot create such CVARs, only alter them.&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
&lt;br /&gt;
==== Setting ====&lt;br /&gt;
Setting a client side CVAR is easy; execute a new value onto the client:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;client_cmd(player_id,&amp;quot;cvar value&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Getting ====&lt;br /&gt;
Recently, VALVE added a client CVAR checking interface, which has been added to AMXx:&lt;br /&gt;
&lt;br /&gt;
// Dispatches a client cvar query&lt;br /&gt;
//  id: Player id&lt;br /&gt;
//  cvar: cvar name&lt;br /&gt;
//  resultFunc: public handler function&lt;br /&gt;
//  paramLen + params: optional array parameter&lt;br /&gt;
// resultFunc looks like:&lt;br /&gt;
//  public callbackCvarValue(id, const cvar[], const value[])&lt;br /&gt;
// or if you use the optional parameter:&lt;br /&gt;
//  public callbackCvarValue(id, const cvar[], const value[], const param[])&lt;br /&gt;
query_client_cvar(id, const cvar[], const resultFunc[], paramlen=0, const params[] = &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
This native may appear daunting, but it is actually quite simple; the first parameter is the player, the second the CVAR, the third the function called which will contain the client CVAR, and the last two are for allowing the passage of strings.&lt;br /&gt;
&lt;br /&gt;
If you wish to get an array or strting back, simply put the length you want it, and fill params will a value. Then, in your return function, you will receive an array.&lt;br /&gt;
&lt;br /&gt;
==== Locking ====&lt;br /&gt;
&lt;br /&gt;
Unfortunately, the client can change CVAR values back, unless we lock them. Since alias's are executed before CVARs, we can create an alias of the same name of the CVAR, thus locking the CVAR:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; CVAR: cvar_ex.&amp;lt;br&amp;gt;&lt;br /&gt;
client_cmd(player_id,&amp;quot;cvar_ex 1&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
client_cmd(player_id,&amp;quot;;alias cvar_ex&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the CVAR cannot be changed by the player or the server; it is locked.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AMXx Core]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1383</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1383"/>
		<updated>2006-01-14T05:35:09Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array - Array&lt;br /&gt;
; Keytable - Vault&lt;br /&gt;
; Hashtable - Fastest Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1382</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1382"/>
		<updated>2006-01-14T05:34:54Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Fastest Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1381</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1381"/>
		<updated>2006-01-14T05:34:40Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Disable Check */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1380</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1380"/>
		<updated>2006-01-14T05:34:24Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* &amp;amp;success */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1379</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1379"/>
		<updated>2006-01-14T05:34:07Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* &amp;amp;success */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1378</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1378"/>
		<updated>2006-01-14T05:33:54Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Generic functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
&lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1377</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1377"/>
		<updated>2006-01-14T05:33:42Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Generic functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
&lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1376</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1376"/>
		<updated>2006-01-14T05:33:33Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Generic functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
&lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1375</id>
		<title>Array Module (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Array_Module_(AMX_Mod_X)&amp;diff=1375"/>
		<updated>2006-01-14T05:32:21Z</updated>

		<summary type="html">&lt;p&gt;Twilight Suzuka: /* Empty Index Searching */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array module, created and maintained by Twilight Suzuka and Anpheus, brings fast, easy, and effecient dynamic storage into PAWN coding. &lt;br /&gt;
&lt;br /&gt;
It is essential for many tasks, such as copying entities and is useful in a great many applications, mainly because of how it overcomes PAWN's static nature.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
The original Array module, first written by BAILOPAN for AMXx 1.0, used a vector (or dynamic array) system to create &amp;quot;lists&amp;quot; and &amp;quot;tables&amp;quot;. Its implimentation, a hard to understand and convoluted system which daunted many coders, would have nevertheless been very successful if not for a few key factors: It crashed on unload and reload.&lt;br /&gt;
&lt;br /&gt;
While using this module, for the purposes of creating a customized vault system, Twilight Suzuka discovered these flaws, and investigated. She, along with her good friend Anpheus, pointed out said errors, and fixed a great deal of them. Unsatisfied, Twilight Suzuka created the ArrayX module, using a dual linked list system of implimentation. &lt;br /&gt;
&lt;br /&gt;
While the ArrayX module did work, and did work well, providing a simple (if &amp;quot;not professional&amp;quot; as Anpheus would say) interface to a simple dynamic array. Sparce, relatively quick, and offering a tri-unit storage (three different types: float, string, integer: per index), ArrayX worked relatively well. However, as BAILOPAN was quick to point out, it utilized an ineffecient linked list design.&lt;br /&gt;
&lt;br /&gt;
While searching for an appropriately sparce vector design for the new ArrayX, Anpheus chanced upon the Judy library. It offered unparrallel speed, effeciency, and sparce capabilities compared to any other system we could find. Implimenting Judy's trie design, they created ArrayX 2.0, which was basically the same then as it is now. It was eventually implimented into the CVS.&lt;br /&gt;
&lt;br /&gt;
== Description ==&lt;br /&gt;
Array module, originally ArrayX, provides dynamic storage units in the form of three generic ''types'': Array, Keytable, Hashtable.&lt;br /&gt;
&lt;br /&gt;
While each of these types are carefully disguised to make them easier to use, the back bone of Array module is the Judy library, which uses a trie implimentation to allow for sparce and effecient data structures.&lt;br /&gt;
&lt;br /&gt;
In effect, all three units allow for sparce settings, as well as providing huge speed and memory increases over other implimentations.&lt;br /&gt;
&lt;br /&gt;
=== Arrays ===&lt;br /&gt;
&lt;br /&gt;
Arrays are the simplest unit provided by Array module. They function almost exactly like their static counterpart, the traditional array, but are dynamic.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to an integer key. &lt;br /&gt;
* Allows: Advanced Searching, Saving/Loading&lt;br /&gt;
* Useful for array-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   They do not have upper bounds; you can write to any index.&lt;br /&gt;
##   They can be sparce; you may write to any index, anywhere, and not waste the space between the two.&lt;br /&gt;
##   Easy to use natives for several important features, such as searching and saving/loading.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Slightly more difficult to use.&lt;br /&gt;
##   Slightly slower, slightly less memory effecient than generic arrays.&lt;br /&gt;
&lt;br /&gt;
=== Keytables ===&lt;br /&gt;
&lt;br /&gt;
Keytables are Array modules counter-part to an advanced vault that allows searching.&lt;br /&gt;
While they are not nearly as fast as hashtables, they allow for searching, and are significantly faster than any other vault like structure available through AMXx, over amortized time.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Method : bind a value to a string key. &lt;br /&gt;
* Allows: Searching, Saving/Loading&lt;br /&gt;
* Useful for vault-like programming.&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, and can be searched.&lt;br /&gt;
##   Has searching and saving/loading natives.&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   Less effecient than hashtables.&lt;br /&gt;
&lt;br /&gt;
=== Hashtables ===&lt;br /&gt;
&lt;br /&gt;
Hashtables work as generic vaults; you cannot search through them.&lt;br /&gt;
However, they are much faster than any other data structure available through AMXx that allows for assosiative array properties.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Basics:&amp;lt;/tt&amp;gt;&lt;br /&gt;
; Method : bind a value to a string key, decompiled through a hash.&lt;br /&gt;
; Allows: Fastest possible retreival.&lt;br /&gt;
; Useful for vault-like programming and fast retreival&lt;br /&gt;
&lt;br /&gt;
# Advantages:&lt;br /&gt;
##   Allows for simplified storage of vault-like values.&lt;br /&gt;
##   Are extremely fast, faster than typical vectors with amortized cost&lt;br /&gt;
##   Did we mention they are fast?&lt;br /&gt;
&lt;br /&gt;
# Disadvantages:&lt;br /&gt;
##   No searching.&lt;br /&gt;
##   Potential for memory leaks.&lt;br /&gt;
##   No saving/loading&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
It is very simple to use Array Module, as the natives were created for ease of use.&lt;br /&gt;
Think of them in terms of the generic units you already know, and you will be set:&lt;br /&gt;
&lt;br /&gt;
'''Dynamic vs Generic''':&lt;br /&gt;
; Array : Array&lt;br /&gt;
; Keytable : Vault&lt;br /&gt;
; Hashtable : Vault&lt;br /&gt;
&lt;br /&gt;
=== Persistance ===&lt;br /&gt;
Dynamic units must be deallocated or deleted when you are done using them if the scope is local; they will not be deleted at the end of the function they were created in, and thus will be a memory leak if you no longer have a reference to them.&lt;br /&gt;
&lt;br /&gt;
=== Generic Conventions ===&lt;br /&gt;
Array Module uses a few conventions which may be difficult to understand at first, but which are quite easy to understand once the reasons behind them are understood.&lt;br /&gt;
&lt;br /&gt;
==== Disable Check ====&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;quot;disable_check&amp;quot; will disable internal checking, and is not recommended.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;disable_check = 0&amp;quot; is present as a parameter in a great deal of Array functions.&lt;br /&gt;
&lt;br /&gt;
Checking is done internally, and by changing this to 1, you turn off the internal checking.&lt;br /&gt;
Typically, this is looked upon as bad form; however, it is nessasary in a few situations, such as:&lt;br /&gt;
&lt;br /&gt;
* Checking an index that does not yet exist for a value.&lt;br /&gt;
&lt;br /&gt;
Most of these instances are bad form; a more air tight method is possible and recommended.&lt;br /&gt;
As the default value is '0', it is highly recommended that it remain 0; however, it is true that setting the value to 1 will render a slightly higher speed of checking.&lt;br /&gt;
&lt;br /&gt;
As disabling checking may result in a crash, it is inadvised that it be set to 1 unless ones code is flawless.&lt;br /&gt;
&lt;br /&gt;
==== &amp;amp;success ====&lt;br /&gt;
&amp;lt;tt&amp;gt; The success parameter is set to 1 on success of internal functions. Do not set it to a constant.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If checking is enabled, this parameter may turn to 0 due to internal checking errors. If a value was returned, it will typically be NULL (0).&lt;br /&gt;
&lt;br /&gt;
Success does not nessasarily have to be passed; leaving it as default is perfectly fine, though inadvisable. &lt;br /&gt;
&lt;br /&gt;
It is highly recommended that all of your code include success checks, just in case.&lt;br /&gt;
&lt;br /&gt;
==== Generic functions ====&lt;br /&gt;
&amp;lt;tt&amp;gt; All Array Module functions use the same basic format for similar natives between types &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, similar functions between the three types have the same style of usage, format, and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new MyArray = array_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyKeytable = keytable_create();&amp;lt;br&amp;gt;&lt;br /&gt;
new MyHashtable = hashtable_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To reduce the size of this page, these specifications have been created:&lt;br /&gt;
&lt;br /&gt;
*The symbol '*' is used to represent 'array', 'keytable', and 'hashtable'.&lt;br /&gt;
&lt;br /&gt;
The above code reduces to:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
new My* = *_create();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Recognize these shortcuts will not work in actual code; they are used to reduce the size of this document.&lt;br /&gt;
&lt;br /&gt;
Always be sure to clean them up.&lt;br /&gt;
&lt;br /&gt;
=== Unit manipulation ===&lt;br /&gt;
These natives allow for manipulation of the dynamic unit structures themselves.&lt;br /&gt;
&lt;br /&gt;
==== Creation ====&lt;br /&gt;
&lt;br /&gt;
The basic native for creating dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_create( arrayid = 0, reserve_id = 0)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The parameters are for backwards compatibility only; they have no true purpose now. They were once used as a form of hard coded communication; you may create a unit with a specified id number, or reserve a specific id number for generic usage. Neither are needed anymore.&lt;br /&gt;
&lt;br /&gt;
The id number that this returned must be stored in some fashion; if it is not, the unit will persist and become a memory leak.&lt;br /&gt;
&lt;br /&gt;
==== Deletion ====&lt;br /&gt;
&lt;br /&gt;
The basic native for deleting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_delete( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will completely destroy the unit; you will no longer be able to use it at all, and will receive an error if you attempt to.&lt;br /&gt;
&lt;br /&gt;
==== Reset ====&lt;br /&gt;
&lt;br /&gt;
The basic native for resetting dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_clear( arrayid )&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will remove all indexs from the unit, but leave it intact, allowing you to reuse it.&lt;br /&gt;
&lt;br /&gt;
==== Memory ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of memory used by a unit is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_memory (arrayid, disable_check = 0); &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will tell you exactly how much memory has been allocated within the unit, including its own overhead. Useful for debugging.&lt;br /&gt;
&lt;br /&gt;
==== Count ====&lt;br /&gt;
&lt;br /&gt;
The basic native for retreiving the amount of units in existance is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_count( start = 0, stop = -1);&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will state the amount of units of the specified type in existance; as they are created in sequence, this can also be used to find out the ids of the availiable units.&lt;br /&gt;
&lt;br /&gt;
=== Index manipulation ===&lt;br /&gt;
All index manipulation natives include the ''disable_check'' parameter; it has been excluded for the purpose of simplification.&lt;br /&gt;
&lt;br /&gt;
==== Set ====&lt;br /&gt;
&lt;br /&gt;
The basic native for setting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_set_(type)(arrayid, index, (type)value)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
&lt;br /&gt;
==== Get ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting values to dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_get_(type)(arrayid, index, (type)value, ret_val)&lt;br /&gt;
&lt;br /&gt;
Where (type) is the type of value you want to set.&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Types available: int, float, string, vector.&lt;br /&gt;
Note: With hashtables, types have been cut down for compatibility.&lt;br /&gt;
Note: For floats and integers, there is no ret_val parameter; the native returns the value directly.&lt;br /&gt;
&lt;br /&gt;
==== Remove ====&lt;br /&gt;
&lt;br /&gt;
The basic native for removing indexs completely is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_remove (arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Removing an index will recover the memory used by it. That index must be reallocated to use again.&lt;br /&gt;
&lt;br /&gt;
==== Filled ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isfilled(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index exists.&lt;br /&gt;
&lt;br /&gt;
==== Empty ====&lt;br /&gt;
&lt;br /&gt;
The basic native for getting conformation of indexs in dynamic units is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_isempty(arrayid, index)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will return 1 if the index does not exist.&lt;br /&gt;
&lt;br /&gt;
=== Unit Specific Natives ===&lt;br /&gt;
Some functions are not available to some units, due to the incompatibilities between them.&lt;br /&gt;
&lt;br /&gt;
==== Saving/Loading ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables and arrays support it fully.&lt;br /&gt;
&lt;br /&gt;
===== Saving =====&lt;br /&gt;
This native allows an array or keytable to be directly saved to a file specified:&lt;br /&gt;
&lt;br /&gt;
*_save (arrayid, filename[], disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
===== Loading =====&lt;br /&gt;
This native allows an array or keytable to be loaded directly from a file.&amp;lt;br&amp;gt;&lt;br /&gt;
If an arrayid is provided, the file will be loaded into that unit; if not, it will load into a new unit, and return its id.&lt;br /&gt;
&lt;br /&gt;
*_load (filename[], arrayid = 0, reserve_id = 0);&lt;br /&gt;
&lt;br /&gt;
===== Convert =====&lt;br /&gt;
This native will convert a binary file into a human readable file:&lt;br /&gt;
&lt;br /&gt;
*_save_ascii(inputfile[], outputfile[]);&lt;br /&gt;
&lt;br /&gt;
==== Searching ====&lt;br /&gt;
Hashtables lack this feature entirely, while keytables have limited searching capabilities, and arrays has advanced capabilities in searching.&lt;br /&gt;
&lt;br /&gt;
===== Filled Index Searching =====&lt;br /&gt;
These functions allow the coder to search through filled indexs in arrays and keytables.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_first (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_next (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prev (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_last (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: in keytables and hashtables, index will be a string.&lt;br /&gt;
&lt;br /&gt;
===== Empty Index Searching =====&lt;br /&gt;
These functions allow the coder to search through empty indexs in arrays.&lt;br /&gt;
These functions do not garantee success, so it is recommended that the success parameter be checked.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;*_firstempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_nextempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_prevempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
*_lastempty (arrayid, index, &amp;amp;success = 0);&lt;br /&gt;
Index parameter: Starting index.&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Array Information ====&lt;br /&gt;
Arrays have two additional natives, which allow for retreival of additional information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Get the size of the array from one index to another &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_size (arrayid, start = 0, stop = -1, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; Return the nth filled index, starting at ''start'' &amp;lt;/tt&amp;gt;&lt;br /&gt;
*array_get_nth (arrayid, n, start = 0, disable_check = 0);&lt;br /&gt;
&lt;br /&gt;
== Unit Compression ==&lt;br /&gt;
As one might notice, an entire dynamic unit is referenced by an integer value. This allows one to create a number of significant structures:&lt;br /&gt;
&lt;br /&gt;
* Units of Units:&lt;br /&gt;
** Storing the references to units into an array, allowing for two dimension dynamic unit storage and retreival&lt;br /&gt;
** Use of a keytable and hashtable in congunction to enhance th eproperties of both - faster gets + searching and saving -&lt;br /&gt;
** Dynamic storage of: functions, units, and much more&lt;br /&gt;
&lt;br /&gt;
The most powerful of these is to create a global variable of type 'public', and use it to reference a dynamic unit. Now any plugin may access that unit as if it was their own, with little to no cost.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Extended Modules]]&lt;/div&gt;</summary>
		<author><name>Twilight Suzuka</name></author>
		
	</entry>
</feed>