<?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=UserError</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=UserError"/>
	<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/Special:Contributions/UserError"/>
	<updated>2026-05-06T18:45:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.6</generator>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3977</id>
		<title>AMX Mod X 1.76 Changes</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=AMX_Mod_X_1.76_Changes&amp;diff=3977"/>
		<updated>2007-03-10T01:16:31Z</updated>

		<summary type="html">&lt;p&gt;UserError: Removed duplicated change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;AMX Mod X 1.76 is a small feature release and contains mostly bug fixes.&lt;br /&gt;
AMX Mod X 1.76a through 1.76d are small bug-fix releases to patch up problems with 1.76.&lt;br /&gt;
This changelog is brought to you by Batman and ramen.&lt;br /&gt;
&lt;br /&gt;
=New Plugin File Features=&lt;br /&gt;
==Per-Map Plugin Files==&lt;br /&gt;
You can now have per-map plugin configuration files.  AMX Mod X will automatically load any plugins listed in files having the following name: &amp;lt;tt&amp;gt;configs/maps/plugins-&amp;lt;map&amp;gt;.ini&amp;lt;/tt&amp;gt;.  Thus, &amp;lt;tt&amp;gt;de_dust&amp;lt;/tt&amp;gt; specific plugins will be loaded from &amp;lt;tt&amp;gt;configs/maps/plugins-de_dust.ini&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Map-specific plugin files are parsed &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; the main plugins.ini is parsed, and &amp;lt;b&amp;gt;after&amp;lt;/b&amp;gt; all secondary plugins-*.ini files are parsed in the &amp;lt;tt&amp;gt;configs&amp;lt;/tt&amp;gt; folder.  This means that a map-specific plugin listing inherits all settings above itself.&lt;br /&gt;
&lt;br /&gt;
==Disabling Plugins==&lt;br /&gt;
A second feature was introduced to let users &amp;lt;i&amp;gt;disable&amp;lt;/i&amp;gt; plugins per map.  In any plugins-*.ini file, you may now add a &amp;quot;disabled&amp;quot; flag to a plugin name.  This works like the &amp;quot;debug&amp;quot; flag.  Example:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
gaben.amxx disabled&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will block the plugin from being loaded from any other configuration file.  So if &amp;lt;tt&amp;gt;plugins-de_dust.ini&amp;lt;/tt&amp;gt; has the example line above, &amp;lt;tt&amp;gt;gaben.amxx&amp;lt;/tt&amp;gt; will not be loaded from any other plugins file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=New Scripting Features=&lt;br /&gt;
==Sorting==&lt;br /&gt;
AMX Mod X now has a comprehensive array sorting solution.  You can sort using pre-defined array types, or use your own custom comparison functions.  All of the sorting routines use the qsort() function from the C standard library, which is based on the [http://linux.wku.edu/~lamonml/algor/sort/quick.html Quick Sort] algorithm.  &lt;br /&gt;
&lt;br /&gt;
===Basic Sorting===&lt;br /&gt;
The follow basic sorting natives were added.  These natives sort an array in-place using pre-defined comparison routines.  You can change the sorting order using an optional third parameter.  By default it is &amp;lt;tt&amp;gt;Sort_Ascending&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;Sort_Descending&amp;lt;/tt&amp;gt; is available as well.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1115 SortIntegers]()&amp;lt;/tt&amp;gt; - Sorts an array of integers.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1116 SortFloats]()&amp;lt;/tt&amp;gt; - Sorts an array of floats.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1117 SortStrings]()&amp;lt;/tt&amp;gt; - Sorts an array of strings.&lt;br /&gt;
&lt;br /&gt;
===Custom Sorting===&lt;br /&gt;
Furthermore, you can also define your own custom comparison functions and have the sorting algorithm run them for you.  This can be useful in a variety of ways.  For example, if you have an array of players and an array of those player's skills, you can easily sort the player ids by skill using this feature.  &lt;br /&gt;
&lt;br /&gt;
Custom sorting requires making a function which compares two elements of your array.  Given elements e1 and e2:&lt;br /&gt;
*Return -1 to mean &amp;quot;e1 comes before e2&amp;quot;&lt;br /&gt;
*Return 0 to mean &amp;quot;e1 is equal to e2&amp;quot;&lt;br /&gt;
*Return 1 to mean &amp;quot;e1 comes after e2&amp;quot;&lt;br /&gt;
For example, a very simple formula to compare integers in this manner is: &amp;lt;tt&amp;gt;e1 - e2&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The custom sorting natives are:&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1118 SortCustom1D]()&amp;lt;/tt&amp;gt; - Sorts a 1D array given a custom comparison function.&lt;br /&gt;
*&amp;lt;tt&amp;gt;[http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=1119 SortCustom2D]()&amp;lt;/tt&amp;gt; - Sorts a 2D array given a custom comparison function.&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
You can see an example of each native listed above in the [http://svn.tcwonline.org/viewvc.cgi/trunk/plugins/testsuite/sorttest.sma?root=amxmodx&amp;amp;view=log sorting testing] plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.76d Changelog=&lt;br /&gt;
1.76d is a pending bug-fix release to the 1.76 branch.&lt;br /&gt;
==Core Changes==&lt;br /&gt;
*Core will now refuse to load plugins which violate the AMX Mod X license by not giving users the right to copy and modify source code under the GPL.&lt;br /&gt;
*Fixed a bug where '%c' did not correctly count toward string lengths.  This resulted in problems with certain format(), vformat(), and vdformat() uses.&lt;br /&gt;
*Fixed {{Bug|41}}: Disabled items could sometimes be selected on menus when drawn with the newmenu system.&lt;br /&gt;
*Fixed {{Bug|35}}: Plugins could be loaded twice if they were duplicated in or across plugins files.&lt;br /&gt;
*Fixed {{AMBug|49892}}: Load failures went to normal logs instead of error logs.&lt;br /&gt;
*Fixed {{AMBug|51050}}: amxx pause/unpause could display misleading output.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
*Fixed the compiler parsing #error directives in ignored #if blocks.&lt;br /&gt;
*Fixed {{AMBug|50089}}: The unary negation operator did not work on Floats.&lt;br /&gt;
*Fixed {{AMBug|49469}}: get_user_origin with mode &amp;lt;tt&amp;gt;4&amp;lt;/tt&amp;gt; returned wildly inaccurate results.&lt;br /&gt;
*Fixed {{AMBug|49982}}: Many trace functions in FakeMeta did not pass a valid trace handle to plugins.&lt;br /&gt;
*Fixed {{AMBug|50501}}: unregister_forward() caused global problems with forwards.&lt;br /&gt;
*Fixed {{AMBug|49981}}: TR_InOpen was not a valid parameter for get/set_tr().&lt;br /&gt;
*Fixed {{AMBug|50680}}: ES_Body was not a valid parameter for get/set_es().&lt;br /&gt;
*Fixed {{AMBug|50731}}: The compiler crashed when including amxmisc before amxmodx.&lt;br /&gt;
*Fixed {{AMBug|51051}}: unpause() returned true on stopped plugins.&lt;br /&gt;
*Fixed {{AMBug|51276}}: fixed the cosh() stock not working.&lt;br /&gt;
*Fixed fwrite() accidentally writing two byte blocks when four-byte blocks are requested.&lt;br /&gt;
*Fixed a bug in forward_return() not handling non-string values correctly.&lt;br /&gt;
*Fixed a multitude of instances where the &amp;lt;tt&amp;gt;const&amp;lt;/tt&amp;gt; keyword was not present on certain natives.&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
*Added {{AMBug|49977}}: idlekick.sma now uses faster cvars and fixes a potential bug with NS 3.2.&lt;br /&gt;
*Fixed a bug in statsx.sma where stats did not display on awkward mp_roundtime settings.&lt;br /&gt;
*Fixed a bug in amxmod_compat.sma where get_num_ents() did not work.&lt;br /&gt;
*Fixed a bug in admincmd.sma where amx_plugins did not count debug plugins as running.&lt;br /&gt;
*Fixed {{AMBug|50907}}: Names and tags for admins were case sensitive.&lt;br /&gt;
*Fixed {{AMBug|49214}}: admincmd.sma did not count debug plugins as &amp;quot;running.&amp;quot;&lt;br /&gt;
*Fixed {{AMBug|49627}}: amx_addban now requires ADMIN_RCON access.&lt;br /&gt;
&lt;br /&gt;
==Module Changes==&lt;br /&gt;
*The Natural Selection module has been updated for NS v3.2.&lt;br /&gt;
&lt;br /&gt;
==Installer Changes==&lt;br /&gt;
*Fixed bug where the start directory wasn't listed correctly.&lt;br /&gt;
*Fixed no files being detected in some cases.&lt;br /&gt;
*Directory changes no longer crash on failure.&lt;br /&gt;
*Fixed bug where directories in / couldn't be found (unless user's root directory was /).&lt;br /&gt;
*Fixed installer failing if '.exe' files couldn't be uploaded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.76c Changelog=&lt;br /&gt;
AMX Mod X 1.76c was released on December 24, 2006.  Merry Christmas!&lt;br /&gt;
&lt;br /&gt;
==Core Changes==&lt;br /&gt;
*Fixed {{AMBug|45370}}: Certain functions (such as kill_task and menu_destroy) could cause fatal plugin corruption.  In safer instances, this resulted in a &amp;quot;HEAPLOW&amp;quot; error.&lt;br /&gt;
*Fixed a bug where calling menu_destroy() in a menu handler without returning PLUGIN_HANDLED caused a server crash.&lt;br /&gt;
*Fixed {{AMBug|48234}}: New menus with 10 items had the tenth item displayed as &amp;quot;10.&amp;quot;  As there is no such key, it is now &amp;quot;0&amp;quot; for consistency.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
*Added {{AMBug|47144}}: Console-command registration functions (concmd, srvcmd, and clcmd) now return the id of the command instead of the value 1.&lt;br /&gt;
*Fixed {{AMBug|46924}}: arrayset() with non-zero values had unexpected results.&lt;br /&gt;
*Fixed {{AMBug|48294}}: SQL_MakeStdTuple() had a typo in a buffer size.&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
*Fixed {{AMBug|47617}}: restmenu.amxx weapon restrictions could be easily exploited by aliases which abused features of non-VGUI menus.&lt;br /&gt;
*Fixed {{AMBug|46960}}: pausecfg.amxx no longer leads users to unreachable states.  As a side effect, plugins must now be hard-stopped through the console, rather than through the menu.&lt;br /&gt;
*Fixed {{AMBug|47134}}: admin_sql.amxx did not stop reading admins from the database once it had reached the maximum number of admins.&lt;br /&gt;
*Fixed {{AMBug|47842}}: telemenu.amxx had a permissions inconsistency.&lt;br /&gt;
*Fixed {{AMBug|48202}}: nscommands.amxx is now compatible with Natural Selection 3.2 beta.&lt;br /&gt;
*Fixed {{AMBug|48018}}: mapchooser.amxx would ignore &amp;quot;None&amp;quot; votes if &amp;quot;Extended&amp;quot; was the second highest choice.&lt;br /&gt;
*Fixed {{AMBug|48308}}: stats.amxx for DoD could throw a runtime error on certain erroneous double kills.&lt;br /&gt;
*Fixed {{AMBug|48522}}: map vote commands were not conforming to the vote access level flag.&lt;br /&gt;
&lt;br /&gt;
==Module Changes==&lt;br /&gt;
*Fixed {{AMBug|47194}}: nVault could crash on Linux when reading back journals with long strings.&lt;br /&gt;
*Fixed {{AMBug|47988}}: nVault would crash if a full prune was done on a vault that had persistent keys.&lt;br /&gt;
*Fixed {{AMBug|27152}}: CSX would ignore the cvar value of csstats_rank_bots.  This cvar now defaults to 0, and bots will no longer rank by default.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.76b Changelog=&lt;br /&gt;
AMX Mod X 1.76b was released on October 31st, 2006.  Happy Halloween!&lt;br /&gt;
==Core Changes==&lt;br /&gt;
*Fixed {{AMBug|46213}}: New-style menus that had numbered blanks would cause Core to guess the item numbers wrong.&lt;br /&gt;
*Fixed {{AMBug|46266}}: Team name detection did not work for TFC.&lt;br /&gt;
*Fixed a bug where get_func_id() would crash on an invalid plugin.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
*Added an optional timeout parameter to SQL_MkDbTuple().&lt;br /&gt;
*Added a &amp;quot;queuetime&amp;quot; parameter to threaded query handlers, to get the amount of time passed.&lt;br /&gt;
*Extended CreateMultiForward() with CreateMultiForwardEx() for filtering old/new plugins from forwards.&lt;br /&gt;
*Fixed {{AMBug|45337}}: SQLX_GetQueryString() did not work with threaded queries.&lt;br /&gt;
*Fixed {{AMBug|46350}}: geoip.inc having faulty a double-inclusion barrier.&lt;br /&gt;
*Fixed {{AMBug|46378}}: unregister_forward() attempted to remove from the wrong hook table.&lt;br /&gt;
*Fixed {{AMBug|46336}}: Vexd_Utilities.inc did not include VexdUM for AMX Mod Compat compiling.&lt;br /&gt;
*Fixed {{AMBug|46630}}: rename_file() could not use relative paths.&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
*Fixed {{AMBug|45990}}: amxmod_compat.amxx could conflict and crash hand-ported AMX Mod plugins.&lt;br /&gt;
*Fixed {{AMBug|46340}}: miscstats.amxx could throw an RTE finding the enemy team.&lt;br /&gt;
*Fixed {{AMBug|46335}}: adminchat.amxx color 'tsay' messages were not space aligned.  Additionally, the leading space can now be omitted.&lt;br /&gt;
*Fixed {{AMBug|46699}}: stats.amxx for DoD did not display working multi-lingual menus.&lt;br /&gt;
*Fixed {{AMBug|46559}}: miscstats.amxx could throw an RTE if a player got more than 6 kills in a row.&lt;br /&gt;
&lt;br /&gt;
==Module Changes==&lt;br /&gt;
*Fixed {{AMBug|45492}}: DoDX would overwrite the stats database on load.&lt;br /&gt;
==Other Changes==&lt;br /&gt;
*Fixed {{AMBug|46112}}: WinCSX.exe would not load properly on some versions of Windows.&lt;br /&gt;
*Fixed {{AMBug|45362}}: AMXX Studio did not indent correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.76a Changelog=&lt;br /&gt;
AMX Mod X 1.76a was released on September 25, 2006.&lt;br /&gt;
&lt;br /&gt;
==Core Changes==&lt;br /&gt;
*Fixed {{AMBug|44694}}: is_user_alive() on TFC returned false information when players joined.&lt;br /&gt;
*Fixed {{AMBug|45015}}: The translation string for ambiguous name matches was incorrect for English, Spanish, and German.&lt;br /&gt;
*Fixed {{AMBug|44956}}: The &amp;quot;extra plugin files&amp;quot; feature could break with more than two files after upgrading to 1.76.&lt;br /&gt;
*Fixed minor bugs in the installer, such as not detecting CHMOD properly.&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
*Fixed {{AMBug|45020}}: HE Grenade kill messages could interrupt each other in miscstats.sma.&lt;br /&gt;
*Fixed {{AMBug|45017}}: mapsmenu.sma contained an untranslated phrase.&lt;br /&gt;
*Fixed {{AMBug|40911}}: statsx.sma displayed last known attacker/victim stats to spectators.&lt;br /&gt;
&lt;br /&gt;
==Module Changes==&lt;br /&gt;
*Fixed {{AMBug|44973}}: The CSX module incorrectly reported many knife kills as headshots.&lt;br /&gt;
*Fixed {{AMBug|44964}}: SQLX Threaded Queries could crash if passed an invalid database name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=1.76 Changelog=&lt;br /&gt;
AMX Mod X 1.76 was released on September 17, 2006.&lt;br /&gt;
&lt;br /&gt;
==Core Changes==&lt;br /&gt;
===New Features===&lt;br /&gt;
*The compiler has been heavily optimized and will now compile plugins much faster.&lt;br /&gt;
*Request {{AMBug|43012}}: You can now specify per-map plugins files.  For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.&lt;br /&gt;
*You can now specify a new &amp;quot;disabled&amp;quot; option after plugin names in plugins.ini files.  This will prevent the plugin from being loaded in any config file, and is useful for disabling plugins in map-specific plugin files.&lt;br /&gt;
*Added an experimental compatibility layer for AMX Mod.  See [[AMX Mod Compatibility Layer (AMX Mod X)]] for more information.&lt;br /&gt;
*Request {{AMBug|42871}}: Source file name is shown in the binary logs when the plugin is in the debug mode.&lt;br /&gt;
*Request {{AMBug|44299}}: Error logs now show the mapname and current log file.&lt;br /&gt;
*The developer test suite is now packaged with Core in the scripting folder.&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Improved stability and eliminated weird bugs on Linux.  These were caused by code generation bugs in GCC and appear to exist primarily in versions higher than 1.60.&lt;br /&gt;
*Fixed a bug where secondary plugin files would not autoload modules.&lt;br /&gt;
*Fixed a serious corruption bug in callfunc_push_intrf(), callfunc_push_floatrf(), and callfunc_push_str().  Strings or data passed with these methods could be easily overwritten internally.&lt;br /&gt;
*Fixed the JIT not being able to compute heaplow bounds problems.&lt;br /&gt;
*Fixed {{AMBug|41317}}: ExecuteForward() string parameters would be trashed on future internal string calls.&lt;br /&gt;
*Fixed {{AMBug|41777}}: time.txt was not included in the installer.&lt;br /&gt;
*Fixed {{AMBug|42213}}: &amp;quot;amx_logs&amp;quot; was incorrectly listed as &amp;quot;amx_logsdir&amp;quot; in core.ini.&lt;br /&gt;
*Request {{AMBug|41036}}: Improved bot detection.&lt;br /&gt;
*Fixed a rare bug where passing (1&amp;lt;&amp;lt;31) into a %d format-code would print garbage characters.&lt;br /&gt;
&lt;br /&gt;
==Scripting Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request {{AMBug|23838}}: Added natives to sort integers, floats, strings.  Also added natives to sort custom 1D and 2D arrays using user comparison functions.&lt;br /&gt;
*Added vdformat() for formatting variable argument strings in dynamic natives.&lt;br /&gt;
*Added CreateLangKey() and AddTranslation() for manipulating the multilingual translator.&lt;br /&gt;
*Added SQL_GetInsertId() to MySQL and sqLite modules.&lt;br /&gt;
*For callfunc_push_str() and callfunc_push_array(), you can now specify an optional parameter to stop write-back on change.&lt;br /&gt;
*Request {{AMBug|42810}}: Added callfunc_push_array() to push an array through a callfunc.&lt;br /&gt;
*Request {{AMBug|42697}}: Added SQL_GetQueryString() to find the query string of a query handle.&lt;br /&gt;
*Request {{AMBug|29544}}: Added nvault_touch() native for updating key timestamps.&lt;br /&gt;
*Request {{AMBug|28110}}: Added tfc_get_user_goalitem() to determine if player is carrying a goal item (such as a flag or keycard)&lt;br /&gt;
*Request {{AMBug|41295}}: Added CZ model types to the CsInternalModel enumeration.&lt;br /&gt;
*Request {{AMBug|41635}}: All string formatting routines can now use '%u' to print integers as unsigned.  Note that Pawn only supports signed arithmetic.&lt;br /&gt;
*Request {{AMBug|41585}}: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().&lt;br /&gt;
*Request {{AMBug|40967}}: set_fail_state() now logs that the plugin is failed.&lt;br /&gt;
*Request {{AMBug|41375}}: cs_set_weapon_silen() now has an additional parameter to toggle whether silencer animation is shown.&lt;br /&gt;
*Request {{AMBug|40169}}: cs_get_user_team() now has an additional parameter by reference to get the user's internal player model.&lt;br /&gt;
*Added amxx_setpl_curweap() to the native exports table.&lt;br /&gt;
*Added tfc_get/setweaponammo for ammo that is not in player's backpack.&lt;br /&gt;
*Engine's entity_get and entity_set routines no longer verify that players are fully ingame.  This check was deemed too restrictive.&lt;br /&gt;
*Added hyperbolic trigonomic natives: floatsinh(), floatcosh(), and floattanh().&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed {{AMBug|42916}}: get_user_aiming() did not work on Linux.&lt;br /&gt;
*Fixed {{AMBug|40963}}: GeoIP did not strip ports from IP addresses.&lt;br /&gt;
*Fixed {{AMBug|41483}}: xs.inc did not have double-include prevention.&lt;br /&gt;
*Fixed {{AMBug|43313}}: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.&lt;br /&gt;
*Fixed {{AMBug|42097}}: Hooking FM_ServerDeactivate did not work.&lt;br /&gt;
*Fixed {{AMBug|42307}}: nvault_open() did not return -1 on failure.&lt;br /&gt;
*Fixed {{AMBug|42383}}: SQL_ThreadQuery() was not working when called from plugin_end().&lt;br /&gt;
*Fixed {{AMBug|42321}}: TFC's Get/Set ammo natives did not work on Linux servers (thanks jRaven).&lt;br /&gt;
*Fixed {{AMBug|44776}}: user_silentkill() did not save the previous message block state.&lt;br /&gt;
*Fixed bug in get_user_aiming() where id and body would always be set to 0.&lt;br /&gt;
*Fixed bug in dllfunc() where DLLFunc_RegisterEncoders would not actually make a call.&lt;br /&gt;
*Fixed bug with floatatan() returning wrong values when trying to get angle in degrees or grades.&lt;br /&gt;
*Improved accuracy of is_user_bot().&lt;br /&gt;
*Rewrote replace_all() to address many serious bugs, including infinite replacements, improper re-indexing, and missed replacements.&lt;br /&gt;
&lt;br /&gt;
==Plugin Changes==&lt;br /&gt;
===Additions===&lt;br /&gt;
*Request {{AMBug|41367}}: stats_logging.sma now logs extra weapons from CSX.&lt;br /&gt;
*Request {{AMBug|44517}}: Added &amp;quot;Spectator&amp;quot; to TFC plmenu.sma's team switch list (thanks jRaven).&lt;br /&gt;
&lt;br /&gt;
===Bug Fixes===&lt;br /&gt;
*Fixed a potential memory corruption bug in StatsX.&lt;br /&gt;
*Fixed {{AMBug|42013}}: TFC team menu didn't allow for changing from blue team.  Also, all plmenu plugins showed team change messages in the language of the admin.&lt;br /&gt;
*Fixed {{AMBug|41768}}: statssounds.sma for TS had the wrong plugin name.&lt;br /&gt;
*Fixed {{AMBug|41563}}: TFC plmenu.sma had the wrong team names.&lt;br /&gt;
*Fixed {{AMBug|41259}}: amx_addadmin was messing users.ini upon new entries.&lt;br /&gt;
*Fixed {{AMBug|43881}}: adminslots did not work until a mapchange was issued.&lt;br /&gt;
&lt;br /&gt;
==Module Fixes==&lt;br /&gt;
*Fixed MySQLX threader on Linux locking up on mapchange if there were queries in the queue.&lt;br /&gt;
*Fixed {{AMBug|41030}}: All stats modules could generate files that would break the file parser.&lt;br /&gt;
*Fixed {{AMBug|41961}}: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.&lt;br /&gt;
*Fixed {{AMBug|44428}}: GeoIP country codes were out of date.&lt;br /&gt;
*Updated the GeoIP library to September.&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
[[Category:AMX Mod X]]&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Optimizing_Plugins_(AMX_Mod_X_Scripting)&amp;diff=3358</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=3358"/>
		<updated>2006-09-10T14:35:57Z</updated>

		<summary type="html">&lt;p&gt;UserError: /* Always Save Results */&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;
} else if (team == TEAM_SPECTATOR) {&lt;br /&gt;
    //...code&lt;br /&gt;
}&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;
===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 practice 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;
===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;
An alternative to global variables is static variables, which are internally the same but easier to work with for programming.&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 local to the function; this means the code is much easier to read, while drastically improving speed just like a global variable.  Example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;stock SomeBigFunction()&lt;br /&gt;
{&lt;br /&gt;
   static gaben[255];&lt;br /&gt;
   format(gaben, &amp;quot;%L&amp;quot;, LANG_SERVER, &amp;quot;STUFF&amp;quot;);&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This has the same effect as declaring &amp;lt;tt&amp;gt;gaben&amp;lt;/tt&amp;gt; as global, except only &amp;lt;tt&amp;gt;SomeBigFunction&amp;lt;/tt&amp;gt; can use it.  &lt;br /&gt;
&lt;br /&gt;
{{qnotice|Be careful of re-entrancy!}}&lt;br /&gt;
When a variable is static, it has the same re-entrancy problems of a global variable.  That means, if your function might be called recursively, or twice in the same stack frame, you should not use static variables.  This is most often the case for API provided to other plugins or helper functions.  Triggered events are usually never called twice on the same execution chain.&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;&amp;lt;/pawn&amp;gt;&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;
===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;
==Faster Natives==&lt;br /&gt;
AMX Mod X replaces many of the old AMX Mod natives with faster versions.  Read below to discover them.&lt;br /&gt;
&lt;br /&gt;
===Cvar Pointers===&lt;br /&gt;
As of AMX Mod X 1.70, you can cache &amp;quot;cvar pointers&amp;quot;.  These are direct accesses to cvars, rather than named access.  This is a critical optimization which is dozens of times faster.  For example:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new g_enabled = register_cvar(&amp;quot;csdm_enabled&amp;quot;, &amp;quot;1&amp;quot;)&lt;br /&gt;
//OR&lt;br /&gt;
new g_enabled = get_cvar_pointer(&amp;quot;csdm_enabled&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
stock SetCSDM(num)&lt;br /&gt;
   set_pcvar_num(g_enabled, num)&lt;br /&gt;
&lt;br /&gt;
stock GetCSDM()&lt;br /&gt;
   return get_pcvar_num(g_enabled)&lt;br /&gt;
&amp;lt;/pawn&amp;gt;&lt;br /&gt;
All of the cvar* functions (except for set_cvar_string) are mapped to [get|set]_pcvar_*.  You can get a cached cvar pointer with get_cvar_pointer() or register_cvar().&lt;br /&gt;
&lt;br /&gt;
===FormatEX===&lt;br /&gt;
As of AMX Mod X 1.70, there is an ultra high-speed version of format() called formatex().  It skips copy-back checking, unlike format().  formatex() cannot be used if a source input is the same as the output buffer.  For example, these are invalid:&lt;br /&gt;
&amp;lt;pawn&amp;gt;new buffer[255]&lt;br /&gt;
formatex(buffer, 254, &amp;quot;%s&amp;quot;, buffer);&lt;br /&gt;
formatex(buffer, 254, buffer);&lt;br /&gt;
formatex(buffer, 254, &amp;quot;%d %s&amp;quot;, buffer[2]);&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It should be noted that format() will behave the same as formatex() if it detects that there will be no copy-back needed.  However, formatex() does not check this, and thus is slightly faster for situations where the coder is sure of its usage.&lt;br /&gt;
&lt;br /&gt;
===File Writing===&lt;br /&gt;
As of AMX Mod X 1.70, there are new natives for file writing.  Read_file and write_file are O(n^2) functions for consecutive read/writes.  fopen(), fgets(), fputs(), and fclose() are O(n) (or better) depending on how you use them.&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=3313</id>
		<title>Half-Life 1 Game Events</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Half-Life_1_Game_Events&amp;diff=3313"/>
		<updated>2006-09-05T10:09:37Z</updated>

		<summary type="html">&lt;p&gt;UserError: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Half-Life 1]]&lt;br /&gt;
[[Category:Scripting (AMX Mod X)]]&lt;br /&gt;
= Half-Life Events =&lt;br /&gt;
In [[Pawn]] you are able to hook in-game events with [http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=26 register_event]. Here are the list of the standard Half-Life 1 and Counter-Strike events and their parameters which can be read with [http://www.amxmodx.org/funcwiki.php?go=func&amp;amp;id=132 read_data]&lt;br /&gt;
&lt;br /&gt;
See the [[Advanced Scripting (AMX Mod X)#Events.2FMessages|Advanced Scripting]] article for more on events and messages.&lt;br /&gt;
&lt;br /&gt;
== ADStop ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ADStop}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AllowSpec ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|AllowSpec|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoPickup ==&lt;br /&gt;
Temporarily draws [[HUD]] the ammo amount and ammo type [[HUD]] icon in the middle of the right side of the screen.&amp;lt;br&amp;gt;&lt;br /&gt;
{{qnotice|Draw time is dependent on the ''hud_drawhistory_time'' client CVAR value}}&lt;br /&gt;
{{begin-hl1msg|AmmoPickup|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|AmmoID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== AmmoX ==&lt;br /&gt;
Updates green bar indicator in the [[HUD]] weapons-list. Also updates [[HUD]] backpack ammo number in the lower right corner of the screen in case the given ammo type are compatible with the current weapon.&lt;br /&gt;
{{begin-hl1msg|AmmoX|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|AmmoID}}&lt;br /&gt;
{{hl1msg|byte|Ammount}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime ==&lt;br /&gt;
Draws a [[HUD]] progress bar which is filled from 0% to 100% for the time Duration seconds and then disappeared.&amp;lt;br&amp;gt;&lt;br /&gt;
{{qnotice|Set Duration to 0 to hide the bar.}}&lt;br /&gt;
{{begin-hl1msg|BarTime|short}}&lt;br /&gt;
{{hl1msg|short|Duration}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BarTime2 ==&lt;br /&gt;
The same as BarTime but StartPC is specify how many per cents of the bar are (already) filled.&amp;lt;br&amp;gt;&lt;br /&gt;
{{qnotice|Display time can be calculated with this formula: ''(1 - StartPC/100) / Duration''}}&lt;br /&gt;
{{begin-hl1msg|BarTime2|short, short}}&lt;br /&gt;
{{hl1msg|short|Duration}}&lt;br /&gt;
{{hl1msg|short|StartPC}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Battery ==&lt;br /&gt;
Updates the icon and number of the armor on the [[HUD]].&lt;br /&gt;
{{begin-hl1msg|Battery|short}}&lt;br /&gt;
{{hl1msg|short|Armor}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BlinkAcct ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BlinkAcct}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombDrop ==&lt;br /&gt;
The first three arguments are the origin of the dropped bomb. The last argument is set to 1 if the bomb has been planted. It is 0 if the bomb was dropped due to voluntary dropping or death/disconnect. Setting the last argument 1, will also trigger the round timer to hide. It also will show the dropped bomb on the Terrorist team's radar in the location specified by the first three arguments.&lt;br /&gt;
{{begin-hl1msg|BombDrop|coord, coord, coord, byte}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BombPickup ==&lt;br /&gt;
This message just tells the game that the bomb has been picked up. It will cause the dropped/planted bomb to disappear from the Terrorist team's radar. &lt;br /&gt;
{{begin-hl1msg|BombPickup}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotProgress ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotProgress}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BotVoice ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BotVoice|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Brass ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Brass}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== BuyClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|BuyClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ClCorpse ==&lt;br /&gt;
Spawns a player's corpse. Model is the player's model, for example: &amp;quot;leet&amp;quot;. Delay is the delay before animation plaback, can be negative value.&amp;lt;br&amp;gt;&lt;br /&gt;
{{qnotice|The Origin and Delay is in non-standard format.}}&lt;br /&gt;
{{begin-hl1msg|ClCorpse|string, long, long, long, coord, coord, coord, long, byte, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|string|Model}}&lt;br /&gt;
{{hl1msg|long|OriginX}}&lt;br /&gt;
{{hl1msg|long|OriginY}}&lt;br /&gt;
{{hl1msg|long|OriginZ}}&lt;br /&gt;
{{hl1msg|coord|AngleX}}&lt;br /&gt;
{{hl1msg|coord|AngleY}}&lt;br /&gt;
{{hl1msg|coord|AngleZ}}&lt;br /&gt;
{{hl1msg|long|Delay}}&lt;br /&gt;
{{hl1msg|byte|Sequence}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|TeamID}}&lt;br /&gt;
{{hl1msg|byte|PlayerID}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Crosshair ==&lt;br /&gt;
Draws/removes the crosshair. If Flag is set to 1 the crosshair will be drawn.&lt;br /&gt;
{{begin-hl1msg|Crosshair|byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CurWeapon ==&lt;br /&gt;
Updates the clip ammo number and weapon's corresponding ammo type icon on the [[HUD]].&lt;br /&gt;
{{begin-hl1msg|CurWeapon|byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|isActive}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{hl1msg|byte|ClipAmmo}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareer ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareer}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== CZCareerHUD ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|CZCareerHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Damage == &lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Damage|byte, byte, long, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|Damage save (armor)}}&lt;br /&gt;
{{hl1msg|byte|Damage take (health)}}&lt;br /&gt;
{{hl1msg|long|Damage type}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== DeathMsg ==&lt;br /&gt;
Fired to all players (MSG_ALL or MSG_BROADCAST) to notify them of a death. This generates the [[HUD]] message the client sees in the upper right corner of their screen.&amp;lt;br&amp;gt;&lt;br /&gt;
Also prints the console text message &amp;quot;KillerName killed VictimName with WeaponName&amp;quot; or &amp;quot;*** KillerName killed VictimName with a headshot from WeaponName ***&amp;quot;&lt;br /&gt;
{{begin-hl1msg|DeathMsg|byte, byte, byte, string}}&lt;br /&gt;
{{hl1msg|byte|KillerID}}&lt;br /&gt;
{{hl1msg|byte|VictimID}}&lt;br /&gt;
{{hl1msg|byte|isHeadshot}}&lt;br /&gt;
{{hl1msg|string|WeaponName}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== FlashBat ==&lt;br /&gt;
Updates the flashlight battery charge on the [[HUD]]. ChargePC is in per cents.&lt;br /&gt;
{{begin-hl1msg|FlashBat|byte}}&lt;br /&gt;
{{hl1msg|byte|ChargePC}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Flashlight ==&lt;br /&gt;
Updates the flashlight state and battery charge on the [[HUD]]. If Flag is set to 1 the flashlight [[HUD]] icon will be shown as active.&lt;br /&gt;
{{begin-hl1msg|Flashlight|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|byte|ChargePC}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Fog ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Fog}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ForceCam ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ForceCam}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostageK ==&lt;br /&gt;
Temporary draws a blinking red dot on the CT players' radar when hostage is killed.&lt;br /&gt;
{{begin-hl1msg|HostageK|byte}}&lt;br /&gt;
{{hl1msg|byte|HostageID}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== HostagePos ==&lt;br /&gt;
Draws/updates the blue mark on the CT players' radar which represents the corresponding hostage's position.&lt;br /&gt;
{{begin-hl1msg|HostagePos|byte, byte, coord, coord, coord}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|byte|HostageID}}&lt;br /&gt;
{{hl1msg|coord|X}}&lt;br /&gt;
{{hl1msg|coord|Y}}&lt;br /&gt;
{{hl1msg|coord|Z}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Money ==&lt;br /&gt;
Updates the Amount of money on the [[HUD]]. If the Flag is 1, the additional new-old [[HUD]] money amount difference will be also displayed.&lt;br /&gt;
{{begin-hl1msg|Money|long, byte}}&lt;br /&gt;
{{hl1msg|long|Amount}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== NVGToggle ==&lt;br /&gt;
Toggles night vision mode. For Flag: 1 is on, 0 is off.&lt;br /&gt;
{{begin-hl1msg|NVGToggle|byte}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ResetHUD ==&lt;br /&gt;
Resets the [[HUD]].&lt;br /&gt;
{{begin-hl1msg|ResetHUD}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== RoundTime ==&lt;br /&gt;
Updates the round timer on the [[HUD]]. Time is in seconds.&lt;br /&gt;
{{begin-hl1msg|RoundTime|short}}&lt;br /&gt;
{{hl1msg|short|Time}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== SayText ==&lt;br /&gt;
Prints say [[HUD]] text. Second parameter can be a predefined string or a custom one. In the last case the last two parameters isn't required.&amp;lt;br&amp;gt;&lt;br /&gt;
Some values of the predifined string: #Cstrike_Chat_AllDead, #Cstrike_Chat_All&lt;br /&gt;
{{begin-hl1msg|SayText|byte, string, string, string}}&lt;br /&gt;
{{hl1msg|byte|SenderID}}&lt;br /&gt;
{{hl1msg|string|String}}&lt;br /&gt;
{{hl1msg|string|unknown}}&lt;br /&gt;
{{hl1msg|string|Text}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Scenario ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Scenario|byte}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ScoreAttrib ==&lt;br /&gt;
Updates the scoreboard's attribute for the specified player. For the 2nd argument, 0 is nothing, 1 is dead, 2 is bomb, 4 is VIP.&amp;lt;br&amp;gt;&lt;br /&gt;
{{qnotice|Flag is a bitwise value so if VIP player dying with the bomb the Flag will be 7}}&lt;br /&gt;
{{begin-hl1msg|ScoreAttrib|byte, byte}}&lt;br /&gt;
{{hl1msg|byte|PlayerID}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== StatusIcon ==&lt;br /&gt;
Draws/removes the specified status [[HUD]] icon. For Status, 0 is Hide Icon, 1 is Show Icon, 2 is Flash Icon. Red, Green and Blue arguments is optional and is specified only when Status are not 0.&lt;br /&gt;
{{begin-hl1msg|StatusIcon|byte, string, byte, byte, byte}}&lt;br /&gt;
{{hl1msg|byte|Status}}&lt;br /&gt;
{{hl1msg|string|SpriteName}}&lt;br /&gt;
{{hl1msg|byte|Red}}&lt;br /&gt;
{{hl1msg|byte|Green}}&lt;br /&gt;
{{hl1msg|byte|Blue}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== StatusText ==&lt;br /&gt;
Specifies the status text format.&lt;br /&gt;
{{begin-hl1msg|StatusText|byte, string}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|string|Text}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== StatusValue ==&lt;br /&gt;
Sends/updates the status values. For the Flag 1 the Value is TeamRelation, for 2 is PlayerID, for 3 is Health. For TeamRelation, 1 is Teammate player, 2 is Non-Teammate player, 3 is Hostage. If TeamRelation is the Hostage, PlayerID will be always 0.&amp;lt;br&amp;gt;&lt;br /&gt;
{{qnotice|Usually is fired as a triple message, for example:&amp;lt;br&amp;gt;&lt;br /&gt;
  (1, 2) - non-teammate player&amp;lt;br&amp;gt;&lt;br /&gt;
  (2, 7) - player index is 7&amp;lt;br&amp;gt;&lt;br /&gt;
  (3, 59) - health is 59}}&lt;br /&gt;
{{begin-hl1msg|StatusValue|byte, short}}&lt;br /&gt;
{{hl1msg|byte|Flag}}&lt;br /&gt;
{{hl1msg|short|Value}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TaskTime ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TaskTime}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TeamInfo ==&lt;br /&gt;
TeamName is either &amp;quot;UNASSIGNED&amp;quot;, &amp;quot;TERRORIST&amp;quot; or &amp;quot;CT&amp;quot;.&lt;br /&gt;
{{begin-hl1msg|TeamInfo|byte, string}}&lt;br /&gt;
{{hl1msg|byte|ID}}&lt;br /&gt;
{{hl1msg|string|TeamName}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TeamScore ==&lt;br /&gt;
Updates the team score on the score board. TeamName is either &amp;quot;TERRORIST&amp;quot; or &amp;quot;CT&amp;quot;.&lt;br /&gt;
{{begin-hl1msg|TeamScore|string, short}}&lt;br /&gt;
{{hl1msg|string|TeamName}}&lt;br /&gt;
{{hl1msg|short|Score}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TextMsg ==&lt;br /&gt;
{{qnotice|There does not necessarily have to be a total of 6 arguments, there could be as little as 2. For example you can send a message with the following:&amp;lt;br&amp;gt;&lt;br /&gt;
Arg1: 1&amp;lt;br&amp;gt;&lt;br /&gt;
Arg2: #Game_join_ct&amp;lt;br&amp;gt;&lt;br /&gt;
Arg3: 4HM | Pimp Daddy&amp;lt;br&amp;gt;}}&lt;br /&gt;
{{begin-hl1msg|TextMsg|byte, string, string, string, string, string}}&lt;br /&gt;
{{hl1msg|byte|ID}}&lt;br /&gt;
{{hl1msg|string|Message}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{hl1msg|string|Submsg}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== Train ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|Train}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorClose ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorClose}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorLine ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorLine}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorState ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorState}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== TutorText ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|TutorText}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== VGUIMenu ==&lt;br /&gt;
Displays a predefined VGUI menu. Keys is a keys bit sum.&lt;br /&gt;
{{begin-hl1msg|VGUIMenu|byte, short, char, byte, string}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|short|Keys}}&lt;br /&gt;
{{hl1msg|char|unknown}}&lt;br /&gt;
{{hl1msg|byte|unknown}}&lt;br /&gt;
{{hl1msg|string|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== ViewMode ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|ViewMode}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== VoiceMask ==&lt;br /&gt;
{{qnotice|No Information available for this event}}&lt;br /&gt;
{{begin-hl1msg|VoiceMask|long, long}}&lt;br /&gt;
{{hl1msg|long|PlayersIndexBitSum}}&lt;br /&gt;
{{hl1msg|long|unknown}}&lt;br /&gt;
{{end-hl1msg}}&lt;br /&gt;
&lt;br /&gt;
== WeapPickup ==&lt;br /&gt;
Fired right before weapon is picked up.&amp;lt;br&amp;gt;&lt;br /&gt;
{{qnotice|Notice: &amp;quot;right before&amp;quot;.}}&lt;br /&gt;
{{begin-hl1msg|WeapPickup|byte}}&lt;br /&gt;
{{hl1msg|byte|WeaponID}}&lt;br /&gt;
{{end-hl1msg}}&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=FakeMeta_General_Usage_(AMX_Mod_X)&amp;diff=3312</id>
		<title>FakeMeta General Usage (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=FakeMeta_General_Usage_(AMX_Mod_X)&amp;diff=3312"/>
		<updated>2006-09-05T10:02:41Z</updated>

		<summary type="html">&lt;p&gt;UserError: /* Return Values */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Current FakeMeta and Old==&lt;br /&gt;
FakeMeta used to be an internal mini-metamod inside [[AMX Mod X]].  This was removed in 1.50, and now only the module remains.  The module is an entirely different concept, which extends [[Metamod]] HL1 programming powers to scripts.&lt;br /&gt;
&lt;br /&gt;
==About==&lt;br /&gt;
FakeMeta is an extremely powerful module for AMX Mod X that effectively allows you to write Metamod plugins in [[Pawn]].&lt;br /&gt;
&lt;br /&gt;
Unlike Engine, FakeMeta uses no CPU if it is not told to do anything (other than to exist). For this reason, it is recommended to use FakeMeta over Engine. There is nothing in Engine that is not in FakeMeta -- while some functionality might be less [[Abstraction|abstracted]], it is still achievable, and usually with more flexibility.&lt;br /&gt;
&lt;br /&gt;
==Engine vs. FakeMeta==&lt;br /&gt;
&lt;br /&gt;
Comparison between Engine and FakeMeta:&lt;br /&gt;
&lt;br /&gt;
FakeMeta:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink,&amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	// here you would insert some code&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Engine:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;engine&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;Engine Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public client_PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	// here you would insert some code&lt;br /&gt;
	&lt;br /&gt;
	return;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;return FMRES_IGNORED&amp;quot; section will be covered later on this page.&lt;br /&gt;
&lt;br /&gt;
==General Functionality==&lt;br /&gt;
&lt;br /&gt;
FakeMeta also allows you to do other things, such as retrieve private data (using pev, set_pev / get_pdata_int, get_pdata_float, get_pdata_string, set_pdata_int, set_pdata_float, set_pdata_string), forcing DLL functions to be executed, as well as call Engine (not the module) functions.&lt;br /&gt;
&lt;br /&gt;
==Entvars==&lt;br /&gt;
It is easy to read [[Entvars (Half-Life 1)|entvars]] in FakeMeta, however it can sometimes cause problems if not done correctly (which is why Engine is more commonly used).  Entvars are variables in a player's [[Edicts (Half-Life 1)|edict]] structure (an edict is the basis for an entity).&lt;br /&gt;
&lt;br /&gt;
Here is an example of how to retrieve the armor entvar from an entity in FakeMeta:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink, &amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	new value = pev(id,pev_armorvalue); // gets armor from client/entity&lt;br /&gt;
	&lt;br /&gt;
	client_print(id,print_chat,&amp;quot;%i&amp;quot;,value); // prints armor value to client&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DLL / Engine Function Usage==&lt;br /&gt;
In DLLs and the Engine, there are functions that are called when certain events happen. These can be forced to be called through FakeMeta. Here is a general example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink,&amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	dllfunc(DLLFunc_RegisterEncoders);&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to the end of the line while viewing the DLLFunc and EngFunc sections, as there is usually some description of paramaters, such as ''edict_t *p_Entity'' or ''void''. ''void'' generally refers to no parameters, while ''edict_t *p_Entity'' means the entity id, so the first parameter in the function would be the entity to call the function onto.&lt;br /&gt;
&lt;br /&gt;
==Return Values==&lt;br /&gt;
There are 4 return values in FakeMeta:&lt;br /&gt;
&lt;br /&gt;
*FMRES_HANDLED --&amp;gt; Something was done in this function, but call the one in the DLL / Engine anyways.&lt;br /&gt;
*FMRES_SUPERCEDE --&amp;gt; Prevent function in DLL / Engine from being called.&lt;br /&gt;
*FMRES_IGNORED --&amp;gt; Call original function.&lt;br /&gt;
*FMRES_OVERRIDE --&amp;gt; Call original function, but change return value.&lt;br /&gt;
&lt;br /&gt;
==Constants / General==&lt;br /&gt;
A list of general constants and usage can be found on this page:&lt;br /&gt;
http://www.amxmodx.org/funcwiki.php?go=module&amp;amp;id=16&lt;br /&gt;
&lt;br /&gt;
[[Category : Scripting_(AMX_Mod_X)]]&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=FakeMeta_General_Usage_(AMX_Mod_X)&amp;diff=3311</id>
		<title>FakeMeta General Usage (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=FakeMeta_General_Usage_(AMX_Mod_X)&amp;diff=3311"/>
		<updated>2006-09-05T09:58:19Z</updated>

		<summary type="html">&lt;p&gt;UserError: /* Engine vs. FakeMeta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Current FakeMeta and Old==&lt;br /&gt;
FakeMeta used to be an internal mini-metamod inside [[AMX Mod X]].  This was removed in 1.50, and now only the module remains.  The module is an entirely different concept, which extends [[Metamod]] HL1 programming powers to scripts.&lt;br /&gt;
&lt;br /&gt;
==About==&lt;br /&gt;
FakeMeta is an extremely powerful module for AMX Mod X that effectively allows you to write Metamod plugins in [[Pawn]].&lt;br /&gt;
&lt;br /&gt;
Unlike Engine, FakeMeta uses no CPU if it is not told to do anything (other than to exist). For this reason, it is recommended to use FakeMeta over Engine. There is nothing in Engine that is not in FakeMeta -- while some functionality might be less [[Abstraction|abstracted]], it is still achievable, and usually with more flexibility.&lt;br /&gt;
&lt;br /&gt;
==Engine vs. FakeMeta==&lt;br /&gt;
&lt;br /&gt;
Comparison between Engine and FakeMeta:&lt;br /&gt;
&lt;br /&gt;
FakeMeta:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink,&amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	// here you would insert some code&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Engine:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;engine&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;Engine Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public client_PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	// here you would insert some code&lt;br /&gt;
	&lt;br /&gt;
	return;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;return FMRES_IGNORED&amp;quot; section will be covered later on this page.&lt;br /&gt;
&lt;br /&gt;
==General Functionality==&lt;br /&gt;
&lt;br /&gt;
FakeMeta also allows you to do other things, such as retrieve private data (using pev, set_pev / get_pdata_int, get_pdata_float, get_pdata_string, set_pdata_int, set_pdata_float, set_pdata_string), forcing DLL functions to be executed, as well as call Engine (not the module) functions.&lt;br /&gt;
&lt;br /&gt;
==Entvars==&lt;br /&gt;
It is easy to read [[Entvars (Half-Life 1)|entvars]] in FakeMeta, however it can sometimes cause problems if not done correctly (which is why Engine is more commonly used).  Entvars are variables in a player's [[Edicts (Half-Life 1)|edict]] structure (an edict is the basis for an entity).&lt;br /&gt;
&lt;br /&gt;
Here is an example of how to retrieve the armor entvar from an entity in FakeMeta:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink, &amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	new value = pev(id,pev_armorvalue); // gets armor from client/entity&lt;br /&gt;
	&lt;br /&gt;
	client_print(id,print_chat,&amp;quot;%i&amp;quot;,value); // prints armor value to client&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DLL / Engine Function Usage==&lt;br /&gt;
In DLLs and the Engine, there are functions that are called when certain events happen. These can be forced to be called through FakeMeta. Here is a general example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink,&amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	dllfunc(DLLFunc_RegisterEncoders);&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to the end of the line while viewing the DLLFunc and EngFunc sections, as there is usually some description of paramaters, such as ''edict_t *p_Entity'' or ''void''. ''void'' generally refers to no parameters, while ''edict_t *p_Entity'' means the entity id, so the first parameter in the function would be the entity to call the function onto.&lt;br /&gt;
&lt;br /&gt;
==Return Values==&lt;br /&gt;
There are 4 return values in FakeMeta:&lt;br /&gt;
# FMRES_HANDLED	&lt;br /&gt;
# FMRES_SUPERCEDE&lt;br /&gt;
# FMRES_IGNORED	&lt;br /&gt;
# FMRES_OVERRIDE&lt;br /&gt;
&lt;br /&gt;
*FMRES_HANDLED --&amp;gt; Something was done in this function, but call the one in the DLL / Engine anyways.&lt;br /&gt;
*FMRES_SUPERCEDE --&amp;gt; Prevent function in DLL / Engine from being called.&lt;br /&gt;
*FMRES_IGNORED --&amp;gt; Call original function.&lt;br /&gt;
*FMRES_OVERRIDE --&amp;gt; Call original function, but change return value.&lt;br /&gt;
&lt;br /&gt;
==Constants / General==&lt;br /&gt;
A list of general constants and usage can be found on this page:&lt;br /&gt;
http://www.amxmodx.org/funcwiki.php?go=module&amp;amp;id=16&lt;br /&gt;
&lt;br /&gt;
[[Category : Scripting_(AMX_Mod_X)]]&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=FakeMeta_General_Usage_(AMX_Mod_X)&amp;diff=3310</id>
		<title>FakeMeta General Usage (AMX Mod X)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=FakeMeta_General_Usage_(AMX_Mod_X)&amp;diff=3310"/>
		<updated>2006-09-05T09:57:28Z</updated>

		<summary type="html">&lt;p&gt;UserError: /* Engine vs. FakeMeta */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Current FakeMeta and Old==&lt;br /&gt;
FakeMeta used to be an internal mini-metamod inside [[AMX Mod X]].  This was removed in 1.50, and now only the module remains.  The module is an entirely different concept, which extends [[Metamod]] HL1 programming powers to scripts.&lt;br /&gt;
&lt;br /&gt;
==About==&lt;br /&gt;
FakeMeta is an extremely powerful module for AMX Mod X that effectively allows you to write Metamod plugins in [[Pawn]].&lt;br /&gt;
&lt;br /&gt;
Unlike Engine, FakeMeta uses no CPU if it is not told to do anything (other than to exist). For this reason, it is recommended to use FakeMeta over Engine. There is nothing in Engine that is not in FakeMeta -- while some functionality might be less [[Abstraction|abstracted]], it is still achievable, and usually with more flexibility.&lt;br /&gt;
&lt;br /&gt;
==Engine vs. FakeMeta==&lt;br /&gt;
&lt;br /&gt;
Comparison between Engine and FakeMeta:&lt;br /&gt;
&lt;br /&gt;
FakeMeta:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Author&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink,&amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	// here you would insert some code&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Engine:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;engine&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;Engine Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Author&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public client_PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	// here you would insert some code&lt;br /&gt;
	&lt;br /&gt;
	return;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;return FMRES_IGNORED&amp;quot; section will be covered later on this page.&lt;br /&gt;
&lt;br /&gt;
==General Functionality==&lt;br /&gt;
&lt;br /&gt;
FakeMeta also allows you to do other things, such as retrieve private data (using pev, set_pev / get_pdata_int, get_pdata_float, get_pdata_string, set_pdata_int, set_pdata_float, set_pdata_string), forcing DLL functions to be executed, as well as call Engine (not the module) functions.&lt;br /&gt;
&lt;br /&gt;
==Entvars==&lt;br /&gt;
It is easy to read [[Entvars (Half-Life 1)|entvars]] in FakeMeta, however it can sometimes cause problems if not done correctly (which is why Engine is more commonly used).  Entvars are variables in a player's [[Edicts (Half-Life 1)|edict]] structure (an edict is the basis for an entity).&lt;br /&gt;
&lt;br /&gt;
Here is an example of how to retrieve the armor entvar from an entity in FakeMeta:&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink, &amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	new value = pev(id,pev_armorvalue); // gets armor from client/entity&lt;br /&gt;
	&lt;br /&gt;
	client_print(id,print_chat,&amp;quot;%i&amp;quot;,value); // prints armor value to client&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DLL / Engine Function Usage==&lt;br /&gt;
In DLLs and the Engine, there are functions that are called when certain events happen. These can be forced to be called through FakeMeta. Here is a general example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pawn&amp;gt;#include &amp;lt;amxmodx&amp;gt;&lt;br /&gt;
#include &amp;lt;fakemeta&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public plugin_init()&lt;br /&gt;
{&lt;br /&gt;
	register_plugin(&amp;quot;FakeMeta Test&amp;quot;,&amp;quot;1.0&amp;quot;,&amp;quot;Hawk552&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	register_forward(FM_PlayerPreThink,&amp;quot;PreThink&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public PreThink(id)&lt;br /&gt;
{&lt;br /&gt;
	dllfunc(DLLFunc_RegisterEncoders);&lt;br /&gt;
	&lt;br /&gt;
	return FMRES_IGNORED;&lt;br /&gt;
}&amp;lt;/pawn&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Refer to the end of the line while viewing the DLLFunc and EngFunc sections, as there is usually some description of paramaters, such as ''edict_t *p_Entity'' or ''void''. ''void'' generally refers to no parameters, while ''edict_t *p_Entity'' means the entity id, so the first parameter in the function would be the entity to call the function onto.&lt;br /&gt;
&lt;br /&gt;
==Return Values==&lt;br /&gt;
There are 4 return values in FakeMeta:&lt;br /&gt;
# FMRES_HANDLED	&lt;br /&gt;
# FMRES_SUPERCEDE&lt;br /&gt;
# FMRES_IGNORED	&lt;br /&gt;
# FMRES_OVERRIDE&lt;br /&gt;
&lt;br /&gt;
*FMRES_HANDLED --&amp;gt; Something was done in this function, but call the one in the DLL / Engine anyways.&lt;br /&gt;
*FMRES_SUPERCEDE --&amp;gt; Prevent function in DLL / Engine from being called.&lt;br /&gt;
*FMRES_IGNORED --&amp;gt; Call original function.&lt;br /&gt;
*FMRES_OVERRIDE --&amp;gt; Call original function, but change return value.&lt;br /&gt;
&lt;br /&gt;
==Constants / General==&lt;br /&gt;
A list of general constants and usage can be found on this page:&lt;br /&gt;
http://www.amxmodx.org/funcwiki.php?go=module&amp;amp;id=16&lt;br /&gt;
&lt;br /&gt;
[[Category : Scripting_(AMX_Mod_X)]]&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Cross_Compiling_Plugins_(Metamod:Source)&amp;diff=3278</id>
		<title>Cross Compiling Plugins (Metamod:Source)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Cross_Compiling_Plugins_(Metamod:Source)&amp;diff=3278"/>
		<updated>2006-08-20T23:41:48Z</updated>

		<summary type="html">&lt;p&gt;UserError: /* Compiling Plugins */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
The aim of this tutorial is to allow Windows Half-Life 2 plugin coders to compile their plugins on the same machine as the windows binaries.&lt;br /&gt;
The binaries are compatible with 99% of all linux servers and do not suffer from bulky file sizes.&lt;br /&gt;
One of the main benefits to using this method of compiling is that your code can be left wherever you currently have it so that compile time reluctance is removed and coders can concentrate on coding the plugins instead of &amp;quot;How on earth am I to compile this for linux ???&amp;quot;.&lt;br /&gt;
All you need to get started are the base Cygwin installation, the CrossTool.tar.gz file and the makefile. Links to the latter two are included at the end of the tutorial.&lt;br /&gt;
&lt;br /&gt;
This tutorial assumes the following.&lt;br /&gt;
&amp;lt;OL&amp;gt;&lt;br /&gt;
&amp;lt;LI&amp;gt;You currently have a plugin which you can compile on windows using MSVC.&lt;br /&gt;
&amp;lt;LI&amp;gt;You have a copy of the HL2SDK Source Code installed on your hard drive.&lt;br /&gt;
&amp;lt;LI&amp;gt;You have a copy of the [http://www.sourcemm.net Metamod:Source] source code on your hard drive.&lt;br /&gt;
&amp;lt;/OL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Although the cross compiler will allow for compiling of Valves standard plugins, I do not include a Makefile or instructions on how to successfully accomplish this.&lt;br /&gt;
&lt;br /&gt;
==Installing Cygwin==&lt;br /&gt;
First, download CygWin from [http://www.cygwin.com www.CygWin.com] by clicking on &amp;quot;Install Now&amp;quot; located in the middle of the page.&lt;br /&gt;
&lt;br /&gt;
Once the download finishes, run &amp;lt;i&amp;gt;setup.exe&amp;lt;/i&amp;gt;&lt;br /&gt;
Click 'Next' on the introduction screen.&lt;br /&gt;
&lt;br /&gt;
On the second page, select 'Install from Internet'.&amp;lt;br&amp;gt;&lt;br /&gt;
The following page is all user preferances, except the 'Default Text File Type' which is recommended you use 'Unix / binary'.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
After clicking next, you are prompted for a CygWin temporary folder, any folder will suffice, the default is usually the better option.&amp;lt;br&amp;gt;&lt;br /&gt;
The next screen's options are firewall/proxy settings, these are specific to the Computer/Network you are currently using.&amp;lt;br&amp;gt;&lt;br /&gt;
Once you click next on the previous screen, the installer will download a list of mirror sites containing the CygWin binaries. Select one which you think is closest to you for a faster installation time.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Finaly, you are presented with a 'Select Packages' screen.&amp;lt;br&amp;gt;&lt;br /&gt;
I *think* it should work fine without all of the dev packages.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If anyone has gotten this to work by selecting less packages, please let me know so I can remove them from this list.&amp;lt;br&amp;gt;&lt;br /&gt;
Items marked in bold are extremely important.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*binutils&lt;br /&gt;
*&amp;lt;b&amp;gt;bzip2&amp;lt;/b&amp;gt;&lt;br /&gt;
*cygutils&lt;br /&gt;
*gcc&lt;br /&gt;
*&amp;lt;b&amp;gt;glib&amp;lt;/b&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;gzip&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*libiconv&lt;br /&gt;
*&amp;lt;b&amp;gt;make&amp;lt;/b&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;zlib&amp;lt;/b&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;grep&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Click next and it should install the packages to the target path you specified.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installing CrossTool==&lt;br /&gt;
Download the CrossCompiler from one of the mirrors below to the root cygwin folder &amp;lt;i&amp;gt;(c:\cygwin)&amp;lt;/i&amp;gt;.&lt;br /&gt;
If it gets renamed to 'crosstool_gcc-3.4.1.tar.tar' please rename it to 'crosstool_gcc-3.4.1.tar.gz'.&lt;br /&gt;
Download Mirrors for 'crosstool_gcc.tar.gz'&lt;br /&gt;
*[http://files.filefront.com/crosstool_gcc_341targz/;4650645;;/fileinfo.html FileFront]&lt;br /&gt;
*[http://downloads.punkassfraggers.com/redirect.php?dlid=1224 PunkAssFraggers.com]&lt;br /&gt;
&lt;br /&gt;
This is the most important part of the entire tutorial.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Do not try and extract 'crosstool_gcc-3.4.1.tar.gz' using any Windows Archiving utility !&amp;lt;/b&amp;gt;&lt;br /&gt;
They do not extract the files correctly and if you don't get errors during the extraction, you will while trying to compile !&lt;br /&gt;
Once the download is complete, run cygwin by navigating to the cygwin root folder, and double clicking on &amp;lt;i&amp;gt;'cygwin.bat'&amp;lt;/i&amp;gt;.&lt;br /&gt;
Type the following two commands in order into the cygwin bash shell followed by the enter key:&lt;br /&gt;
&lt;br /&gt;
  cd /&lt;br /&gt;
  tar -xzf crosstool_gcc-3.4.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
This will start extracting the tar file to the '&amp;lt;cygroot&amp;gt;/opt' folder on your hard drive.&lt;br /&gt;
And thats it, now you have the pre-compiled GCC 3.4.1 [http://www.lduke.com (Thanks LDuke)] installed on your computer you can compile server plugins for both regular and SourceMM flavours with ease and compatibility with Valves GCC 3.4.1 requirements.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compiling Plugins==&lt;br /&gt;
Download the Makefile by clicking on [http://www.c0ld.net/Tutorials/CrossTool/Makefile this link.]&lt;br /&gt;
&lt;br /&gt;
Save it to your project's root source folder and open it with a text editor like notepad.&amp;lt;br&amp;gt;&lt;br /&gt;
Inside the Makefile I have shown examples on how your paths are translated into unix/cygwin hybrid paths.&amp;lt;br&amp;gt;&lt;br /&gt;
So, before trying any compling just yet, you need to insert the paths for the following.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;HL2SDK&amp;lt;/b&amp;gt;: The path to where your HL2SDK files are located.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;SMM_ROOT&amp;lt;/b&amp;gt;: The path to where you extracted the contents of the [http://www.sourcemm.net/ SourceMM package]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;SRCDS&amp;lt;/b&amp;gt;: The path to the linux SRCDS binaries.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;PLUGIN&amp;lt;/b&amp;gt;: The plugin filename.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the convenience of those who don't have access to a Linux srcds installation, you can grab the files required at one of the mirrors below.&amp;lt;br&amp;gt;&lt;br /&gt;
Extract them to a new folder which will be your SRCDS path in the Makefile.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt;The bin folder must be inside the srcds folder for maximum compatibility. For example, your files end up being something like this 'C:\MyFiles\srcds_l\bin\vstdlib_i486.so'.&lt;br /&gt;
&lt;br /&gt;
So, in your Makefile, SRCDS would be '/cygdrive/c/MyFiles/srcds_l'&lt;br /&gt;
&lt;br /&gt;
Download Mirrors for 'srcds_l_binaries.zip'&lt;br /&gt;
*[http://files.filefront.com/srcds_l_binarieszip/;4651213;;/fileinfo.html FileFront Mirror]&lt;br /&gt;
*[http://rapidshare.de/files/11597264/srcds_l_binaries.zip.html RapidShare.de Mirror]&lt;br /&gt;
Now you're ready to try compiling.&lt;br /&gt;
Back to the cygwin bash window, and we're now going to have to navigate to your code's location.&lt;br /&gt;
An example path could be 'C:\MyCode\MyPlugin\' so in the bash shell we type the following:&lt;br /&gt;
&lt;br /&gt;
  cd /cygdrive/c/MyCode/MyPlugin/&lt;br /&gt;
  make&lt;br /&gt;
&lt;br /&gt;
If all your paths are set correctly, it should start compiling the plugin.&lt;br /&gt;
Ignore all the warnings in the HL2SDK, they are harmless.&lt;br /&gt;
What you should be looking out for are errors and warnings located inside your own code.&lt;br /&gt;
Unfortunately I cannot compile plugins for you, but there is a forum dedicated to helping you with hl2sdk coding problems.&lt;br /&gt;
&lt;br /&gt;
[http://forums.alliedmods.net/forumdisplay.php?f=75 Click here to visit the forum]&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
*Tutorial by: Jason &amp;quot;c0ldfyr3&amp;quot; Croghan&lt;br /&gt;
*Cross Compiler compiled by: L. Duke&lt;br /&gt;
*Makefile originally written by: David &amp;quot;BAILOPAN&amp;quot; Anderson&lt;br /&gt;
*Converted to Wiki by: James &amp;quot;sslice&amp;quot; Gray&lt;br /&gt;
&lt;br /&gt;
Original Location: http://www.c0ld.net/index.php?inc=CrossTool&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation (SourceMM)]]&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=Cross_Compiling_Plugins_(Metamod:Source)&amp;diff=3277</id>
		<title>Cross Compiling Plugins (Metamod:Source)</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=Cross_Compiling_Plugins_(Metamod:Source)&amp;diff=3277"/>
		<updated>2006-08-20T23:14:53Z</updated>

		<summary type="html">&lt;p&gt;UserError: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction==&lt;br /&gt;
The aim of this tutorial is to allow Windows Half-Life 2 plugin coders to compile their plugins on the same machine as the windows binaries.&lt;br /&gt;
The binaries are compatible with 99% of all linux servers and do not suffer from bulky file sizes.&lt;br /&gt;
One of the main benefits to using this method of compiling is that your code can be left wherever you currently have it so that compile time reluctance is removed and coders can concentrate on coding the plugins instead of &amp;quot;How on earth am I to compile this for linux ???&amp;quot;.&lt;br /&gt;
All you need to get started are the base Cygwin installation, the CrossTool.tar.gz file and the makefile. Links to the latter two are included at the end of the tutorial.&lt;br /&gt;
&lt;br /&gt;
This tutorial assumes the following.&lt;br /&gt;
&amp;lt;OL&amp;gt;&lt;br /&gt;
&amp;lt;LI&amp;gt;You currently have a plugin which you can compile on windows using MSVC.&lt;br /&gt;
&amp;lt;LI&amp;gt;You have a copy of the HL2SDK Source Code installed on your hard drive.&lt;br /&gt;
&amp;lt;LI&amp;gt;You have a copy of the [http://www.sourcemm.net Metamod:Source] source code on your hard drive.&lt;br /&gt;
&amp;lt;/OL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Although the cross compiler will allow for compiling of Valves standard plugins, I do not include a Makefile or instructions on how to successfully accomplish this.&lt;br /&gt;
&lt;br /&gt;
==Installing Cygwin==&lt;br /&gt;
First, download CygWin from [http://www.cygwin.com www.CygWin.com] by clicking on &amp;quot;Install Now&amp;quot; located in the middle of the page.&lt;br /&gt;
&lt;br /&gt;
Once the download finishes, run &amp;lt;i&amp;gt;setup.exe&amp;lt;/i&amp;gt;&lt;br /&gt;
Click 'Next' on the introduction screen.&lt;br /&gt;
&lt;br /&gt;
On the second page, select 'Install from Internet'.&amp;lt;br&amp;gt;&lt;br /&gt;
The following page is all user preferances, except the 'Default Text File Type' which is recommended you use 'Unix / binary'.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
After clicking next, you are prompted for a CygWin temporary folder, any folder will suffice, the default is usually the better option.&amp;lt;br&amp;gt;&lt;br /&gt;
The next screen's options are firewall/proxy settings, these are specific to the Computer/Network you are currently using.&amp;lt;br&amp;gt;&lt;br /&gt;
Once you click next on the previous screen, the installer will download a list of mirror sites containing the CygWin binaries. Select one which you think is closest to you for a faster installation time.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Finaly, you are presented with a 'Select Packages' screen.&amp;lt;br&amp;gt;&lt;br /&gt;
I *think* it should work fine without all of the dev packages.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If anyone has gotten this to work by selecting less packages, please let me know so I can remove them from this list.&amp;lt;br&amp;gt;&lt;br /&gt;
Items marked in bold are extremely important.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*binutils&lt;br /&gt;
*&amp;lt;b&amp;gt;bzip2&amp;lt;/b&amp;gt;&lt;br /&gt;
*cygutils&lt;br /&gt;
*gcc&lt;br /&gt;
*&amp;lt;b&amp;gt;glib&amp;lt;/b&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;gzip&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*libiconv&lt;br /&gt;
*&amp;lt;b&amp;gt;make&amp;lt;/b&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;zlib&amp;lt;/b&amp;gt;&lt;br /&gt;
*&amp;lt;b&amp;gt;grep&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Click next and it should install the packages to the target path you specified.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Installing CrossTool==&lt;br /&gt;
Download the CrossCompiler from one of the mirrors below to the root cygwin folder &amp;lt;i&amp;gt;(c:\cygwin)&amp;lt;/i&amp;gt;.&lt;br /&gt;
If it gets renamed to 'crosstool_gcc-3.4.1.tar.tar' please rename it to 'crosstool_gcc-3.4.1.tar.gz'.&lt;br /&gt;
Download Mirrors for 'crosstool_gcc.tar.gz'&lt;br /&gt;
*[http://files.filefront.com/crosstool_gcc_341targz/;4650645;;/fileinfo.html FileFront]&lt;br /&gt;
*[http://downloads.punkassfraggers.com/redirect.php?dlid=1224 PunkAssFraggers.com]&lt;br /&gt;
&lt;br /&gt;
This is the most important part of the entire tutorial.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Do not try and extract 'crosstool_gcc-3.4.1.tar.gz' using any Windows Archiving utility !&amp;lt;/b&amp;gt;&lt;br /&gt;
They do not extract the files correctly and if you don't get errors during the extraction, you will while trying to compile !&lt;br /&gt;
Once the download is complete, run cygwin by navigating to the cygwin root folder, and double clicking on &amp;lt;i&amp;gt;'cygwin.bat'&amp;lt;/i&amp;gt;.&lt;br /&gt;
Type the following two commands in order into the cygwin bash shell followed by the enter key:&lt;br /&gt;
&lt;br /&gt;
  cd /&lt;br /&gt;
  tar -xzf crosstool_gcc-3.4.1.tar.gz&lt;br /&gt;
&lt;br /&gt;
This will start extracting the tar file to the '&amp;lt;cygroot&amp;gt;/opt' folder on your hard drive.&lt;br /&gt;
And thats it, now you have the pre-compiled GCC 3.4.1 [http://www.lduke.com (Thanks LDuke)] installed on your computer you can compile server plugins for both regular and SourceMM flavours with ease and compatibility with Valves GCC 3.4.1 requirements.&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Compiling Plugins==&lt;br /&gt;
Download the Makefile by clicking on [http://www.c0ld.net/Tutorials/CrossTool/Makefile this link.]&lt;br /&gt;
&lt;br /&gt;
Save it to your project's root source folder and open it with a text editor like notepad.&amp;lt;br&amp;gt;&lt;br /&gt;
Inside the Makfile I have shown examples on how your paths are translated into unix/cygwin hybrid paths.&amp;lt;br&amp;gt;&lt;br /&gt;
So, before trying any compling just yet, you need to insert the paths for the following.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;HL2SDK&amp;lt;/b&amp;gt;: The path to where your HL2SDK files are located.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;SMM_ROOT&amp;lt;/b&amp;gt;: The path to where you extracted the contents of the [http://www.sourcemm.net/ SourceMM package]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;SRCDS&amp;lt;/b&amp;gt;: The path to the linux SRCDS binaries.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;PLUGIN&amp;lt;/b&amp;gt;: The plugin filename.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the convenience of those who dont have access to a linux srcds installation, you can grab the files required at one of the mirrors below.&amp;lt;br&amp;gt;&lt;br /&gt;
Extract them to a new folder which will be your SRCDS path in the Makefile.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Note:&amp;lt;/b&amp;gt;The bin folder must be inside the srcds folder for maximum compatibility. For example, your files end up being something like this 'C:\MyFiles\srcds_l\bin\vstdlib_i486.so'.&lt;br /&gt;
&lt;br /&gt;
So, in your Makefile, SRCDS would be '/cygdrive/c/MyFiles/srcds_l'&lt;br /&gt;
&lt;br /&gt;
Download Mirrors for 'srcds_l_binaries.zip'&lt;br /&gt;
*[http://files.filefront.com/srcds_l_binarieszip/;4651213;;/fileinfo.html FileFront Mirror]&lt;br /&gt;
*[http://rapidshare.de/files/11597264/srcds_l_binaries.zip.html RapidShare.de Mirror]&lt;br /&gt;
Now you're ready to try compiling.&lt;br /&gt;
Back to the cygwin bash window, and we're now going to have to navigate to your code's location.&lt;br /&gt;
An exmaple path could be 'C:\MyCode\MyPlugin\' so in the bash shell we type the following:&lt;br /&gt;
&lt;br /&gt;
  cd /cygdrive/c/MyCode/MyPlugin/&lt;br /&gt;
  make&lt;br /&gt;
&lt;br /&gt;
If all your paths are set correctly, it should start compiling the plugin.&lt;br /&gt;
Ignore all the warnings in the HL2SDK, they are harmless.&lt;br /&gt;
What you should be looking out for are errors and warnings located inside your own code.&lt;br /&gt;
Unfortunately I cannot compile plugins for you, but there is a forum dedicated to helping you with hl2sdk coding problems.&lt;br /&gt;
&lt;br /&gt;
[http://forums.alliedmods.net/forumdisplay.php?f=75 Click here to visit the forum]&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
*Tutorial by: Jason &amp;quot;c0ldfyr3&amp;quot; Croghan&lt;br /&gt;
*Cross Compiler compiled by: L. Duke&lt;br /&gt;
*Makefile originally written by: David &amp;quot;BAILOPAN&amp;quot; Anderson&lt;br /&gt;
*Converted to Wiki by: James &amp;quot;sslice&amp;quot; Gray&lt;br /&gt;
&lt;br /&gt;
Original Location: http://www.c0ld.net/index.php?inc=CrossTool&lt;br /&gt;
&lt;br /&gt;
[[Category:Documentation (SourceMM)]]&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:UserError&amp;diff=3102</id>
		<title>User:UserError</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:UserError&amp;diff=3102"/>
		<updated>2006-06-26T07:38:51Z</updated>

		<summary type="html">&lt;p&gt;UserError: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An empty page? --[[User:UserError|UserError]] 03:38, 26 June 2006 (EDT)&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User_talk:UserError&amp;diff=3101</id>
		<title>User talk:UserError</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User_talk:UserError&amp;diff=3101"/>
		<updated>2006-06-26T07:38:24Z</updated>

		<summary type="html">&lt;p&gt;UserError: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Speak to me! --[[User:UserError|UserError]] 03:38, 26 June 2006 (EDT)&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.alliedmods.net/index.php?title=User:UserError&amp;diff=3100</id>
		<title>User:UserError</title>
		<link rel="alternate" type="text/html" href="https://wiki.alliedmods.net/index.php?title=User:UserError&amp;diff=3100"/>
		<updated>2006-06-26T07:38:03Z</updated>

		<summary type="html">&lt;p&gt;UserError: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[User:UserError|UserError]] 03:38, 26 June 2006 (EDT)&lt;/div&gt;</summary>
		<author><name>UserError</name></author>
		
	</entry>
</feed>