AMX Mod X 1.76 Changes
AMX Mod X 1.76 will be a small feature release and contains mostly bug fixes. This changelog is brought to you by Batman and ramen.
New Plugin File Features
Per-Map Plugin Files
You can now have per-map plugin configuration files. AMX Mod X will automatically load any plugins listed in files having the following name: configs/maps/plugins-<map>.ini. Thus, de_dust specific plugins will be loaded from configs/maps/plugins-de_dust.ini.
Map-specific plugin files are parsed after the main plugins.ini is parsed, and after all secondary plugins-*.ini files are parsed in the configs folder. This means that a map-specific plugin listing inherits all settings above itself.
Disabling Plugins
A second feature was introduced to let users disable plugins per map. In any plugins-*.ini file, you may now add a "disabled" flag to a plugin name. This works like the "debug" flag. Example:
gaben.amxx disabled
This will block the plugin from being loaded from any other configuration file. So if plugins-de_dust.ini has the example line above, gaben.amxx will not be loaded from any other plugins file.
New Scripting Features
Sorting
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 Quick Sort algorithm.
Basic Sorting
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 Sort_Ascending, and Sort_Descending is available as well.
- SortIntegers() - Sorts an array of integers.
- SortFloats() - Sorts an array of floats.
- SortStrings() - Sorts an array of strings.
Examples
You can see an example of each native listed above in the sorting testing plugin.
Full Changelog
Core Changes
New Features
- The compiler has been heavily optimized and will now compile plugins much faster.
- Request am43012: You can now specify per-map plugins files. For example, you can list de_dust only plugins in configs/maps/plugins-de_dust.ini.
- You can now specify a new "disabled" 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.
- Added an experimental compatibility layer for AMX Mod. See AMX Mod Compatibility Layer (AMX Mod X) for more information.
- Request am42871: Source file name is shown in the binary logs when the plugin is in the debug mode.
- Request am44299: Error logs now show the mapname and current log file.
- The developer test suite is now packaged with Core in the scripting folder.
Bug Fixes
- 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.
- Fixed a bug where secondary plugin files would not autoload modules.
- 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.
- Fixed the JIT not being able to compute heaplow bounds problems.
- Fixed am41317: ExecuteForward() string parameters would be trashed on future internal string calls.
- Fixed am41777: time.txt was not included in the installer.
- Fixed am42213: "amx_logs" was incorrectly listed as "amx_logsdir" in core.ini.
- Request am41036: Improved bot detection.
- Fixed a rare bug where passing (1<<31) into a %d format-code would print garbage characters.
Scripting Changes
Additions
- Request am23838: Added natives to sort integers, floats, strings. Also added natives to sort custom 1D and 2D arrays using user comparison functions.
- Added vdformat() for formatting variable argument strings in dynamic natives.
- Added CreateLangKey() and AddTranslation() for manipulating the multilingual translator.
- Added SQL_GetInsertId() to MySQL and sqLite modules.
- For callfunc_push_str() and callfunc_push_array(), you can now specify an optional parameter to stop write-back on change.
- Request am42810: Added callfunc_push_array() to push an array through a callfunc.
- Request am42697: Added SQL_GetQueryString() to find the query string of a query handle.
- Request am29544: Added nvault_touch() native for updating key timestamps.
- Request am28110: Added tfc_get_user_goalitem() to determine if player is carrying a goal item (such as a flag or keycard)
- Request am41295: Added CZ model types to the CsInternalModel enumeration.
- Request am41635: All string formatting routines can now use '%u' to print integers as unsigned. Note that Pawn only supports signed arithmetic.
- Request am41585: Enhanced functionality of glb_pStringBase with global_get() and added a new return type to pev().
- Request am40967: set_fail_state() now logs that the plugin is failed.
- Request am41375: cs_set_weapon_silen() now has an additional parameter to toggle whether silencer animation is shown.
- Request am40169: cs_get_user_team() now has an additional parameter by reference to get the user's internal player model.
- Added amxx_setpl_curweap() to the native exports table.
- Added tfc_get/setweaponammo for ammo that is not in player's backpack.
- Engine's entity_get and entity_set routines no longer verify that players are fully ingame. This check was deemed too restrictive.
- Added hyperbolic trigonomic natives: floatsinh(), floatcosh(), and floattanh().
Bug Fixes
- Fixed am42916: get_user_aiming() did not work on Linux.
- Fixed am40963: GeoIP did not strip ports from IP addresses.
- Fixed am41483: xs.inc did not have double-include prevention.
- Fixed am43313: plugin_log() did not actually block log messages on returning PLUGIN_HANDLED.
- Fixed am42097: Hooking FM_ServerDeactivate did not work.
- Fixed am42307: nvault_open() did not return -1 on failure.
- Fixed am42383: SQL_ThreadQuery() was not working when called from plugin_end().
- Fixed am42321: TFC's Get/Set ammo natives did not work on Linux servers (thanks jRaven).
- Fixed am44776: user_silentkill() did not save the previous message block state.
- Fixed bug in get_user_aiming() where id and body would always be set to 0.
- Fixed bug in dllfunc() where DLLFunc_RegisterEncoders would not actually make a call.
- Fixed bug with floatatan() returning wrong values when trying to get angle in degrees or grades.
- Improved accuracy of is_user_bot().
- Rewrote replace_all() to address many serious bugs, including infinite replacements, improper re-indexing, and missed replacements.
Plugin Changes
Additions
- Request am41367: stats_logging.sma now logs extra weapons from CSX.
- Request am44517: Added "Spectator" to TFC plmenu.sma's team switch list (thanks jRaven).
Bug Fixes
- Fixed a potential memory corruption bug in StatsX.
- Fixed am42013: 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.
- Fixed am41768: statssounds.sma for TS had the wrong plugin name.
- Fixed am41563: TFC plmenu.sma had the wrong team names.
- Fixed am41259: amx_addadmin was messing users.ini upon new entries.
- Fixed am43881: adminslots did not work until a mapchange was issued.
Module Fixes
- Fixed MySQLX threader on Linux locking up on mapchange if there were queries in the queue.
- Fixed am41030: All stats modules could generate files that would break the file parser.
- Fixed am41961: Fakemeta hooks for GetPlayerAuthId, GetPlayerWONId, and IsMapValid were not being reset on mapchange.
- Fixed am44428: GeoIP country codes were out of date.
- Updated the GeoIP library to September.