plugins/include/sourcemod.inc
author Scott Ehlert <ds@alliedmods.net>
Sun Mar 30 07:00:22 2008 +0000 (2008-03-30)
changeset 1952 b7aa2b626807
child 1972 3ff99318dc01
permissions -rw-r--r--
Spring Cleaning, Part Ichi (1)
Various minor things done to project files
Updated sample extension project file and updated makefile to the new unified version (more changes likely on the way)
Updated regex project file and makefile
ds@1952
     1
/**
ds@1952
     2
 * vim: set ts=4 :
ds@1952
     3
 * =============================================================================
ds@1952
     4
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
ds@1952
     5
 * =============================================================================
ds@1952
     6
 *
ds@1952
     7
 * This file is part of the SourceMod/SourcePawn SDK.
ds@1952
     8
 *
ds@1952
     9
 * This program is free software; you can redistribute it and/or modify it under
ds@1952
    10
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1952
    11
 * Free Software Foundation.
ds@1952
    12
 * 
ds@1952
    13
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1952
    14
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1952
    15
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1952
    16
 * details.
ds@1952
    17
 *
ds@1952
    18
 * You should have received a copy of the GNU General Public License along with
ds@1952
    19
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ds@1952
    20
 *
ds@1952
    21
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1952
    22
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1952
    23
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1952
    24
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1952
    25
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1952
    26
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1952
    27
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1952
    28
 * or <http://www.sourcemod.net/license.php>.
ds@1952
    29
 *
ds@1952
    30
 * Version: $Id$
ds@1952
    31
 */
ds@1952
    32
ds@1952
    33
#if defined _sourcemod_included
ds@1952
    34
 #endinput
ds@1952
    35
#endif
ds@1952
    36
#define _sourcemod_included
ds@1952
    37
ds@1952
    38
/**
ds@1952
    39
 * Plugin public information.
ds@1952
    40
 */
ds@1952
    41
struct Plugin
ds@1952
    42
{
ds@1952
    43
   const String:name[],			/**< Plugin Name */
ds@1952
    44
   const String:description[],	/**< Plugin Description */
ds@1952
    45
   const String:author[],		/**< Plugin Author */
ds@1952
    46
   const String:version[],		/**< Plugin Version */
ds@1952
    47
   const String:url[],			/**< Plugin URL */
ds@1952
    48
};
ds@1952
    49
ds@1952
    50
#include <core>
ds@1952
    51
#include <float>
ds@1952
    52
#include <vector>
ds@1952
    53
#include <string>
ds@1952
    54
#include <handles>
ds@1952
    55
#include <functions>
ds@1952
    56
#include <files>
ds@1952
    57
#include <logging>
ds@1952
    58
#include <timers>
ds@1952
    59
#include <admin>
ds@1952
    60
#include <dbi>
ds@1952
    61
#include <lang>
ds@1952
    62
#include <sorting>
ds@1952
    63
#include <textparse>
ds@1952
    64
#include <clients>
ds@1952
    65
#include <console>
ds@1952
    66
#include <events>
ds@1952
    67
#include <bitbuffer>
ds@1952
    68
#include <usermessages>
ds@1952
    69
#include <keyvalues>
ds@1952
    70
#include <menus>
ds@1952
    71
#include <halflife>
ds@1952
    72
#include <adt>
ds@1952
    73
#include <banning>
ds@1952
    74
#include <commandfilters>
ds@1952
    75
ds@1952
    76
/**
ds@1952
    77
 * Declare this as a struct in your plugin to expose its information.
ds@1952
    78
 * Example:
ds@1952
    79
 *
ds@1952
    80
 * public Plugin:myinfo =
ds@1952
    81
 * {
ds@1952
    82
 *    name = "My Plugin",
ds@1952
    83
 *    //etc
ds@1952
    84
 * };
ds@1952
    85
 */
ds@1952
    86
public Plugin:myinfo;
ds@1952
    87
 
ds@1952
    88
/**
ds@1952
    89
 * Called when the plugin is fully initialized and all known external references 
ds@1952
    90
 * are resolved. This is only called once in the lifetime of the plugin, and is 
ds@1952
    91
 * paired with OnPluginEnd().
ds@1952
    92
 *
ds@1952
    93
 * If any run-time error is thrown during this callback, the plugin will be marked 
ds@1952
    94
 * as failed.
ds@1952
    95
 *
ds@1952
    96
 * It is not necessary to close any handles or remove hooks in this function.  
ds@1952
    97
 * SourceMod guarantees that plugin shutdown automatically and correctly releases 
ds@1952
    98
 * all resources.
ds@1952
    99
 *
ds@1952
   100
 * @noreturn
ds@1952
   101
 */
ds@1952
   102
forward OnPluginStart();
ds@1952
   103
 
ds@1952
   104
/**
ds@1952
   105
 * Called before OnPluginStart, in case the plugin wants to check for load failure.
ds@1952
   106
 * This is called even if the plugin type is "private."  Any natives from modules are 
ds@1952
   107
 * not available at this point.  Thus, this forward should only be used for explicit 
ds@1952
   108
 * pre-emptive things, such as adding dynamic natives, or setting certain types of load filters.
ds@1952
   109
 * 
ds@1952
   110
 * @note It is not safe to call externally resolved natives until OnPluginStart().
ds@1952
   111
 * @note Any sort of RTE in this function will cause the plugin to fail loading.
ds@1952
   112
 * @note You MUST remember to return SOMETHING here.  The act of not returning is 
ds@1952
   113
 *       equivalent to returning 0 (false).  If you forgot to return, it will 
ds@1952
   114
 *       cause your plugin to not load with a very strange error message.
ds@1952
   115
 *
ds@1952
   116
 * @param myself	Handle to the plugin.
ds@1952
   117
 * @param late		Whether or not the plugin was loaded "late" (after map load).
ds@1952
   118
 * @param error		Error message buffer in case load failed.
ds@1952
   119
 * @param err_max	Maximum number of characters for error message buffer.
ds@1952
   120
 * @return			True if load success, false otherwise.
ds@1952
   121
 */
ds@1952
   122
forward bool:AskPluginLoad(Handle:myself, bool:late, String:error[], err_max);
ds@1952
   123
ds@1952
   124
/**
ds@1952
   125
 * Called when the plugin is about to be unloaded.
ds@1952
   126
 *
ds@1952
   127
 * @noreturn
ds@1952
   128
 */
ds@1952
   129
forward OnPluginEnd();
ds@1952
   130
ds@1952
   131
/**
ds@1952
   132
 * Called when the plugin's pause status is changing.
ds@1952
   133
 *
ds@1952
   134
 * @param pause			True if the plugin is being paused, false otherwise.
ds@1952
   135
 * @noreturn
ds@1952
   136
 */
ds@1952
   137
forward OnPluginPauseChange(bool:pause);
ds@1952
   138
ds@1952
   139
/**
ds@1952
   140
 * Called before every server frame.  Note that you should avoid
ds@1952
   141
 * doing expensive computations here, and you should declare large
ds@1952
   142
 * local arrays using 'decl' instead of 'new'.
ds@1952
   143
 */
ds@1952
   144
forward OnGameFrame();
ds@1952
   145
ds@1952
   146
/**
ds@1952
   147
 * Called when the map is loaded.
ds@1952
   148
 *
ds@1952
   149
 * @note This used to be OnServerLoad(), which is now deprecated.
ds@1952
   150
 * Plugins still using the old forward will work.
ds@1952
   151
 */
ds@1952
   152
forward OnMapStart();
ds@1952
   153
ds@1952
   154
/**
ds@1952
   155
 * Called right before a map ends.
ds@1952
   156
 */
ds@1952
   157
forward OnMapEnd();
ds@1952
   158
ds@1952
   159
/**
ds@1952
   160
 * Called when the map has loaded, servercfgfile (server.cfg) has been 
ds@1952
   161
 * executed, and all plugin configs are done executing.  This is the best
ds@1952
   162
 * place to initialize plugin functions which are based on cvar data.  
ds@1952
   163
 *
ds@1952
   164
 * @note This will always be called once and only once per map.  It will be 
ds@1952
   165
 * called after OnMapStart().
ds@1952
   166
 *
ds@1952
   167
 * @noreturn
ds@1952
   168
 */
ds@1952
   169
forward OnConfigsExecuted();
ds@1952
   170
ds@1952
   171
/**
ds@1952
   172
 * @deprecated Use OnConfigsExecuted() instead.
ds@1952
   173
 */
ds@1952
   174
#pragma deprecated Use OnConfigsExecuted() instead
ds@1952
   175
forward OnServerCfg();
ds@1952
   176
ds@1952
   177
/**
ds@1952
   178
 * Called after all plugins have been loaded.  This is called once for 
ds@1952
   179
 * every plugin.  If a plugin late loads, it will be called immediately 
ds@1952
   180
 * after OnPluginStart().
ds@1952
   181
 */
ds@1952
   182
forward OnAllPluginsLoaded();
ds@1952
   183
ds@1952
   184
/**
ds@1952
   185
 * Returns the calling plugin's Handle.
ds@1952
   186
 *
ds@1952
   187
 * @return				Handle of the calling plugin.
ds@1952
   188
 */
ds@1952
   189
native Handle:GetMyHandle();
ds@1952
   190
ds@1952
   191
/**
ds@1952
   192
 * Returns an iterator that can be used to search through plugins.
ds@1952
   193
 *
ds@1952
   194
 * @return				Handle to iterate with.  Must be closed via 
ds@1952
   195
 * 						CloseHandle().
ds@1952
   196
 * @error				Invalid Handle.
ds@1952
   197
 */
ds@1952
   198
native Handle:GetPluginIterator();
ds@1952
   199
ds@1952
   200
/**
ds@1952
   201
 * Returns whether there are more plugins available in the iterator.
ds@1952
   202
 *
ds@1952
   203
 * @param iter			Handle to the plugin iterator.
ds@1952
   204
 * @return				True on more plugins, false otherwise.
ds@1952
   205
 * @error				Invalid Handle.
ds@1952
   206
 */
ds@1952
   207
native bool:MorePlugins(Handle:iter);
ds@1952
   208
ds@1952
   209
/**
ds@1952
   210
 * Returns the current plugin in the iterator and advances the iterator.
ds@1952
   211
 *
ds@1952
   212
 * @param iter			Handle to the plugin iterator.
ds@1952
   213
 * @return				Current plugin the iterator is at, before
ds@1952
   214
 *						the iterator is advanced.
ds@1952
   215
 * @error				Invalid Handle.
ds@1952
   216
 */
ds@1952
   217
native Handle:ReadPlugin(Handle:iter);
ds@1952
   218
ds@1952
   219
/**
ds@1952
   220
 * Returns a plugin's status.
ds@1952
   221
 *
ds@1952
   222
 * @param plugin		Plugin Handle (INVALID_HANDLE uses the calling plugin).
ds@1952
   223
 * @return				Status code for the plugin.
ds@1952
   224
 * @error				Invalid Handle.
ds@1952
   225
 */
ds@1952
   226
native PluginStatus:GetPluginStatus(Handle:plugin);
ds@1952
   227
ds@1952
   228
/**
ds@1952
   229
 * Retrieves a plugin's file name relative to the plugins folder.
ds@1952
   230
 *
ds@1952
   231
 * @param plugin		Plugin Handle (INVALID_HANDLE uses the calling plugin).
ds@1952
   232
 * @param buffer		Buffer to the store the file name.
ds@1952
   233
 * @param maxlength		Maximum length of the name buffer.
ds@1952
   234
 * @noreturn
ds@1952
   235
 * @error				Invalid Handle.
ds@1952
   236
 */
ds@1952
   237
native GetPluginFilename(Handle:plugin, String:buffer[], maxlength);
ds@1952
   238
ds@1952
   239
/**
ds@1952
   240
 * Retrieves whether or not a plugin is being debugged.
ds@1952
   241
 *
ds@1952
   242
 * @param plugin		Plugin Handle (INVALID_HANDLE uses the calling plugin).
ds@1952
   243
 * @return				True if being debugged, false otherwise.
ds@1952
   244
 * @error				Invalid Handle.
ds@1952
   245
 */
ds@1952
   246
native bool:IsPluginDebugging(Handle:hndl);
ds@1952
   247
ds@1952
   248
/**
ds@1952
   249
 * Retrieves a plugin's public info.
ds@1952
   250
 *
ds@1952
   251
 * @param plugin		Plugin Handle (INVALID_HANDLE uses the calling plugin).
ds@1952
   252
 * @param info			Plugin info property to retrieve.
ds@1952
   253
 * @param buffer		Buffer to store info in.
ds@1952
   254
 * @param maxlength		Maximum length of buffer.
ds@1952
   255
 * @return				True on success, false if property is not available.
ds@1952
   256
 * @error				Invalid Handle.
ds@1952
   257
 */
ds@1952
   258
native bool:GetPluginInfo(Handle:plugin, PluginInfo:info, String:buffer[], maxlength);
ds@1952
   259
ds@1952
   260
/**
ds@1952
   261
 * Finds a plugin by its order in the list from the "plugins list" server 
ds@1952
   262
 * "sm" command.  You should not use this function to loop through all plugins, 
ds@1952
   263
 * use the iterator instead.  Looping through all plugins using this native 
ds@1952
   264
 * is O(n^2), whereas using the iterator is O(n).
ds@1952
   265
 *
ds@1952
   266
 * @param order_num		Number of the plugin as it appears in "sm plugins list".
ds@1952
   267
 * @return				Plugin Handle on success, INVALID_HANDLE if no plugin 
ds@1952
   268
 *						matches the given number.
ds@1952
   269
 */
ds@1952
   270
native Handle:FindPluginByNumber(order_num);
ds@1952
   271
ds@1952
   272
/**
ds@1952
   273
 * Causes the plugin to enter a failed state.  An error will be thrown and
ds@1952
   274
 * the plugin will be paused until it is unloaded or reloaded.
ds@1952
   275
 *
ds@1952
   276
 * For backwards compatibility, if no extra arguments are passed, no 
ds@1952
   277
 * formatting is applied.  If one or more additional arguments is passed, 
ds@1952
   278
 * the string is formatted using Format().  If any errors are encountered 
ds@1952
   279
 * during formatting, both the format specifier string and an additional 
ds@1952
   280
 * error message are written.
ds@1952
   281
 *
ds@1952
   282
 * This function does not return, and no further code in the plugin is 
ds@1952
   283
 * executed.
ds@1952
   284
 *
ds@1952
   285
 * @param string		Format specifier string.
ds@1952
   286
 * @param ...			Formatting arguments.
ds@1952
   287
 * @noreturn
ds@1952
   288
 * @error				Always throws SP_ERROR_ABORT.
ds@1952
   289
 */
ds@1952
   290
native SetFailState(const String:string[], any:...);
ds@1952
   291
ds@1952
   292
/**
ds@1952
   293
 * Aborts the current callback and throws an error.  This function
ds@1952
   294
 * does not return in that no code is executed following it.
ds@1952
   295
 *
ds@1952
   296
 * @param format		String format.
ds@1952
   297
 * @param ...			Format arguments.
ds@1952
   298
 * @noreturn
ds@1952
   299
 * @error				Always!
ds@1952
   300
 */
ds@1952
   301
native ThrowError(const String:fmt[], any:...);
ds@1952
   302
ds@1952
   303
/**
ds@1952
   304
 * Gets the system time as a unix timestamp.
ds@1952
   305
 *
ds@1952
   306
 * @param bigStamp		Optional array to store the 64bit timestamp in.
ds@1952
   307
 * @return				32bit timestamp (number of seconds since unix epoch).
ds@1952
   308
 */
ds@1952
   309
native GetTime(bigStamp[2]={0,0});
ds@1952
   310
ds@1952
   311
/**
ds@1952
   312
 * Produces a date and/or time string value for a timestamp.
ds@1952
   313
 *
ds@1952
   314
 * See this URL for valid parameters: 
ds@1952
   315
 * http://opengroup.org/onlinepubs/007908799/xsh/strftime.html
ds@1952
   316
 *
ds@1952
   317
 * @param buffer		Destination string buffer.
ds@1952
   318
 * @param maxlength		Maximum length of output string buffer.
ds@1952
   319
 * @param format		Formatting rules (passing NULL_STRING will use the rules defined in sm_datetime_format).
ds@1952
   320
 * @param stamp			Optional time stamp.
ds@1952
   321
 * @noreturn
ds@1952
   322
 * @error			Buffer too small or invalid time format.
ds@1952
   323
 */
ds@1952
   324
native FormatTime(String:buffer[], maxlength, const String:format[], stamp=-1);
ds@1952
   325
ds@1952
   326
/**
ds@1952
   327
 * Loads a game config file.
ds@1952
   328
 *
ds@1952
   329
 * @param file			File to load.  The path must be relative to the 'gamedata' folder under the config folder 
ds@1952
   330
 *					and the extension should be omitted.
ds@1952
   331
 * @return			A handle to the game config file or INVALID_HANDLE in failure.
ds@1952
   332
 */
ds@1952
   333
native Handle:LoadGameConfigFile(const String:file[]);
ds@1952
   334
ds@1952
   335
/**
ds@1952
   336
 * Returns an offset value.
ds@1952
   337
 *
ds@1952
   338
 * @param gc			Game config handle.
ds@1952
   339
 * @param key			Key to retrieve from the offset section.
ds@1952
   340
 * @return			An offset, or -1 on failure.
ds@1952
   341
 */
ds@1952
   342
native GameConfGetOffset(Handle:gc, const String:key[]);
ds@1952
   343
ds@1952
   344
/**
ds@1952
   345
 * Gets the value of a key from the "Keys" section.
ds@1952
   346
 *
ds@1952
   347
 * @param gc			Game config handle.
ds@1952
   348
 * @param key			Key to retrieve from the Keys section.
ds@1952
   349
 * @param buffer		Destination string buffer.
ds@1952
   350
 * @param maxlen		Maximum length of output string buffer.
ds@1952
   351
 * @return				True if key existed, false otherwise.
ds@1952
   352
 */
ds@1952
   353
native bool:GameConfGetKeyValue(Handle:gc, const String:key[], String:buffer[], maxlen);
ds@1952
   354
ds@1952
   355
/**
ds@1952
   356
 * Returns the operating system's "tick count," which is a number of 
ds@1952
   357
 * milliseconds since the operating system loaded.  This can be used
ds@1952
   358
 * for basic benchmarks.
ds@1952
   359
 *
ds@1952
   360
 * @return				Tick count in milliseconds.
ds@1952
   361
 */
ds@1952
   362
native GetSysTickCount();
ds@1952
   363
ds@1952
   364
/**
ds@1952
   365
 * Specifies that the given config file should be executed after plugin load.
ds@1952
   366
 * OnConfigsExecuted() will not be called until the config file has executed, 
ds@1952
   367
 * but it will be called if the execution fails.
ds@1952
   368
 *
ds@1952
   369
 * @param autoCreate	If true, and the config file does not exist, such a config
ds@1952
   370
 *						file will be automatically created and populated with
ds@1952
   371
 *						information from the plugin's registered cvars.
ds@1952
   372
 * @param name			Name of the config file, excluding the .cfg extension.
ds@1952
   373
 *						If empty, <plugin.filename.cfg> is assumed.
ds@1952
   374
 * @param folder		Folder under cfg/ to use.  By default this is "sourcemod."
ds@1952
   375
 * @noreturn
ds@1952
   376
 */
ds@1952
   377
native AutoExecConfig(bool:autoCreate=true, const String:name[]="", const String:folder[]="sourcemod");
ds@1952
   378
ds@1952
   379
/**
ds@1952
   380
 * Sets a native as optional, such that if it is unloaded, removed,
ds@1952
   381
 * or otherwise non-existent, the plugin will still work.  Calling
ds@1952
   382
 * removed natives results in a run-time error.
ds@1952
   383
 *
ds@1952
   384
 * @param name			Native name.
ds@1952
   385
 * @noreturn
ds@1952
   386
 */
ds@1952
   387
native MarkNativeAsOptional(const String:name[]);
ds@1952
   388
ds@1952
   389
/**
ds@1952
   390
 * Registers a library name for identifying as a dependency to 
ds@1952
   391
 * other plugins.
ds@1952
   392
 *
ds@1952
   393
 * @param name			Library name.
ds@1952
   394
 * @noreturn
ds@1952
   395
 */
ds@1952
   396
native RegPluginLibrary(const String:name[]);
ds@1952
   397
ds@1952
   398
/**
ds@1952
   399
 * Returns whether a library exists.  This function should be considered 
ds@1952
   400
 * expensive; it should only be called on plugin to determine availability 
ds@1952
   401
 * of resources.  Use OnLibraryAdded()/OnLibraryRemoved() to detect changes 
ds@1952
   402
 * in optional resources.
ds@1952
   403
 *
ds@1952
   404
 * @param name			Library name of a plugin or extension.
ds@1952
   405
 * @return				True if exists, false otherwise.
ds@1952
   406
 */
ds@1952
   407
native bool:LibraryExists(const String:name[]);
ds@1952
   408
ds@1952
   409
/**
ds@1952
   410
 * Returns the status of an extension, by filename.
ds@1952
   411
 *
ds@1952
   412
 * @param name			Extension name (like "sdktools.ext").
ds@1952
   413
 * @param error			Optional error message buffer.
ds@1952
   414
 * @param maxlength		Length of optional error message buffer.
ds@1952
   415
 * @return				-2 if the extension was not found.
ds@1952
   416
 *						-1 if the extension was found but failed to load.
ds@1952
   417
 * 						 0 if the extension loaded but reported an error.
ds@1952
   418
 * 						 1 if the extension is running without error.
ds@1952
   419
 */
ds@1952
   420
native GetExtensionFileStatus(const String:name[], String:error[]="", maxlength=0);
ds@1952
   421
ds@1952
   422
/**
ds@1952
   423
 * Called after a library is added that the current plugin references 
ds@1952
   424
 * optionally. A library is either a plugin name or extension name, as 
ds@1952
   425
 * exposed via its include file.
ds@1952
   426
 *
ds@1952
   427
 * @param name			Library name.
ds@1952
   428
 */
ds@1952
   429
forward OnLibraryAdded(const String:name[]);
ds@1952
   430
ds@1952
   431
/**
ds@1952
   432
 * Called right before a library is removed that the current plugin references 
ds@1952
   433
 * optionally.  A library is either a plugin name or extension name, as 
ds@1952
   434
 * exposed via its include file.
ds@1952
   435
 *
ds@1952
   436
 * @param name			Library name.
ds@1952
   437
 */
ds@1952
   438
forward OnLibraryRemoved(const String:name[]);
ds@1952
   439
ds@1952
   440
#define MAPLIST_FLAG_MAPSFOLDER		(1<<0)		/**< On failure, use all maps in the maps folder. */
ds@1952
   441
#define MAPLIST_FLAG_CLEARARRAY		(1<<1)		/**< If an input array is specified, clear it before adding. */
ds@1952
   442
#define MAPLIST_FLAG_NO_DEFAULT		(1<<2)		/**< Do not read "default" or "mapcyclefile" on failure. */
ds@1952
   443
ds@1952
   444
/**
ds@1952
   445
 * Loads a map list to an ADT Array.
ds@1952
   446
 *
ds@1952
   447
 * A map list is a list of maps from a file.  SourceMod allows easy configuration of 
ds@1952
   448
 * maplists through addons/sourcemod/configs/maplists.cfg.  Each entry is given a 
ds@1952
   449
 * name and a file (for example, "rtv" => "rtv.cfg"), or a name and a redirection 
ds@1952
   450
 * (for example, "rtv" => "default").  This native will read a map list entry, 
ds@1952
   451
 * cache the file, and return the list of maps it holds.  
ds@1952
   452
 *
ds@1952
   453
 * Serial change numbers are used to identify if a map list has changed.  Thus, if 
ds@1952
   454
 * you pass a serial change number and it's equal to what SourceMod currently knows 
ds@1952
   455
 * about the map list, then SourceMod won't reparse the file.
ds@1952
   456
 *
ds@1952
   457
 * If the maps end up being read from the maps folder (MAPLIST_FLAG_MAPSFOLDER), they 
ds@1952
   458
 * are automatically sorted in alphabetical, ascending order.
ds@1952
   459
 *
ds@1952
   460
 * Arrays created by this function are temporary and must be freed via CloseHandle().
ds@1952
   461
 * Modifying arrays created by this function will not affect future return values or 
ds@1952
   462
 * or the contents of arrays returned to other plugins.
ds@1952
   463
 *
ds@1952
   464
 * @param array			Array to store the map list.  If INVALID_HANDLE, a new blank 
ds@1952
   465
 *						array will be created.  The blocksize should be at least 16; 
ds@1952
   466
 *						otherwise results may be truncated.  Items are added to the array 
ds@1952
   467
 *						as strings.  The array is never checked for duplicates, and it is 
ds@1952
   468
 *						not read beforehand.  Only the serial number is used to detect 
ds@1952
   469
 *						changes.
ds@1952
   470
 * @param serial		Serial number to identify last known map list change.  If -1, the 
ds@1952
   471
 *						the value will not be checked.  If the map list has since changed, 
ds@1952
   472
 *						the serial is updated (even if -1 was passed).  If there is an error 
ds@1952
   473
 *						finding a valid maplist, then the serial is set to -1.
ds@1952
   474
 * @param str			Config name, or "default" for the default map list.  Config names 
ds@1952
   475
 *						should be somewhat descriptive.  For example, the admin menu uses 
ds@1952
   476
 *						a config name of "admin menu".  The list names can be configured 
ds@1952
   477
 *						by users in addons/sourcemod/configs/maplists.cfg.
ds@1952
   478
 * @param flags			MAPLIST_FLAG flags.
ds@1952
   479
 * @return				On failure:
ds@1952
   480
 *						 INVALID_HANDLE is returned, the serial is set to -1, and the input 
ds@1952
   481
 *						 array (if any) is left unchanged.
ds@1952
   482
 *						On no change:
ds@1952
   483
 						 INVALID_HANDLE is returned, the serial is unchanged, and the input 
ds@1952
   484
 						 array (if any) is left unchanged.
ds@1952
   485
 *						On success:
ds@1952
   486
 *						 A valid array Handle is returned, containing at least one map string.  
ds@1952
   487
 *						 If an array was passed, the return value is equal to the passed Array 
ds@1952
   488
 *						 Handle.  If the passed array was not cleared, it will have grown by at 
ds@1952
   489
 *						 least one item.  The serial number is updated to a positive number.
ds@1952
   490
 * @error				Invalid array Handle that is not INVALID_HANDLE.
ds@1952
   491
 */
ds@1952
   492
native Handle:ReadMapList(Handle:array=INVALID_HANDLE,
ds@1952
   493
						  &serial=-1,
ds@1952
   494
						  const String:str[]="default",
ds@1952
   495
						  flags=MAPLIST_FLAG_CLEARARRAY);
ds@1952
   496
						  
ds@1952
   497
/**
ds@1952
   498
 * Makes a compatibility binding for map lists.  For example, if a function previously used 
ds@1952
   499
 * "clam.cfg" for map lists, this function will insert a "fake" binding to "clam.cfg" that 
ds@1952
   500
 * will be overridden if it's in the maplists.cfg file.
ds@1952
   501
 *
ds@1952
   502
 * @param name			Configuration name that would be used with ReadMapList().
ds@1952
   503
 * @param file			Default file to use.
ds@1952
   504
 * @noreturn
ds@1952
   505
 */
ds@1952
   506
native SetMapListCompatBind(const String:name[], const String:file[]);
ds@1952
   507
ds@1952
   508
/**
ds@1952
   509
 * Called when a client has sent chat text.  This must return either true or 
ds@1952
   510
 * false to indicate that a client is or is not spamming the server.
ds@1952
   511
 *
ds@1952
   512
 * The return value is a hint only.  Core or another plugin may decide 
ds@1952
   513
 * otherwise.
ds@1952
   514
 *
ds@1952
   515
 * @param client		Client index.  The server (0) will never be passed.
ds@1952
   516
 * @return				True if client is spamming the server, false otherwise.
ds@1952
   517
 */
ds@1952
   518
forward bool:OnClientFloodCheck(client);
ds@1952
   519
ds@1952
   520
/**
ds@1952
   521
 * Called after a client's flood check has been computed.  This can be used 
ds@1952
   522
 * by antiflood algorithms to decay/increase flooding weights.
ds@1952
   523
 *
ds@1952
   524
 * Since the result from "OnClientFloodCheck" isn't guaranteed to be the 
ds@1952
   525
 * final result, it is generally a good idea to use this to play with other 
ds@1952
   526
 * algorithms nicely.
ds@1952
   527
 *
ds@1952
   528
 * @param client		Client index.  The server (0) will never be passed.
ds@1952
   529
 * @param blocked		True if client flooded last "say", false otherwise.
ds@1952
   530
 * @noreturn
ds@1952
   531
 */
ds@1952
   532
forward OnClientFloodResult(client, bool:blocked);
ds@1952
   533
ds@1952
   534
#include <helpers>
ds@1952
   535
#include <entity>
ds@1952
   536
#include <entity_prop_stocks>
ds@1952
   537