summaryrefslogtreecommitdiff
path: root/sourcemod-1.5-dev/scripting/include/topmenus.inc
blob: 9bc4d7fab5f2503031b775dfafc19fe5492528e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
/**
 * vim: set ts=4 :
 * =============================================================================
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
 * =============================================================================
 *
 * This file is part of the SourceMod/SourcePawn SDK.
 *
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License, version 3.0, as published by the
 * Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * As a special exception, AlliedModders LLC gives you permission to link the
 * code of this program (as well as its derivative works) to "Half-Life 2," the
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
 * by the Valve Corporation.  You must obey the GNU General Public License in
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
 * this exception to all derivative works.  AlliedModders LLC defines further
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
 * or <http://www.sourcemod.net/license.php>.
 *
 * Version: $Id$
 */
 
#if defined _topmenus_included
 #endinput
#endif
#define _topmenus_included

#include <menus>

/**
 * Actions a top menu will take on an object.
 */
enum TopMenuAction
{
	/**
	 * An option is being drawn for a menu (or for sorting purposes).
	 *
	 * INPUT : TopMenu Handle, object ID, client index.
	 * OUTPUT: Buffer for rendering, maxlength of buffer.
	 */
	TopMenuAction_DisplayOption = 0,
	
	/**
	 * The title of a menu is being drawn for a given object.
	 *
	 * Note: The Object ID will be INVALID_TOPMENUOBJECT if drawing the 
	 * root title.  Otherwise, the Object ID is a category.
	 *
	 * INPUT : TopMenu Handle, object ID, client index.
	 * OUTPUT: Buffer for rendering, maxlength of buffer.
	 */
	TopMenuAction_DisplayTitle = 1,
	
	/**
	 * A menu option has been selected.
	 *
	 * The Object ID will always be an item (not a category).
	 *
	 * INPUT : TopMenu Handle, object ID, client index.
	 */
	TopMenuAction_SelectOption = 2,

	/**
	 * A menu option is being drawn and its flags can be overridden.
	 *
	 * INPUT : TopMenu Handle, object ID, client index.
	 * OUTPUT: The first byte of the 'buffer' string should be set 
	 *		   to the desired flags.  By default, it will contain
	 *		   ITEMDRAW_DEFAULT.
	 */
	 TopMenuAction_DrawOption = 3,
	 
	/**
	 * Called when an object is being removed from the menu.
	 * This can be used to clean up data stored in the info string.
	 *
	 * INPUT : TopMenu Handle, object ID.
	 */
	 TopMenuAction_RemoveObject = 4,
};

/**
 * Top menu object types.
 */
enum TopMenuObjectType
{
	TopMenuObject_Category = 0,			/**< Category (sub-menu branching from root) */
	TopMenuObject_Item = 1				/**< Item on a sub-menu */
};

/**
 * Top menu starting positions for display.
 */
enum TopMenuPosition
{
	TopMenuPosition_Start = 0,			/**< Start/root of the menu */
	TopMenuPosition_LastRoot = 1,		/**< Last position in the root menu */
	TopMenuPosition_LastCategory = 3,	/**< Last position in their last category */
};

/**
 * Top menu object tag for type checking.
 */
enum TopMenuObject
{
	INVALID_TOPMENUOBJECT = 0,
};

/**
 * TopMenu callback prototype.
 *
 * @param topmenu			Handle to the TopMenu.
 * @param action			TopMenuAction being performed.
 * @param object_id			The object ID (if used).
 * @param param				Extra parameter (if used).
 * @param buffer			Output buffer (if used).
 * @param maxlength			Output buffer (if used).
 * @noreturn
 */
functag public TopMenuHandler(Handle:topmenu, 
							  TopMenuAction:action,
							  TopMenuObject:object_id,
							  param,
							  String:buffer[],
							  maxlength);

/**
 * Creates a TopMenu.
 *
 * @param handler			Handler to use for drawing the root title.
 * @return					A new TopMenu Handle, or INVALID_HANDLE on failure.
 */						  
native Handle:CreateTopMenu(TopMenuHandler:handler);

/**
 * Re-sorts the items in a TopMenu via a configuration file.
 *
 * The format of the configuration file should be a Valve Key-Values 
 * formatted file that SourceMod can parse.  There should be one root 
 * section, and one sub-section for each category.  Each sub-section's 
 * name should match the category name.
 *
 * Each sub-section may only contain key/value pairs in the form of:
 * key: "item"
 * value: Name of the item as passed to AddToTopMenu().
 *
 * The TopMenu will draw items in the order declared in the configuration 
 * file.  If items do not appear in the configuration file, they are sorted 
 * per-player based on how the handler function renders for that player.  
 * These items appear after the configuration sorted items.
 *
 * @param topmenu			TopMenu Handle.
 * @param file				File path.
 * @param error				Error buffer.
 * @param maxlength			Maximum size of the error buffer.
 *							Error buffer will be filled with a 
 *							zero-terminated string if false is 
 *							returned.
 * @return					True on success, false on failure.
 * @error					Invalid TopMenu Handle.
 */
native bool:LoadTopMenuConfig(Handle:topmenu, const String:file[], String:error[], maxlength);

/**
 * Adds an object to a TopMenu.
 *
 * @param topmenu			TopMenu Handle.
 * @param name				Object name (MUST be unique).
 * @param type				Object type.
 * @param handler			Handler for object.
 * @param parent			Parent object ID, or INVALID_TOPMENUOBJECT for none.
 *							Items must have a category parent.
 *							Categories must not have a parent.
 * @param cmdname			Command name (for access overrides).
 * @param flags				Default access flags.
 * @param info_string		Arbitrary storage (max 255 bytes).
 * @return					A new TopMenuObject ID, or INVALID_TOPMENUOBJECT on
 *							failure.
 * @error					Invalid TopMenu Handle.
 */
native TopMenuObject:AddToTopMenu(Handle:topmenu,
								  const String:name[],
								  TopMenuObjectType:type,
								  TopMenuHandler:handler,
								  TopMenuObject:parent,
								  const String:cmdname[]="",
								  flags=0,
								  const String:info_string[]="");
								  
/**
 * Retrieves the info string of a top menu item.
 *
 * @param topmenu			TopMenu Handle.
 * @param parent			TopMenuObject ID.
 * @param buffer			Buffer to store info string.
 * @param maxlength			Maximum size of info string.
 * @return					Number of bytes written, not including the 
 *							null terminator.
 * @error					Invalid TopMenu Handle or TopMenuObject ID.
 */
native GetTopMenuInfoString(Handle:topmenu, TopMenuObject:parent, String:buffer[], maxlength);

/**
 * Retrieves the name string of a top menu item.
 *
 * @param topmenu			TopMenu Handle.
 * @param object			TopMenuObject ID.
 * @param buffer			Buffer to store info string.
 * @param maxlength			Maximum size of info string.
 * @return					Number of bytes written, not including the 
 *							null terminator.
 * @error					Invalid TopMenu Handle or TopMenuObject ID.
 */
native GetTopMenuObjName(Handle:topmenu, TopMenuObject:object, String:buffer[], maxlength);

/**
 * Removes an object from a TopMenu.
 *
 * Plugins' objects are automatically removed all TopMenus when the given 
 * plugin unloads or pauses.  In the case of unpausing, all items are restored.
 *
 * @param topmenu			TopMenu Handle.
 * @param object			TopMenuObject ID.
 * @noreturn
 * @error					Invalid TopMenu Handle.
 */
native RemoveFromTopMenu(Handle:topmenu, TopMenuObject:object);

/**
 * Displays a TopMenu to a client.
 *
 * @param topmenu			TopMenu Handle.
 * @param client			Client index.
 * @param position			Position to display from.
 * @return					True on success, false on failure.
 * @error					Invalid TopMenu Handle or client not in game.
 */
native bool:DisplayTopMenu(Handle:topmenu, client, TopMenuPosition:position);

/**
 * Displays a TopMenu category to a client.
 *
 * @param topmenu			TopMenu Handle.
 * @param category		Category object id.
 * @param client			Client index.
 * @return					True on success, false on failure.
 * @error					Invalid TopMenu Handle or client not in game.
 */
native bool:DisplayTopMenuCategory(Handle:topmenu, TopMenuObject:category, client);

/**
 * Finds a category's object ID in a TopMenu.
 *
 * @param topmenu			TopMenu Handle.
 * @param name				Object's unique name.
 * @return					TopMenuObject ID on success, or 
 *							INVALID_TOPMENUOBJECT on failure.
 * @error					Invalid TopMenu Handle.
 */
native TopMenuObject:FindTopMenuCategory(Handle:topmenu, const String:name[]);

/**
 * Change the menu title caching behaviour of the TopMenu. By default the titles are cached to reduce overhead.
 * If you need dynamic menu titles, which can change everytime the menu is displayed to a user, set this to false.
 *
 * @param topmenu       TopMenu Handle.
 * @param cache_titles  Cache the menu titles and don't call the handler with TopMenuAction_DisplayTitle everytime the menu is drawn?
 * @noreturn
 * @error               Invalid TopMenu Handle
 */
native SetTopMenuTitleCaching(Handle:topmenu, bool:cache_titles);

/**
 * Do not edit below this line!
 */
public Extension:__ext_topmenus = 
{
	name = "TopMenus",
	file = "topmenus.ext",
#if defined AUTOLOAD_EXTENSIONS
	autoload = 1,
#else
	autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
	required = 1,
#else
	required = 0,
#endif
};

#if !defined REQUIRE_EXTENSIONS
public __ext_topmenus_SetNTVOptional()
{
	MarkNativeAsOptional("CreateTopMenu");
	MarkNativeAsOptional("LoadTopMenuConfig");
	MarkNativeAsOptional("AddToTopMenu");
	MarkNativeAsOptional("RemoveFromTopMenu");
	MarkNativeAsOptional("DisplayTopMenu");
	MarkNativeAsOptional("DisplayTopMenuCategory");
	MarkNativeAsOptional("FindTopMenuCategory");
	MarkNativeAsOptional("SetTopMenuTitleCaching");
}
#endif