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