plugins/adminmenu/dynamicmenu.sp
author Matt Woodrow <pred@alliedmods.net>
Wed Dec 26 02:41:04 2007 +0000 (2007-12-26)
branchsourcemod-1.1.0
changeset 1824 a07fb2db618f
parent 1823 150b81fe27d6
child 1825 a4010b64eb2f
permissions -rw-r--r--
Fixed dynamic menu reading userid2 as userid
pred@1782
     1
pred@1782
     2
#define NAME_LENGTH 32
pred@1782
     3
#define CMD_LENGTH 255
pred@1782
     4
pred@1782
     5
#define ARRAY_STRING_LENGTH 32
pred@1782
     6
pred@1782
     7
new Handle:g_kvMenu;
pred@1782
     8
pred@1782
     9
enum GroupCommands
pred@1782
    10
{
pred@1782
    11
	Handle:groupListName,
pred@1782
    12
	Handle:groupListCommand	
pred@1782
    13
};
pred@1782
    14
pred@1782
    15
new g_groupList[GroupCommands];
pred@1782
    16
new g_groupCount;
pred@1782
    17
pred@1782
    18
new Handle:g_configParser = INVALID_HANDLE;
pred@1782
    19
pred@1782
    20
enum Places
pred@1782
    21
{
pred@1782
    22
	Place_Category,
pred@1782
    23
	Place_Item,
pred@1782
    24
	Place_ReplaceNum	
pred@1782
    25
};
pred@1782
    26
pred@1782
    27
new String:g_command[MAXPLAYERS+1][CMD_LENGTH];
pred@1782
    28
new g_currentPlace[MAXPLAYERS+1][Places];
pred@1782
    29
pred@1782
    30
/**
pred@1782
    31
 * What to put in the 'info' menu field (for PlayerList and Player_Team menus only)
pred@1782
    32
 */
pred@1782
    33
enum PlayerMethod
pred@1782
    34
{		
pred@1782
    35
	ClientId,				/** Client id number ( 1 - Maxplayers) */
pred@1782
    36
	UserId,					/** Client userid */
pred@1782
    37
	Name,					/** Client Name */
pred@1782
    38
	SteamId,				/** Client Steamid */
pred@1782
    39
	IpAddress,				/** Client's Ip Address */
pred@1782
    40
	UserId2					/** Userid (not prefixed with #) */
pred@1782
    41
};
pred@1782
    42
pred@1782
    43
BuildDynamicMenu()
pred@1782
    44
{
pred@1782
    45
	if (g_kvMenu != INVALID_HANDLE)
pred@1782
    46
	{
pred@1782
    47
		CloseHandle(g_kvMenu);	
pred@1782
    48
	}
pred@1782
    49
	
pred@1782
    50
	g_kvMenu = CreateKeyValues("Commands");
pred@1782
    51
	new String:file[256];
pred@1782
    52
	BuildPath(Path_SM, file, 255, "configs/dynamicmenu/menu.ini");
pred@1782
    53
	FileToKeyValues(g_kvMenu, file);
pred@1782
    54
	
pred@1782
    55
	new String:name[NAME_LENGTH];
pred@1782
    56
	new String:buffer[NAME_LENGTH];
pred@1782
    57
	
pred@1782
    58
	
pred@1782
    59
	if (!KvGotoFirstSubKey(g_kvMenu))
pred@1782
    60
	{
pred@1782
    61
		return;
pred@1782
    62
	}
pred@1782
    63
	
pred@1782
    64
	decl String:admin[30];
pred@1782
    65
	
pred@1782
    66
	new TopMenuObject:categoryId;
pred@1782
    67
	
pred@1782
    68
	new catId;
pred@1782
    69
	new id;
pred@1782
    70
	
pred@1782
    71
	do
pred@1782
    72
	{		
pred@1782
    73
		KvGetSectionName(g_kvMenu, buffer, sizeof(buffer));
pred@1782
    74
pred@1782
    75
		KvGetString(g_kvMenu, "admin", admin, sizeof(admin),"sm_admin");
pred@1782
    76
				
pred@1782
    77
		if ((categoryId =FindTopMenuCategory(hAdminMenu, buffer)) == INVALID_TOPMENUOBJECT)
pred@1782
    78
		{
pred@1782
    79
			categoryId = AddToTopMenu(hAdminMenu,
pred@1782
    80
							buffer,
pred@1782
    81
							TopMenuObject_Category,
pred@1782
    82
							DynamicMenuCategoryHandler,
pred@1782
    83
							INVALID_TOPMENUOBJECT,
pred@1782
    84
							admin,
pred@1782
    85
							ADMFLAG_GENERIC,
pred@1782
    86
							name);
pred@1782
    87
pred@1782
    88
		}
pred@1782
    89
		
pred@1782
    90
		if (!KvGetSectionSymbol(g_kvMenu, catId))
pred@1782
    91
		{
pred@1782
    92
			LogError("Key Id not found for section: %s", buffer);
pred@1782
    93
			break;
pred@1782
    94
		}
pred@1782
    95
		
pred@1782
    96
		if (!KvGotoFirstSubKey(g_kvMenu))
pred@1782
    97
		{
pred@1782
    98
			return;
pred@1782
    99
		}
pred@1782
   100
		
pred@1782
   101
		do
pred@1782
   102
		{		
pred@1782
   103
			KvGetSectionName(g_kvMenu, buffer, sizeof(buffer));
pred@1782
   104
pred@1782
   105
			KvGetString(g_kvMenu, "admin", admin, sizeof(admin),"");
pred@1782
   106
			
pred@1782
   107
			if (admin[0] == '\0')
pred@1782
   108
			{
pred@1782
   109
				//No 'admin' keyvalue was found
pred@1782
   110
				//Use the first argument of the 'cmd' string instead
pred@1782
   111
				
pred@1782
   112
				decl String:temp[64];
pred@1782
   113
				KvGetString(g_kvMenu, "cmd", temp, sizeof(temp),"");
pred@1782
   114
				
pred@1782
   115
				BreakString(temp, admin, sizeof(admin));
pred@1782
   116
			}
pred@1782
   117
							  
pred@1782
   118
			if (!KvGetSectionSymbol(g_kvMenu, id))
pred@1782
   119
			{
pred@1782
   120
				LogError("Key Id not found for section: %s");
pred@1782
   121
				break;
pred@1782
   122
			}
pred@1782
   123
			
pred@1782
   124
			decl String:keyId[64];
pred@1782
   125
			
pred@1782
   126
			Format(keyId, sizeof(keyId), "%i %i", catId, id);
pred@1782
   127
		
pred@1782
   128
			AddToTopMenu(hAdminMenu,
pred@1782
   129
							buffer,
pred@1782
   130
							TopMenuObject_Item,
pred@1782
   131
							DynamicMenuItemHandler,
pred@1782
   132
  							categoryId,
pred@1782
   133
  							admin,
pred@1782
   134
  							ADMFLAG_GENERIC,
pred@1782
   135
  							keyId);
pred@1782
   136
		
pred@1782
   137
		} while (KvGotoNextKey(g_kvMenu));
pred@1782
   138
		
pred@1782
   139
		KvGoBack(g_kvMenu);
pred@1782
   140
		
pred@1782
   141
	} while (KvGotoNextKey(g_kvMenu));
pred@1782
   142
	
pred@1782
   143
	KvRewind(g_kvMenu);	
pred@1782
   144
}
pred@1782
   145
pred@1782
   146
ParseConfigs()
pred@1782
   147
{
pred@1782
   148
	if (g_configParser == INVALID_HANDLE)
pred@1782
   149
	{
pred@1782
   150
		g_configParser = SMC_CreateParser();
pred@1782
   151
	}
pred@1782
   152
	
pred@1782
   153
	SMC_SetReaders(g_configParser, NewSection, KeyValue, EndSection);
pred@1782
   154
	
pred@1782
   155
	if (g_groupList[groupListName] != INVALID_HANDLE)
pred@1782
   156
	{
pred@1782
   157
		CloseHandle(g_groupList[groupListName]);
pred@1782
   158
	}
pred@1782
   159
	
pred@1782
   160
	if (g_groupList[groupListCommand] != INVALID_HANDLE)
pred@1782
   161
	{
pred@1782
   162
		CloseHandle(g_groupList[groupListCommand]);
pred@1782
   163
	}
pred@1782
   164
	
pred@1782
   165
	g_groupList[groupListName] = CreateArray(ARRAY_STRING_LENGTH);
pred@1782
   166
	g_groupList[groupListCommand] = CreateArray(ARRAY_STRING_LENGTH);
pred@1782
   167
	
pred@1782
   168
	decl String:configPath[256];
pred@1823
   169
	BuildPath(Path_SM, configPath, sizeof(configPath), "configs/dynamicmenu/adminmenu_grouping.txt");
pred@1782
   170
	
pred@1782
   171
	if (!FileExists(configPath))
pred@1782
   172
	{
pred@1782
   173
		LogError("Unable to locate admin menu groups file, no groups loaded.");
pred@1782
   174
			
pred@1782
   175
		return;		
pred@1782
   176
	}
pred@1782
   177
	
pred@1782
   178
	new line;
pred@1782
   179
	new SMCError:err = SMC_ParseFile(g_configParser, configPath, line);
pred@1782
   180
	if (err != SMCError_Okay)
pred@1782
   181
	{
pred@1782
   182
		decl String:error[256];
pred@1782
   183
		SMC_GetErrorString(err, error, sizeof(error));
pred@1782
   184
		LogError("Could not parse file (line %d, file \"%s\"):", line, configPath);
pred@1782
   185
		LogError("Parser encountered error: %s", error);
pred@1782
   186
	}
pred@1782
   187
	
pred@1782
   188
	return;
pred@1782
   189
}
pred@1782
   190
pred@1782
   191
public SMCResult:NewSection(Handle:smc, const String:name[], bool:opt_quotes)
pred@1782
   192
{
pred@1782
   193
pred@1782
   194
}
pred@1782
   195
pred@1782
   196
public SMCResult:KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
pred@1782
   197
{
pred@1782
   198
	PushArrayString(g_groupList[groupListName], key);
pred@1782
   199
	PushArrayString(g_groupList[groupListCommand], value);
pred@1782
   200
}
pred@1782
   201
pred@1782
   202
public SMCResult:EndSection(Handle:smc)
pred@1782
   203
{
pred@1782
   204
	g_groupCount = GetArraySize(g_groupList[groupListName]);
pred@1782
   205
}
pred@1782
   206
pred@1782
   207
public DynamicMenuCategoryHandler(Handle:topmenu, 
pred@1782
   208
						TopMenuAction:action,
pred@1782
   209
						TopMenuObject:object_id,
pred@1782
   210
						param,
pred@1782
   211
						String:buffer[],
pred@1782
   212
						maxlength)
pred@1782
   213
{
pred@1782
   214
	if ((action == TopMenuAction_DisplayTitle) || (action == TopMenuAction_DisplayOption))
pred@1782
   215
	{
pred@1782
   216
		GetTopMenuObjName(topmenu, object_id, buffer, maxlength);
pred@1782
   217
	}
pred@1782
   218
}
pred@1782
   219
pred@1782
   220
public DynamicMenuItemHandler(Handle:topmenu, 
pred@1782
   221
					  TopMenuAction:action,
pred@1782
   222
					  TopMenuObject:object_id,
pred@1782
   223
					  param,
pred@1782
   224
					  String:buffer[],
pred@1782
   225
					  maxlength)
pred@1782
   226
{
pred@1782
   227
	if (action == TopMenuAction_DisplayOption)
pred@1782
   228
	{
pred@1782
   229
		GetTopMenuObjName(topmenu, object_id, buffer, maxlength);
pred@1782
   230
	}
pred@1782
   231
	else if (action == TopMenuAction_SelectOption)
pred@1782
   232
	{	
pred@1782
   233
		new String:keyId[64];
pred@1782
   234
		new String:catId[64];
pred@1782
   235
		GetTopMenuInfoString(topmenu, object_id, keyId, sizeof(keyId));
pred@1782
   236
		
pred@1782
   237
		new start = BreakString(keyId, catId, sizeof(catId));
pred@1782
   238
		
pred@1782
   239
		new id = StringToInt(keyId[start]);
pred@1782
   240
		new category = StringToInt(catId);
pred@1782
   241
		
pred@1782
   242
		KvJumpToKeySymbol(g_kvMenu, category);
pred@1782
   243
		KvJumpToKeySymbol(g_kvMenu, id);
pred@1782
   244
		
pred@1782
   245
		KvGetString(g_kvMenu, "cmd", g_command[param], sizeof(g_command[]),"");
pred@1782
   246
		KvRewind(g_kvMenu);
pred@1782
   247
					
pred@1782
   248
		g_currentPlace[param][Place_Category] = category;
pred@1782
   249
		g_currentPlace[param][Place_Item] = id;
pred@1782
   250
		
pred@1782
   251
		ParamCheck(param);
pred@1782
   252
	}
pred@1782
   253
}
pred@1782
   254
pred@1782
   255
public ParamCheck(client)
pred@1782
   256
{
pred@1782
   257
	new String:buffer[6];
pred@1782
   258
	new String:buffer2[6];
pred@1782
   259
pred@1782
   260
	KvJumpToKeySymbol(g_kvMenu, g_currentPlace[client][Place_Category]);
pred@1782
   261
	KvJumpToKeySymbol(g_kvMenu, g_currentPlace[client][Place_Item]);
pred@1782
   262
	
pred@1782
   263
	new String:type[NAME_LENGTH];
pred@1782
   264
		
pred@1782
   265
	if (g_currentPlace[client][Place_ReplaceNum] < 1)
pred@1782
   266
	{
pred@1782
   267
		g_currentPlace[client][Place_ReplaceNum] = 1;
pred@1782
   268
	}
pred@1782
   269
	
pred@1782
   270
	Format(buffer, 5, "#%i", g_currentPlace[client][Place_ReplaceNum]);
pred@1782
   271
	Format(buffer2, 5, "@%i", g_currentPlace[client][Place_ReplaceNum]);
pred@1782
   272
	
pred@1782
   273
	if (StrContains(g_command[client], buffer) != -1 || StrContains(g_command[client], buffer2) != -1)
pred@1782
   274
	{
pred@1782
   275
		//user has a parameter to fill. lets do it.	
pred@1823
   276
		KvJumpToKey(g_kvMenu, buffer[1]); // Jump to current param
pred@1782
   277
		KvGetString(g_kvMenu, "type", type, sizeof(type),"list");
pred@1782
   278
		
pred@1823
   279
		PrintToChatAll("Checking param %s - type %s", buffer[1], type);
pred@1823
   280
		
pred@1782
   281
		new Handle:itemMenu = CreateMenu(Menu_Selection);
pred@1782
   282
		
pred@1782
   283
		new String:title[NAME_LENGTH];
pred@1782
   284
			
pred@1782
   285
		if (strncmp(type,"group",5)==0 && g_groupCount)
pred@1782
   286
		{	
pred@1782
   287
			decl String:nameBuffer[ARRAY_STRING_LENGTH];
pred@1782
   288
			decl String:commandBuffer[ARRAY_STRING_LENGTH];
pred@1782
   289
		
pred@1782
   290
			for (new i = 0; i<g_groupCount; i++)
pred@1782
   291
			{			
pred@1782
   292
				GetArrayString(g_groupList[groupListName], i, nameBuffer, sizeof(nameBuffer));
pred@1782
   293
				GetArrayString(g_groupList[groupListCommand], i, commandBuffer, sizeof(commandBuffer));
pred@1782
   294
				AddMenuItem(itemMenu, commandBuffer, nameBuffer);
pred@1782
   295
			}
pred@1782
   296
		}
pred@1823
   297
		
pred@1823
   298
		if (strncmp(type,"mapcycle",8) == 0)
pred@1782
   299
		{
pred@1782
   300
			decl String:path[200];
pred@1782
   301
			KvGetString(g_kvMenu, "path", path, sizeof(path),"mapcycle.txt");
pred@1782
   302
		
pred@1782
   303
			new Handle:file = OpenFile(path, "rt");
pred@1782
   304
			new String:readData[128];
pred@1782
   305
			
pred@1782
   306
			if(file != INVALID_HANDLE)
pred@1782
   307
			{
pred@1782
   308
				while(!IsEndOfFile(file) && ReadFileLine(file, readData, sizeof(readData)))
pred@1782
   309
				{
pred@1782
   310
					TrimString(readData);
pred@1782
   311
					
pred@1782
   312
					if (IsMapValid(readData))
pred@1782
   313
					{
pred@1782
   314
						AddMenuItem(itemMenu, readData, readData);
pred@1782
   315
					}
pred@1782
   316
				}
pred@1782
   317
			}
pred@1782
   318
		}
pred@1823
   319
		else if (StrContains(type, "player") != -1)
pred@1782
   320
		{
pred@1823
   321
			PrintToChatAll("Building Player List");
pred@1823
   322
			
pred@1782
   323
			new PlayerMethod:playermethod;
pred@1782
   324
			new String:method[NAME_LENGTH];
pred@1782
   325
			
pred@1782
   326
			KvGetString(g_kvMenu, "method", method, sizeof(method),"name");
pred@1782
   327
			
pred@1782
   328
			if (strncmp(method,"clientid",8)==0)
pred@1782
   329
			{
pred@1782
   330
				playermethod = ClientId;
pred@1782
   331
			}
pred@1782
   332
			else if (strncmp(method,"steamid",7)==0)
pred@1782
   333
			{
pred@1782
   334
				playermethod = SteamId;
pred@1782
   335
			}
pred@1824
   336
			else if (strncmp(method,"userid2",7)==0)
pred@1824
   337
			{
pred@1824
   338
				playermethod = UserId2;
pred@1824
   339
			}
pred@1782
   340
			else if (strncmp(method,"userid",6)==0)
pred@1782
   341
			{
pred@1782
   342
				playermethod = UserId;
pred@1782
   343
			}
pred@1782
   344
			else if (strncmp(method,"ip",2)==0)
pred@1782
   345
			{
pred@1782
   346
				playermethod = IpAddress;
pred@1782
   347
			}
pred@1782
   348
			else
pred@1782
   349
			{
pred@1782
   350
				playermethod = Name;
pred@1782
   351
			}
pred@1782
   352
	
pred@1782
   353
			
pred@1782
   354
			new String:nameBuffer[32];
pred@1782
   355
			new String:infoBuffer[32];
pred@1782
   356
			new String:temp[4];
pred@1782
   357
			
pred@1782
   358
			//loop through players. Add name as text and name/userid/steamid as info
pred@1782
   359
			for (new i=1; i<=g_maxPlayers; i++)
pred@1782
   360
			{
pred@1782
   361
				if (IsClientInGame(i))
pred@1782
   362
				{			
pred@1782
   363
					GetClientName(i, nameBuffer, 31);
pred@1823
   364
					
pred@1823
   365
					switch (playermethod)
pred@1782
   366
					{
pred@1823
   367
						case UserId:
pred@1823
   368
						{
pred@1823
   369
							new userid = GetClientUserId(i);
pred@1823
   370
							Format(infoBuffer, sizeof(infoBuffer), "#%i", userid);
pred@1823
   371
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);	
pred@1823
   372
						}
pred@1823
   373
						case UserId2:
pred@1823
   374
						{
pred@1823
   375
							new userid = GetClientUserId(i);
pred@1823
   376
							Format(infoBuffer, sizeof(infoBuffer), "%i", userid);
pred@1823
   377
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);							
pred@1823
   378
						}
pred@1823
   379
						case SteamId:
pred@1823
   380
						{
pred@1823
   381
							GetClientAuthString(i, infoBuffer, sizeof(infoBuffer));
pred@1823
   382
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);							
pred@1823
   383
						}	
pred@1823
   384
						case IpAddress:
pred@1823
   385
						{
pred@1823
   386
							GetClientIP(i, infoBuffer, sizeof(infoBuffer));
pred@1823
   387
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);							
pred@1823
   388
						}
pred@1823
   389
						case Name:
pred@1823
   390
						{
pred@1823
   391
							AddMenuItem(itemMenu, nameBuffer, nameBuffer);
pred@1823
   392
						}	
pred@1823
   393
						default: //assume client id
pred@1823
   394
						{
pred@1823
   395
							Format(temp,3,"%i",i);
pred@1823
   396
							AddMenuItem(itemMenu, temp, nameBuffer);						
pred@1823
   397
						}								
pred@1782
   398
					}
pred@1782
   399
				}
pred@1782
   400
			}
pred@1782
   401
		}
pred@1782
   402
		else if (strncmp(type,"onoff",5) == 0)
pred@1782
   403
		{
pred@1782
   404
			AddMenuItem(itemMenu, "1", "On");
pred@1782
   405
			AddMenuItem(itemMenu, "0", "Off");
pred@1782
   406
		}		
pred@1782
   407
		else
pred@1782
   408
		{
pred@1782
   409
			//list menu
pred@1823
   410
			
pred@1823
   411
			PrintToChatAll("Building List Menu");
pred@1782
   412
pred@1782
   413
			new String:temp[6];
pred@1782
   414
			new String:value[NAME_LENGTH];
pred@1782
   415
			new String:text[NAME_LENGTH];
pred@1782
   416
			new i=1;
pred@1782
   417
			new bool:more = true;
pred@1782
   418
					
pred@1782
   419
			new String:admin[NAME_LENGTH];
pred@1782
   420
						
pred@1782
   421
			do
pred@1782
   422
			{
pred@1782
   423
				// load the i and i. options from kv and make a menu from them (i* = required admin level to view)
pred@1782
   424
				Format(temp,3,"%i",i);
pred@1782
   425
				KvGetString(g_kvMenu, temp, value, sizeof(value), "");
pred@1782
   426
				
pred@1782
   427
				Format(temp,5,"%i.",i);
pred@1782
   428
				KvGetString(g_kvMenu, temp, text, sizeof(text), value);
pred@1782
   429
				
pred@1782
   430
				Format(temp,5,"%i*",i);
pred@1782
   431
				KvGetString(g_kvMenu, temp, admin, sizeof(admin),"");	
pred@1782
   432
				
pred@1782
   433
				if (value[0]=='\0')
pred@1782
   434
				{
pred@1782
   435
					more = false;
pred@1782
   436
				}
pred@1782
   437
				else if (CheckCommandAccess(client, admin, 0))
pred@1782
   438
				{
pred@1782
   439
					AddMenuItem(itemMenu, value, text);
pred@1782
   440
				}
pred@1782
   441
				
pred@1782
   442
				i++;
pred@1782
   443
								
pred@1782
   444
			} while (more);
pred@1782
   445
		
pred@1782
   446
		}
pred@1782
   447
		
pred@1782
   448
		KvGetString(g_kvMenu, "title", title, sizeof(title),"Choose an Option");
pred@1782
   449
		SetMenuTitle(itemMenu, title);
pred@1782
   450
		
pred@1782
   451
		DisplayMenu(itemMenu, client, MENU_TIME_FOREVER);
pred@1782
   452
	}
pred@1782
   453
	else
pred@1782
   454
	{	
pred@1782
   455
		//nothing else need to be done. Run teh command.
pred@1782
   456
		new String:execute[7];
pred@1782
   457
		KvGetString(g_kvMenu, "execute", execute, sizeof(execute), "player");
pred@1782
   458
		
pred@1782
   459
		DisplayTopMenu(hAdminMenu, client, TopMenuPosition_LastCategory);
pred@1782
   460
		
pred@1782
   461
		if (execute[0]=='p') // assume 'player' type execute option
pred@1782
   462
		{
pred@1782
   463
			FakeClientCommand(client, g_command[client]);
pred@1782
   464
		}
pred@1782
   465
		else // assume 'server' type execute option
pred@1782
   466
		{
pred@1782
   467
			InsertServerCommand(g_command[client]);
pred@1782
   468
			ServerExecute();
pred@1782
   469
		}
pred@1782
   470
pred@1782
   471
		g_command[client][0] = '\0';
pred@1782
   472
		g_currentPlace[client][Place_ReplaceNum] = 1;
pred@1782
   473
	}
pred@1782
   474
	
pred@1782
   475
	KvRewind(g_kvMenu);
pred@1782
   476
}
pred@1782
   477
pred@1782
   478
public Menu_Selection(Handle:menu, MenuAction:action, param1, param2)
pred@1782
   479
{
pred@1782
   480
	if (action == MenuAction_End)
pred@1782
   481
	{
pred@1782
   482
		CloseHandle(menu);
pred@1782
   483
	}
pred@1782
   484
	
pred@1782
   485
	if (action == MenuAction_Select)
pred@1782
   486
	{
pred@1782
   487
		new String:info[NAME_LENGTH];
pred@1782
   488
 
pred@1782
   489
		/* Get item info */
pred@1782
   490
		new bool:found = GetMenuItem(menu, param2, info, sizeof(info));
pred@1782
   491
		
pred@1782
   492
		if (!found)
pred@1782
   493
		{
pred@1782
   494
			return;
pred@1782
   495
		}
pred@1782
   496
		
pred@1823
   497
		new String:buffer[6];
pred@1782
   498
		new String:infobuffer[NAME_LENGTH+2];
pred@1782
   499
		Format(infobuffer, sizeof(infobuffer), "\"%s\"", info);
pred@1782
   500
		
pred@1823
   501
		Format(buffer, 5, "#%i", g_currentPlace[param1][Place_ReplaceNum]);
pred@1782
   502
		ReplaceString(g_command[param1], sizeof(g_command[]), buffer, infobuffer);
pred@1782
   503
		//replace #num with the selected option (quoted)
pred@1782
   504
		
pred@1823
   505
		Format(buffer, 5, "@%i", g_currentPlace[param1][Place_ReplaceNum]);
pred@1782
   506
		ReplaceString(g_command[param1], sizeof(g_command[]), buffer, info);
pred@1782
   507
		//replace @num with the selected option (unquoted)
pred@1782
   508
		
pred@1782
   509
		// Increment the parameter counter.
pred@1782
   510
		g_currentPlace[param1][Place_ReplaceNum]++;
pred@1782
   511
		
pred@1782
   512
		ParamCheck(param1);
pred@1782
   513
	}
pred@1782
   514
	
pred@1782
   515
	if (action == MenuAction_Cancel && param2 == MenuCancel_Exit)
pred@1782
   516
	{
pred@1782
   517
		//client exited we should go back to submenu i think
pred@1782
   518
		DisplayTopMenu(hAdminMenu, param1, TopMenuPosition_LastCategory);
pred@1782
   519
	}
pred@1782
   520
}