|
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 |
|