|
dvander@429
|
1 |
/** |
|
ds@475
|
2 |
* vim: set ts=4 : |
|
ds@1330
|
3 |
* ============================================================================= |
|
ds@1947
|
4 |
* SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. |
|
ds@1330
|
5 |
* ============================================================================= |
|
ds@1330
|
6 |
* |
|
ds@1330
|
7 |
* This file is part of the SourceMod/SourcePawn SDK. |
|
dvander@429
|
8 |
* |
|
ds@1330
|
9 |
* This program is free software; you can redistribute it and/or modify it under |
|
ds@1330
|
10 |
* the terms of the GNU General Public License, version 3.0, as published by the |
|
ds@1330
|
11 |
* Free Software Foundation. |
|
ds@1330
|
12 |
* |
|
ds@1330
|
13 |
* This program is distributed in the hope that it will be useful, but WITHOUT |
|
ds@1330
|
14 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
|
ds@1330
|
15 |
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
|
ds@1330
|
16 |
* details. |
|
ds@1330
|
17 |
* |
|
ds@1330
|
18 |
* You should have received a copy of the GNU General Public License along with |
|
ds@1330
|
19 |
* this program. If not, see <http://www.gnu.org/licenses/>. |
|
ds@1330
|
20 |
* |
|
ds@1330
|
21 |
* As a special exception, AlliedModders LLC gives you permission to link the |
|
ds@1330
|
22 |
* code of this program (as well as its derivative works) to "Half-Life 2," the |
|
ds@1330
|
23 |
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software |
|
ds@1330
|
24 |
* by the Valve Corporation. You must obey the GNU General Public License in |
|
ds@1330
|
25 |
* all respects for all other code used. Additionally, AlliedModders LLC grants |
|
ds@1330
|
26 |
* this exception to all derivative works. AlliedModders LLC defines further |
|
ds@1330
|
27 |
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), |
|
ds@1330
|
28 |
* or <http://www.sourcemod.net/license.php>. |
|
dvander@429
|
29 |
* |
|
faluco@506
|
30 |
* Version: $Id$ |
|
dvander@429
|
31 |
*/ |
|
dvander@429
|
32 |
|
|
dvander@429
|
33 |
#if defined _sourcemod_included |
|
dvander@429
|
34 |
#endinput |
|
dvander@429
|
35 |
#endif |
|
dvander@429
|
36 |
#define _sourcemod_included |
|
dvander@429
|
37 |
|
|
dvander@619
|
38 |
/** |
|
dvander@619
|
39 |
* Plugin public information. |
|
dvander@619
|
40 |
*/ |
|
dvander@429
|
41 |
struct Plugin |
|
dvander@429
|
42 |
{ |
|
dvander@619
|
43 |
const String:name[], /**< Plugin Name */ |
|
dvander@619
|
44 |
const String:description[], /**< Plugin Description */ |
|
dvander@619
|
45 |
const String:author[], /**< Plugin Author */ |
|
dvander@619
|
46 |
const String:version[], /**< Plugin Version */ |
|
dvander@619
|
47 |
const String:url[], /**< Plugin URL */ |
|
dvander@429
|
48 |
}; |
|
dvander@429
|
49 |
|
|
dvander@429
|
50 |
#include <core> |
|
dvander@429
|
51 |
#include <float> |
|
dvander@1069
|
52 |
#include <vector> |
|
ds@873
|
53 |
#include <string> |
|
dvander@429
|
54 |
#include <handles> |
|
dvander@601
|
55 |
#include <functions> |
|
ds@873
|
56 |
#include <files> |
|
dvander@1914
|
57 |
#include <logging> |
|
dvander@643
|
58 |
#include <timers> |
|
ds@873
|
59 |
#include <admin> |
|
dvander@2357
|
60 |
#include <keyvalues> |
|
dvander@868
|
61 |
#include <dbi> |
|
ds@913
|
62 |
#include <lang> |
|
ds@873
|
63 |
#include <sorting> |
|
ds@913
|
64 |
#include <textparse> |
|
ds@873
|
65 |
#include <clients> |
|
ds@873
|
66 |
#include <console> |
|
ds@873
|
67 |
#include <events> |
|
ds@873
|
68 |
#include <bitbuffer> |
|
skamonkey@3743
|
69 |
#include <protobuf> |
|
ds@873
|
70 |
#include <usermessages> |
|
ds@873
|
71 |
#include <menus> |
|
ds@898
|
72 |
#include <halflife> |
|
dvander@1156
|
73 |
#include <adt> |
|
dvander@1423
|
74 |
#include <banning> |
|
dvander@1621
|
75 |
#include <commandfilters> |
|
pred@2133
|
76 |
#include <nextmap> |
|
ds@898
|
77 |
|
|
fyrenmoo@2675
|
78 |
enum APLRes |
|
fyrenmoo@2675
|
79 |
{ |
|
fyrenmoo@2675
|
80 |
APLRes_Success = 0, /**< Plugin should load */ |
|
fyrenmoo@2675
|
81 |
APLRes_Failure, /**< Plugin shouldn't load and should display an error */ |
|
fyrenmoo@2675
|
82 |
APLRes_SilentFailure /**< Plugin shouldn't load but do so silently */ |
|
fyrenmoo@2675
|
83 |
}; |
|
fyrenmoo@2675
|
84 |
|
|
dvander@429
|
85 |
/** |
|
dvander@429
|
86 |
* Declare this as a struct in your plugin to expose its information. |
|
dvander@429
|
87 |
* Example: |
|
dvander@429
|
88 |
* |
|
dvander@429
|
89 |
* public Plugin:myinfo = |
|
dvander@429
|
90 |
* { |
|
dvander@429
|
91 |
* name = "My Plugin", |
|
dvander@429
|
92 |
* //etc |
|
dvander@429
|
93 |
* }; |
|
dvander@429
|
94 |
*/ |
|
dvander@429
|
95 |
public Plugin:myinfo; |
|
dvander@429
|
96 |
|
|
dvander@429
|
97 |
/** |
|
dvander@1869
|
98 |
* Called when the plugin is fully initialized and all known external references |
|
dvander@1869
|
99 |
* are resolved. This is only called once in the lifetime of the plugin, and is |
|
dvander@1869
|
100 |
* paired with OnPluginEnd(). |
|
dvander@1869
|
101 |
* |
|
dvander@1869
|
102 |
* If any run-time error is thrown during this callback, the plugin will be marked |
|
dvander@1869
|
103 |
* as failed. |
|
dvander@429
|
104 |
* |
|
dvander@1914
|
105 |
* It is not necessary to close any handles or remove hooks in this function. |
|
dvander@1914
|
106 |
* SourceMod guarantees that plugin shutdown automatically and correctly releases |
|
dvander@1914
|
107 |
* all resources. |
|
dvander@1914
|
108 |
* |
|
dvander@429
|
109 |
* @noreturn |
|
dvander@429
|
110 |
*/ |
|
dvander@536
|
111 |
forward OnPluginStart(); |
|
fyrenmoo@2675
|
112 |
|
|
fyrenmoo@2675
|
113 |
/** |
|
fyrenmoo@2675
|
114 |
* @deprecated Use AskPluginLoad2() instead. |
|
fyrenmoo@2675
|
115 |
* If a plugin contains both AskPluginLoad() and AskPluginLoad2(), the former will |
|
fyrenmoo@2675
|
116 |
* not be called, but old plugins with only AskPluginLoad() will work. |
|
fyrenmoo@2675
|
117 |
*/ |
|
fyrenmoo@2675
|
118 |
#pragma deprecated Use AskPluginLoad2() instead |
|
fyrenmoo@2675
|
119 |
forward bool:AskPluginLoad(Handle:myself, bool:late, String:error[], err_max); |
|
fyrenmoo@2675
|
120 |
|
|
dvander@429
|
121 |
/** |
|
dvander@979
|
122 |
* Called before OnPluginStart, in case the plugin wants to check for load failure. |
|
dvander@429
|
123 |
* This is called even if the plugin type is "private." Any natives from modules are |
|
dvander@429
|
124 |
* not available at this point. Thus, this forward should only be used for explicit |
|
fyrenmoo@2675
|
125 |
* pre-emptive things, such as adding dynamic natives, setting certain types of load |
|
fyrenmoo@2675
|
126 |
* filters (such as not loading the plugin for certain games). |
|
dvander@429
|
127 |
* |
|
dvander@619
|
128 |
* @note It is not safe to call externally resolved natives until OnPluginStart(). |
|
dvander@619
|
129 |
* @note Any sort of RTE in this function will cause the plugin to fail loading. |
|
fyrenmoo@2675
|
130 |
* @note If you do not return anything, it is treated like returning success. |
|
fyrenmoo@2675
|
131 |
* @note If a plugin has an AskPluginLoad2(), AskPluginLoad() will not be called. |
|
fyrenmoo@2675
|
132 |
* |
|
dvander@429
|
133 |
* |
|
dvander@429
|
134 |
* @param myself Handle to the plugin. |
|
dvander@429
|
135 |
* @param late Whether or not the plugin was loaded "late" (after map load). |
|
dvander@429
|
136 |
* @param error Error message buffer in case load failed. |
|
dvander@429
|
137 |
* @param err_max Maximum number of characters for error message buffer. |
|
fyrenmoo@2675
|
138 |
* @return APLRes_Success for load success, APLRes_Failure or APLRes_SilentFailure otherwise |
|
dvander@429
|
139 |
*/ |
|
fyrenmoo@2675
|
140 |
forward APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max); |
|
dvander@429
|
141 |
|
|
dvander@429
|
142 |
/** |
|
dvander@429
|
143 |
* Called when the plugin is about to be unloaded. |
|
dvander@429
|
144 |
* |
|
dvander@429
|
145 |
* @noreturn |
|
dvander@429
|
146 |
*/ |
|
dvander@429
|
147 |
forward OnPluginEnd(); |
|
dvander@429
|
148 |
|
|
dvander@429
|
149 |
/** |
|
dvander@429
|
150 |
* Called when the plugin's pause status is changing. |
|
dvander@429
|
151 |
* |
|
ds@475
|
152 |
* @param pause True if the plugin is being paused, false otherwise. |
|
dvander@429
|
153 |
* @noreturn |
|
dvander@429
|
154 |
*/ |
|
dvander@429
|
155 |
forward OnPluginPauseChange(bool:pause); |
|
dvander@429
|
156 |
|
|
dvander@429
|
157 |
/** |
|
dvander@531
|
158 |
* Called before every server frame. Note that you should avoid |
|
dvander@531
|
159 |
* doing expensive computations here, and you should declare large |
|
dvander@531
|
160 |
* local arrays using 'decl' instead of 'new'. |
|
dvander@531
|
161 |
*/ |
|
dvander@531
|
162 |
forward OnGameFrame(); |
|
dvander@531
|
163 |
|
|
dvander@531
|
164 |
/** |
|
dvander@717
|
165 |
* Called when the map is loaded. |
|
dvander@717
|
166 |
* |
|
dvander@723
|
167 |
* @note This used to be OnServerLoad(), which is now deprecated. |
|
dvander@717
|
168 |
* Plugins still using the old forward will work. |
|
dvander@643
|
169 |
*/ |
|
dvander@717
|
170 |
forward OnMapStart(); |
|
dvander@643
|
171 |
|
|
dvander@643
|
172 |
/** |
|
dvander@718
|
173 |
* Called right before a map ends. |
|
dvander@718
|
174 |
*/ |
|
dvander@718
|
175 |
forward OnMapEnd(); |
|
dvander@718
|
176 |
|
|
dvander@718
|
177 |
/** |
|
dvander@978
|
178 |
* Called when the map has loaded, servercfgfile (server.cfg) has been |
|
dvander@978
|
179 |
* executed, and all plugin configs are done executing. This is the best |
|
dvander@1732
|
180 |
* place to initialize plugin functions which are based on cvar data. |
|
dvander@723
|
181 |
* |
|
dvander@978
|
182 |
* @note This will always be called once and only once per map. It will be |
|
dvander@978
|
183 |
* called after OnMapStart(). |
|
dvander@978
|
184 |
* |
|
dvander@978
|
185 |
* @noreturn |
|
dvander@723
|
186 |
*/ |
|
dvander@978
|
187 |
forward OnConfigsExecuted(); |
|
dvander@723
|
188 |
|
|
dvander@723
|
189 |
/** |
|
dvander@2065
|
190 |
* This is called once, right after OnMapStart() but any time before |
|
dvander@2065
|
191 |
* OnConfigsExecuted(). It is called after the "exec sourcemod.cfg" |
|
dvander@2065
|
192 |
* command and all AutoExecConfig() exec commands have been added to |
|
dvander@2065
|
193 |
* the ServerCommand() buffer. |
|
dvander@2065
|
194 |
* |
|
dvander@2065
|
195 |
* If you need to load per-map settings that override default values, |
|
dvander@2065
|
196 |
* adding commands to the ServerCommand() buffer here will guarantee |
|
dvander@2065
|
197 |
* that they're set before OnConfigsExecuted(). |
|
dvander@2065
|
198 |
* |
|
dvander@2065
|
199 |
* Unlike OnMapStart() and OnConfigsExecuted(), this is not called on |
|
dvander@2065
|
200 |
* late loads that occur after OnMapStart(). |
|
dvander@2065
|
201 |
* |
|
dvander@2065
|
202 |
* @noreturn |
|
dvander@2065
|
203 |
*/ |
|
dvander@2065
|
204 |
forward OnAutoConfigsBuffered(); |
|
dvander@2065
|
205 |
|
|
dvander@2065
|
206 |
/** |
|
dvander@979
|
207 |
* @deprecated Use OnConfigsExecuted() instead. |
|
dvander@979
|
208 |
*/ |
|
ds@1268
|
209 |
#pragma deprecated Use OnConfigsExecuted() instead |
|
dvander@979
|
210 |
forward OnServerCfg(); |
|
dvander@979
|
211 |
|
|
dvander@979
|
212 |
/** |
|
dvander@1630
|
213 |
* Called after all plugins have been loaded. This is called once for |
|
dvander@1630
|
214 |
* every plugin. If a plugin late loads, it will be called immediately |
|
dvander@1630
|
215 |
* after OnPluginStart(). |
|
faluco@1221
|
216 |
*/ |
|
faluco@1221
|
217 |
forward OnAllPluginsLoaded(); |
|
faluco@1221
|
218 |
|
|
faluco@1221
|
219 |
/** |
|
dvander@536
|
220 |
* Returns the calling plugin's Handle. |
|
dvander@536
|
221 |
* |
|
dvander@536
|
222 |
* @return Handle of the calling plugin. |
|
dvander@536
|
223 |
*/ |
|
dvander@536
|
224 |
native Handle:GetMyHandle(); |
|
dvander@536
|
225 |
|
|
dvander@618
|
226 |
/** |
|
dvander@618
|
227 |
* Returns an iterator that can be used to search through plugins. |
|
dvander@618
|
228 |
* |
|
dvander@618
|
229 |
* @return Handle to iterate with. Must be closed via |
|
dvander@618
|
230 |
* CloseHandle(). |
|
dvander@618
|
231 |
* @error Invalid Handle. |
|
dvander@618
|
232 |
*/ |
|
dvander@618
|
233 |
native Handle:GetPluginIterator(); |
|
dvander@618
|
234 |
|
|
dvander@618
|
235 |
/** |
|
dvander@618
|
236 |
* Returns whether there are more plugins available in the iterator. |
|
dvander@618
|
237 |
* |
|
dvander@618
|
238 |
* @param iter Handle to the plugin iterator. |
|
dvander@618
|
239 |
* @return True on more plugins, false otherwise. |
|
dvander@618
|
240 |
* @error Invalid Handle. |
|
dvander@618
|
241 |
*/ |
|
dvander@618
|
242 |
native bool:MorePlugins(Handle:iter); |
|
dvander@618
|
243 |
|
|
dvander@618
|
244 |
/** |
|
dvander@618
|
245 |
* Returns the current plugin in the iterator and advances the iterator. |
|
dvander@618
|
246 |
* |
|
dvander@618
|
247 |
* @param iter Handle to the plugin iterator. |
|
dvander@618
|
248 |
* @return Current plugin the iterator is at, before |
|
dvander@618
|
249 |
* the iterator is advanced. |
|
dvander@618
|
250 |
* @error Invalid Handle. |
|
dvander@618
|
251 |
*/ |
|
dvander@618
|
252 |
native Handle:ReadPlugin(Handle:iter); |
|
dvander@618
|
253 |
|
|
dvander@618
|
254 |
/** |
|
dvander@618
|
255 |
* Returns a plugin's status. |
|
dvander@618
|
256 |
* |
|
dvander@618
|
257 |
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin). |
|
dvander@618
|
258 |
* @return Status code for the plugin. |
|
dvander@618
|
259 |
* @error Invalid Handle. |
|
dvander@618
|
260 |
*/ |
|
dvander@618
|
261 |
native PluginStatus:GetPluginStatus(Handle:plugin); |
|
dvander@618
|
262 |
|
|
dvander@618
|
263 |
/** |
|
dvander@618
|
264 |
* Retrieves a plugin's file name relative to the plugins folder. |
|
dvander@618
|
265 |
* |
|
dvander@618
|
266 |
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin). |
|
dvander@618
|
267 |
* @param buffer Buffer to the store the file name. |
|
dvander@618
|
268 |
* @param maxlength Maximum length of the name buffer. |
|
dvander@618
|
269 |
* @noreturn |
|
dvander@618
|
270 |
* @error Invalid Handle. |
|
dvander@618
|
271 |
*/ |
|
dvander@618
|
272 |
native GetPluginFilename(Handle:plugin, String:buffer[], maxlength); |
|
dvander@618
|
273 |
|
|
dvander@618
|
274 |
/** |
|
dvander@618
|
275 |
* Retrieves whether or not a plugin is being debugged. |
|
dvander@618
|
276 |
* |
|
dvander@618
|
277 |
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin). |
|
dvander@618
|
278 |
* @return True if being debugged, false otherwise. |
|
dvander@618
|
279 |
* @error Invalid Handle. |
|
dvander@618
|
280 |
*/ |
|
erik@3967
|
281 |
native bool:IsPluginDebugging(Handle:plugin); |
|
dvander@618
|
282 |
|
|
dvander@618
|
283 |
/** |
|
dvander@618
|
284 |
* Retrieves a plugin's public info. |
|
dvander@618
|
285 |
* |
|
dvander@618
|
286 |
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin). |
|
dvander@618
|
287 |
* @param info Plugin info property to retrieve. |
|
dvander@618
|
288 |
* @param buffer Buffer to store info in. |
|
dvander@618
|
289 |
* @param maxlength Maximum length of buffer. |
|
dvander@618
|
290 |
* @return True on success, false if property is not available. |
|
dvander@618
|
291 |
* @error Invalid Handle. |
|
dvander@618
|
292 |
*/ |
|
dvander@618
|
293 |
native bool:GetPluginInfo(Handle:plugin, PluginInfo:info, String:buffer[], maxlength); |
|
dvander@560
|
294 |
|
|
dvander@560
|
295 |
/** |
|
dvander@1798
|
296 |
* Finds a plugin by its order in the list from the "plugins list" server |
|
dvander@1798
|
297 |
* "sm" command. You should not use this function to loop through all plugins, |
|
dvander@1798
|
298 |
* use the iterator instead. Looping through all plugins using this native |
|
dvander@1798
|
299 |
* is O(n^2), whereas using the iterator is O(n). |
|
dvander@1798
|
300 |
* |
|
dvander@1798
|
301 |
* @param order_num Number of the plugin as it appears in "sm plugins list". |
|
dvander@1798
|
302 |
* @return Plugin Handle on success, INVALID_HANDLE if no plugin |
|
dvander@1798
|
303 |
* matches the given number. |
|
dvander@1798
|
304 |
*/ |
|
dvander@1798
|
305 |
native Handle:FindPluginByNumber(order_num); |
|
dvander@1798
|
306 |
|
|
dvander@1798
|
307 |
/** |
|
dvander@837
|
308 |
* Causes the plugin to enter a failed state. An error will be thrown and |
|
dvander@837
|
309 |
* the plugin will be paused until it is unloaded or reloaded. |
|
dvander@837
|
310 |
* |
|
dvander@1833
|
311 |
* For backwards compatibility, if no extra arguments are passed, no |
|
dvander@1833
|
312 |
* formatting is applied. If one or more additional arguments is passed, |
|
dvander@1833
|
313 |
* the string is formatted using Format(). If any errors are encountered |
|
dvander@1833
|
314 |
* during formatting, both the format specifier string and an additional |
|
dvander@1833
|
315 |
* error message are written. |
|
dvander@1833
|
316 |
* |
|
dvander@1833
|
317 |
* This function does not return, and no further code in the plugin is |
|
dvander@1833
|
318 |
* executed. |
|
dvander@1833
|
319 |
* |
|
dvander@1833
|
320 |
* @param string Format specifier string. |
|
dvander@1833
|
321 |
* @param ... Formatting arguments. |
|
dvander@837
|
322 |
* @noreturn |
|
dvander@838
|
323 |
* @error Always throws SP_ERROR_ABORT. |
|
dvander@837
|
324 |
*/ |
|
dvander@1833
|
325 |
native SetFailState(const String:string[], any:...); |
|
dvander@837
|
326 |
|
|
dvander@837
|
327 |
/** |
|
dvander@560
|
328 |
* Aborts the current callback and throws an error. This function |
|
dvander@560
|
329 |
* does not return in that no code is executed following it. |
|
dvander@560
|
330 |
* |
|
erik@3967
|
331 |
* @param fmt String format. |
|
dvander@560
|
332 |
* @param ... Format arguments. |
|
dvander@560
|
333 |
* @noreturn |
|
dvander@560
|
334 |
* @error Always! |
|
dvander@560
|
335 |
*/ |
|
ds@634
|
336 |
native ThrowError(const String:fmt[], any:...); |
|
dvander@560
|
337 |
|
|
dvander@536
|
338 |
/** |
|
dvander@595
|
339 |
* Gets the system time as a unix timestamp. |
|
dvander@595
|
340 |
* |
|
dvander@595
|
341 |
* @param bigStamp Optional array to store the 64bit timestamp in. |
|
dvander@595
|
342 |
* @return 32bit timestamp (number of seconds since unix epoch). |
|
dvander@595
|
343 |
*/ |
|
dvander@595
|
344 |
native GetTime(bigStamp[2]={0,0}); |
|
dvander@595
|
345 |
|
|
dvander@595
|
346 |
/** |
|
dvander@1334
|
347 |
* Produces a date and/or time string value for a timestamp. |
|
dvander@1334
|
348 |
* |
|
dvander@1334
|
349 |
* See this URL for valid parameters: |
|
dvander@1972
|
350 |
* http://cplusplus.com/reference/clibrary/ctime/strftime.html |
|
faluco@1037
|
351 |
* |
|
faluco@1037
|
352 |
* @param buffer Destination string buffer. |
|
faluco@1037
|
353 |
* @param maxlength Maximum length of output string buffer. |
|
faluco@1359
|
354 |
* @param format Formatting rules (passing NULL_STRING will use the rules defined in sm_datetime_format). |
|
faluco@1041
|
355 |
* @param stamp Optional time stamp. |
|
faluco@1037
|
356 |
* @noreturn |
|
dvander@1334
|
357 |
* @error Buffer too small or invalid time format. |
|
faluco@1037
|
358 |
*/ |
|
faluco@1041
|
359 |
native FormatTime(String:buffer[], maxlength, const String:format[], stamp=-1); |
|
faluco@1037
|
360 |
|
|
faluco@1037
|
361 |
/** |
|
faluco@703
|
362 |
* Loads a game config file. |
|
faluco@703
|
363 |
* |
|
faluco@703
|
364 |
* @param file File to load. The path must be relative to the 'gamedata' folder under the config folder |
|
faluco@703
|
365 |
* and the extension should be omitted. |
|
faluco@703
|
366 |
* @return A handle to the game config file or INVALID_HANDLE in failure. |
|
faluco@703
|
367 |
*/ |
|
faluco@703
|
368 |
native Handle:LoadGameConfigFile(const String:file[]); |
|
faluco@703
|
369 |
|
|
faluco@703
|
370 |
/** |
|
faluco@703
|
371 |
* Returns an offset value. |
|
faluco@703
|
372 |
* |
|
faluco@703
|
373 |
* @param gc Game config handle. |
|
faluco@703
|
374 |
* @param key Key to retrieve from the offset section. |
|
faluco@703
|
375 |
* @return An offset, or -1 on failure. |
|
faluco@703
|
376 |
*/ |
|
faluco@703
|
377 |
native GameConfGetOffset(Handle:gc, const String:key[]); |
|
faluco@703
|
378 |
|
|
faluco@703
|
379 |
/** |
|
faluco@703
|
380 |
* Gets the value of a key from the "Keys" section. |
|
faluco@703
|
381 |
* |
|
faluco@703
|
382 |
* @param gc Game config handle. |
|
faluco@703
|
383 |
* @param key Key to retrieve from the Keys section. |
|
faluco@703
|
384 |
* @param buffer Destination string buffer. |
|
faluco@703
|
385 |
* @param maxlen Maximum length of output string buffer. |
|
dvander@886
|
386 |
* @return True if key existed, false otherwise. |
|
faluco@703
|
387 |
*/ |
|
faluco@703
|
388 |
native bool:GameConfGetKeyValue(Handle:gc, const String:key[], String:buffer[], maxlen); |
|
faluco@703
|
389 |
|
|
skamonkey@4311
|
390 |
/** |
|
downtown1@2901
|
391 |
* Finds an address calculation in a GameConfig file, |
|
downtown1@2901
|
392 |
* performs LoadFromAddress on it as appropriate, then returns the final address. |
|
downtown1@2901
|
393 |
* |
|
downtown1@2901
|
394 |
* @param gameconf GameConfig Handle, or INVALID_HANDLE to use sdktools.games.txt. |
|
downtown1@2901
|
395 |
* @param name Name of the property to find. |
|
downtown1@2901
|
396 |
* @return An address calculated on success, or 0 on failure. |
|
downtown1@2901
|
397 |
*/ |
|
downtown1@2901
|
398 |
native Address:GameConfGetAddress(Handle:gameconf, const String:name[]); |
|
downtown1@2901
|
399 |
|
|
dvander@886
|
400 |
/** |
|
dvander@886
|
401 |
* Returns the operating system's "tick count," which is a number of |
|
dvander@886
|
402 |
* milliseconds since the operating system loaded. This can be used |
|
dvander@886
|
403 |
* for basic benchmarks. |
|
dvander@886
|
404 |
* |
|
dvander@886
|
405 |
* @return Tick count in milliseconds. |
|
dvander@886
|
406 |
*/ |
|
dvander@886
|
407 |
native GetSysTickCount(); |
|
dvander@886
|
408 |
|
|
dvander@978
|
409 |
/** |
|
dvander@978
|
410 |
* Specifies that the given config file should be executed after plugin load. |
|
dvander@978
|
411 |
* OnConfigsExecuted() will not be called until the config file has executed, |
|
dvander@978
|
412 |
* but it will be called if the execution fails. |
|
dvander@978
|
413 |
* |
|
dvander@978
|
414 |
* @param autoCreate If true, and the config file does not exist, such a config |
|
dvander@978
|
415 |
* file will be automatically created and populated with |
|
dvander@978
|
416 |
* information from the plugin's registered cvars. |
|
dvander@978
|
417 |
* @param name Name of the config file, excluding the .cfg extension. |
|
dvander@978
|
418 |
* If empty, <plugin.filename.cfg> is assumed. |
|
dvander@978
|
419 |
* @param folder Folder under cfg/ to use. By default this is "sourcemod." |
|
dvander@978
|
420 |
* @noreturn |
|
dvander@978
|
421 |
*/ |
|
dvander@978
|
422 |
native AutoExecConfig(bool:autoCreate=true, const String:name[]="", const String:folder[]="sourcemod"); |
|
dvander@978
|
423 |
|
|
faluco@1112
|
424 |
/** |
|
faluco@1112
|
425 |
* Registers a library name for identifying as a dependency to |
|
faluco@1112
|
426 |
* other plugins. |
|
faluco@1112
|
427 |
* |
|
faluco@1112
|
428 |
* @param name Library name. |
|
faluco@1112
|
429 |
* @noreturn |
|
faluco@1112
|
430 |
*/ |
|
faluco@1112
|
431 |
native RegPluginLibrary(const String:name[]); |
|
faluco@1112
|
432 |
|
|
dvander@1124
|
433 |
/** |
|
dvander@1573
|
434 |
* Returns whether a library exists. This function should be considered |
|
dvander@1573
|
435 |
* expensive; it should only be called on plugin to determine availability |
|
dvander@1573
|
436 |
* of resources. Use OnLibraryAdded()/OnLibraryRemoved() to detect changes |
|
dvander@1573
|
437 |
* in optional resources. |
|
dvander@1124
|
438 |
* |
|
dvander@1573
|
439 |
* @param name Library name of a plugin or extension. |
|
dvander@1124
|
440 |
* @return True if exists, false otherwise. |
|
dvander@1124
|
441 |
*/ |
|
dvander@1124
|
442 |
native bool:LibraryExists(const String:name[]); |
|
dvander@1124
|
443 |
|
|
dvander@1124
|
444 |
/** |
|
dvander@1419
|
445 |
* Returns the status of an extension, by filename. |
|
dvander@1419
|
446 |
* |
|
dvander@1419
|
447 |
* @param name Extension name (like "sdktools.ext"). |
|
dvander@1419
|
448 |
* @param error Optional error message buffer. |
|
dvander@1419
|
449 |
* @param maxlength Length of optional error message buffer. |
|
dvander@1419
|
450 |
* @return -2 if the extension was not found. |
|
dvander@1419
|
451 |
* -1 if the extension was found but failed to load. |
|
dvander@1419
|
452 |
* 0 if the extension loaded but reported an error. |
|
dvander@1419
|
453 |
* 1 if the extension is running without error. |
|
dvander@1419
|
454 |
*/ |
|
dvander@1419
|
455 |
native GetExtensionFileStatus(const String:name[], String:error[]="", maxlength=0); |
|
dvander@1419
|
456 |
|
|
dvander@1419
|
457 |
/** |
|
dvander@1572
|
458 |
* Called after a library is added that the current plugin references |
|
dvander@1572
|
459 |
* optionally. A library is either a plugin name or extension name, as |
|
dvander@1572
|
460 |
* exposed via its include file. |
|
dvander@1124
|
461 |
* |
|
dvander@1124
|
462 |
* @param name Library name. |
|
dvander@1124
|
463 |
*/ |
|
dvander@1124
|
464 |
forward OnLibraryAdded(const String:name[]); |
|
dvander@1124
|
465 |
|
|
dvander@1124
|
466 |
/** |
|
dvander@1572
|
467 |
* Called right before a library is removed that the current plugin references |
|
dvander@1572
|
468 |
* optionally. A library is either a plugin name or extension name, as |
|
dvander@1572
|
469 |
* exposed via its include file. |
|
dvander@1124
|
470 |
* |
|
dvander@1124
|
471 |
* @param name Library name. |
|
dvander@1124
|
472 |
*/ |
|
dvander@1124
|
473 |
forward OnLibraryRemoved(const String:name[]); |
|
dvander@1124
|
474 |
|
|
dvander@1738
|
475 |
#define MAPLIST_FLAG_MAPSFOLDER (1<<0) /**< On failure, use all maps in the maps folder. */ |
|
dvander@1738
|
476 |
#define MAPLIST_FLAG_CLEARARRAY (1<<1) /**< If an input array is specified, clear it before adding. */ |
|
dvander@1738
|
477 |
#define MAPLIST_FLAG_NO_DEFAULT (1<<2) /**< Do not read "default" or "mapcyclefile" on failure. */ |
|
dvander@1738
|
478 |
|
|
dvander@1738
|
479 |
/** |
|
dvander@1738
|
480 |
* Loads a map list to an ADT Array. |
|
dvander@1738
|
481 |
* |
|
dvander@1738
|
482 |
* A map list is a list of maps from a file. SourceMod allows easy configuration of |
|
dvander@1738
|
483 |
* maplists through addons/sourcemod/configs/maplists.cfg. Each entry is given a |
|
dvander@1738
|
484 |
* name and a file (for example, "rtv" => "rtv.cfg"), or a name and a redirection |
|
dvander@1738
|
485 |
* (for example, "rtv" => "default"). This native will read a map list entry, |
|
dvander@1738
|
486 |
* cache the file, and return the list of maps it holds. |
|
dvander@1738
|
487 |
* |
|
dvander@1738
|
488 |
* Serial change numbers are used to identify if a map list has changed. Thus, if |
|
dvander@1738
|
489 |
* you pass a serial change number and it's equal to what SourceMod currently knows |
|
dvander@1738
|
490 |
* about the map list, then SourceMod won't reparse the file. |
|
dvander@1738
|
491 |
* |
|
dvander@1738
|
492 |
* If the maps end up being read from the maps folder (MAPLIST_FLAG_MAPSFOLDER), they |
|
dvander@1738
|
493 |
* are automatically sorted in alphabetical, ascending order. |
|
dvander@1738
|
494 |
* |
|
dvander@1739
|
495 |
* Arrays created by this function are temporary and must be freed via CloseHandle(). |
|
dvander@1739
|
496 |
* Modifying arrays created by this function will not affect future return values or |
|
dvander@1739
|
497 |
* or the contents of arrays returned to other plugins. |
|
dvander@1739
|
498 |
* |
|
dvander@1738
|
499 |
* @param array Array to store the map list. If INVALID_HANDLE, a new blank |
|
dvander@1738
|
500 |
* array will be created. The blocksize should be at least 16; |
|
dvander@1738
|
501 |
* otherwise results may be truncated. Items are added to the array |
|
dvander@1738
|
502 |
* as strings. The array is never checked for duplicates, and it is |
|
dvander@1738
|
503 |
* not read beforehand. Only the serial number is used to detect |
|
dvander@1738
|
504 |
* changes. |
|
dvander@1772
|
505 |
* @param serial Serial number to identify last known map list change. If -1, the |
|
dvander@1772
|
506 |
* the value will not be checked. If the map list has since changed, |
|
dvander@1772
|
507 |
* the serial is updated (even if -1 was passed). If there is an error |
|
dvander@1772
|
508 |
* finding a valid maplist, then the serial is set to -1. |
|
dvander@1738
|
509 |
* @param str Config name, or "default" for the default map list. Config names |
|
dvander@1738
|
510 |
* should be somewhat descriptive. For example, the admin menu uses |
|
dvander@1738
|
511 |
* a config name of "admin menu". The list names can be configured |
|
dvander@1738
|
512 |
* by users in addons/sourcemod/configs/maplists.cfg. |
|
dvander@1738
|
513 |
* @param flags MAPLIST_FLAG flags. |
|
dvander@1738
|
514 |
* @return On failure: |
|
dvander@1738
|
515 |
* INVALID_HANDLE is returned, the serial is set to -1, and the input |
|
dvander@1738
|
516 |
* array (if any) is left unchanged. |
|
dvander@1738
|
517 |
* On no change: |
|
dvander@1738
|
518 |
INVALID_HANDLE is returned, the serial is unchanged, and the input |
|
dvander@1738
|
519 |
array (if any) is left unchanged. |
|
dvander@1738
|
520 |
* On success: |
|
dvander@1738
|
521 |
* A valid array Handle is returned, containing at least one map string. |
|
dvander@1738
|
522 |
* If an array was passed, the return value is equal to the passed Array |
|
dvander@1738
|
523 |
* Handle. If the passed array was not cleared, it will have grown by at |
|
dvander@1738
|
524 |
* least one item. The serial number is updated to a positive number. |
|
dvander@1738
|
525 |
* @error Invalid array Handle that is not INVALID_HANDLE. |
|
dvander@1738
|
526 |
*/ |
|
dvander@1738
|
527 |
native Handle:ReadMapList(Handle:array=INVALID_HANDLE, |
|
dvander@1738
|
528 |
&serial=-1, |
|
dvander@1738
|
529 |
const String:str[]="default", |
|
dvander@1738
|
530 |
flags=MAPLIST_FLAG_CLEARARRAY); |
|
dvander@1738
|
531 |
|
|
dvander@1738
|
532 |
/** |
|
dvander@1738
|
533 |
* Makes a compatibility binding for map lists. For example, if a function previously used |
|
dvander@1738
|
534 |
* "clam.cfg" for map lists, this function will insert a "fake" binding to "clam.cfg" that |
|
dvander@1738
|
535 |
* will be overridden if it's in the maplists.cfg file. |
|
dvander@1738
|
536 |
* |
|
dvander@1738
|
537 |
* @param name Configuration name that would be used with ReadMapList(). |
|
dvander@1738
|
538 |
* @param file Default file to use. |
|
dvander@1738
|
539 |
* @noreturn |
|
dvander@1738
|
540 |
*/ |
|
dvander@1738
|
541 |
native SetMapListCompatBind(const String:name[], const String:file[]); |
|
dvander@1738
|
542 |
|
|
dvander@1925
|
543 |
/** |
|
dvander@1925
|
544 |
* Called when a client has sent chat text. This must return either true or |
|
dvander@1925
|
545 |
* false to indicate that a client is or is not spamming the server. |
|
dvander@1925
|
546 |
* |
|
dvander@1925
|
547 |
* The return value is a hint only. Core or another plugin may decide |
|
dvander@1925
|
548 |
* otherwise. |
|
dvander@1925
|
549 |
* |
|
dvander@1925
|
550 |
* @param client Client index. The server (0) will never be passed. |
|
dvander@1925
|
551 |
* @return True if client is spamming the server, false otherwise. |
|
dvander@1925
|
552 |
*/ |
|
dvander@1925
|
553 |
forward bool:OnClientFloodCheck(client); |
|
dvander@1925
|
554 |
|
|
dvander@1925
|
555 |
/** |
|
dvander@1925
|
556 |
* Called after a client's flood check has been computed. This can be used |
|
dvander@1925
|
557 |
* by antiflood algorithms to decay/increase flooding weights. |
|
dvander@1925
|
558 |
* |
|
dvander@1925
|
559 |
* Since the result from "OnClientFloodCheck" isn't guaranteed to be the |
|
dvander@1925
|
560 |
* final result, it is generally a good idea to use this to play with other |
|
dvander@1925
|
561 |
* algorithms nicely. |
|
dvander@1925
|
562 |
* |
|
dvander@1925
|
563 |
* @param client Client index. The server (0) will never be passed. |
|
dvander@1925
|
564 |
* @param blocked True if client flooded last "say", false otherwise. |
|
dvander@1925
|
565 |
* @noreturn |
|
dvander@1925
|
566 |
*/ |
|
dvander@1925
|
567 |
forward OnClientFloodResult(client, bool:blocked); |
|
dvander@1925
|
568 |
|
|
dvander@2841
|
569 |
/** |
|
dvander@2841
|
570 |
* Feature types. |
|
dvander@2841
|
571 |
*/ |
|
dvander@2841
|
572 |
enum FeatureType |
|
dvander@2841
|
573 |
{ |
|
dvander@2841
|
574 |
/** |
|
dvander@2841
|
575 |
* A native function call. |
|
dvander@2841
|
576 |
*/ |
|
dvander@2841
|
577 |
FeatureType_Native, |
|
dvander@2841
|
578 |
|
|
dvander@2841
|
579 |
/** |
|
dvander@2841
|
580 |
* A named capability. This is distinctly different from checking for a |
|
dvander@2841
|
581 |
* native, because the underlying functionality could be enabled on-demand |
|
dvander@2841
|
582 |
* to improve loading time. Thus a native may appear to exist, but it might |
|
dvander@2841
|
583 |
* be part of a set of features that are not compatible with the current game |
|
dvander@2841
|
584 |
* or version of SourceMod. |
|
dvander@2841
|
585 |
*/ |
|
dvander@2841
|
586 |
FeatureType_Capability |
|
dvander@2841
|
587 |
}; |
|
dvander@2841
|
588 |
|
|
dvander@2841
|
589 |
/** |
|
dvander@2841
|
590 |
* Feature statuses. |
|
dvander@2841
|
591 |
*/ |
|
dvander@2841
|
592 |
enum FeatureStatus |
|
dvander@2841
|
593 |
{ |
|
dvander@2841
|
594 |
/** |
|
dvander@2841
|
595 |
* Feature is available for use. |
|
dvander@2841
|
596 |
*/ |
|
dvander@2841
|
597 |
FeatureStatus_Available, |
|
dvander@2841
|
598 |
|
|
dvander@2841
|
599 |
/** |
|
dvander@2841
|
600 |
* Feature is not available. |
|
dvander@2841
|
601 |
*/ |
|
dvander@2841
|
602 |
FeatureStatus_Unavailable, |
|
dvander@2841
|
603 |
|
|
dvander@2841
|
604 |
/** |
|
dvander@2841
|
605 |
* Feature is not known at all. |
|
dvander@2841
|
606 |
*/ |
|
dvander@2841
|
607 |
FeatureStatus_Unknown |
|
dvander@2841
|
608 |
}; |
|
dvander@2841
|
609 |
|
|
dvander@2841
|
610 |
/** |
|
dvander@2841
|
611 |
* Returns whether "GetFeatureStatus" will work. Using this native |
|
dvander@2841
|
612 |
* or this function will not cause SourceMod to fail loading on older versions, |
|
dvander@2841
|
613 |
* however, GetFeatureStatus will only work if this function returns true. |
|
dvander@2841
|
614 |
* |
|
dvander@2841
|
615 |
* @return True if GetFeatureStatus will work, false otherwise. |
|
dvander@2841
|
616 |
*/ |
|
dvander@2841
|
617 |
stock bool:CanTestFeatures() |
|
dvander@2841
|
618 |
{ |
|
dvander@2841
|
619 |
return LibraryExists("__CanTestFeatures__"); |
|
dvander@2841
|
620 |
} |
|
dvander@2841
|
621 |
|
|
dvander@2841
|
622 |
/** |
|
dvander@2841
|
623 |
* Returns whether a feature exists, and if so, whether it is usable. |
|
dvander@2841
|
624 |
* |
|
dvander@2841
|
625 |
* @param type Feature type. |
|
dvander@2841
|
626 |
* @param name Feature name. |
|
dvander@2841
|
627 |
* @return Feature status. |
|
dvander@2841
|
628 |
*/ |
|
dvander@2841
|
629 |
native FeatureStatus:GetFeatureStatus(FeatureType:type, const String:name[]); |
|
dvander@2841
|
630 |
|
|
dvander@2841
|
631 |
/** |
|
dvander@2841
|
632 |
* Requires that a given feature is available. If it is not, SetFailState() |
|
dvander@2841
|
633 |
* is called with the given message. |
|
dvander@2841
|
634 |
* |
|
dvander@2841
|
635 |
* @param type Feature type. |
|
dvander@2841
|
636 |
* @param name Feature name. |
|
dvander@2841
|
637 |
* @param fmt Message format string, or empty to use default. |
|
dvander@2841
|
638 |
* @param ... Message format parameters, if any. |
|
dvander@2841
|
639 |
* @noreturn |
|
dvander@2841
|
640 |
*/ |
|
dvander@2841
|
641 |
native RequireFeature(FeatureType:type, const String:name[], |
|
dvander@2841
|
642 |
const String:fmt[]="", any:...); |
|
dvander@2841
|
643 |
|
|
downtown1@2901
|
644 |
/** |
|
downtown1@2901
|
645 |
* Represents how many bytes we can read from an address with one load |
|
downtown1@2901
|
646 |
*/ |
|
downtown1@2901
|
647 |
enum NumberType |
|
downtown1@2901
|
648 |
{ |
|
downtown1@2901
|
649 |
NumberType_Int8, |
|
downtown1@2901
|
650 |
NumberType_Int16, |
|
downtown1@2901
|
651 |
NumberType_Int32 |
|
downtown1@2901
|
652 |
}; |
|
downtown1@2901
|
653 |
|
|
downtown1@2901
|
654 |
enum Address |
|
downtown1@2901
|
655 |
{ |
|
downtown1@2901
|
656 |
Address_Null = 0, //a typical invalid result when an address lookup fails |
|
downtown1@2901
|
657 |
Address_MinimumValid = 0x10000 //addresses below this value are considered invalid to use for Load/Store |
|
downtown1@2901
|
658 |
}; |
|
downtown1@2901
|
659 |
|
|
downtown1@2901
|
660 |
/** |
|
downtown1@2901
|
661 |
* Load up to 4 bytes from a memory address. |
|
downtown1@2901
|
662 |
* |
|
downtown1@2901
|
663 |
* @param addr Address to a memory location. |
|
downtown1@2901
|
664 |
* @param size How many bytes should be read. |
|
downtown1@2901
|
665 |
* @return The value that is stored at that address. |
|
downtown1@2901
|
666 |
*/ |
|
downtown1@2901
|
667 |
native LoadFromAddress(Address:addr, NumberType:size); |
|
downtown1@2901
|
668 |
|
|
downtown1@2901
|
669 |
/** |
|
downtown1@2901
|
670 |
* Store up to 4 bytes to a memory address. |
|
downtown1@2901
|
671 |
* |
|
downtown1@2901
|
672 |
* @param addr Address to a memory location. |
|
downtown1@2901
|
673 |
* @param data Value to store at the address. |
|
downtown1@2901
|
674 |
* @param size How many bytes should be written. |
|
downtown1@2901
|
675 |
* @noreturn |
|
downtown1@2901
|
676 |
*/ |
|
downtown1@2901
|
677 |
native StoreToAddress(Address:addr, data, NumberType:size); |
|
downtown1@2901
|
678 |
|
|
dvander@460
|
679 |
#include <helpers> |
|
dvander@560
|
680 |
#include <entity> |
|
ferret99gt@1800
|
681 |
#include <entity_prop_stocks> |
|
dvander@1419
|
682 |
|