plugins/adminmenu/dynamicmenu.sp
author David Anderson <dvander@alliedmods.net>
Sun Jul 06 04:49:55 2008 +0000 (2008-07-06)
branchrefac-jit
changeset 2168 c24a6fa957db
permissions -rw-r--r--
jit refactoring branch
dvander@2168
     1
dvander@2168
     2
#define NAME_LENGTH 32
dvander@2168
     3
#define CMD_LENGTH 255
dvander@2168
     4
dvander@2168
     5
#define ARRAY_STRING_LENGTH 32
dvander@2168
     6
dvander@2168
     7
enum GroupCommands
dvander@2168
     8
{
dvander@2168
     9
	Handle:groupListName,
dvander@2168
    10
	Handle:groupListCommand	
dvander@2168
    11
};
dvander@2168
    12
dvander@2168
    13
new g_groupList[GroupCommands];
dvander@2168
    14
new g_groupCount;
dvander@2168
    15
dvander@2168
    16
new Handle:g_configParser = INVALID_HANDLE;
dvander@2168
    17
dvander@2168
    18
enum Places
dvander@2168
    19
{
dvander@2168
    20
	Place_Category,
dvander@2168
    21
	Place_Item,
dvander@2168
    22
	Place_ReplaceNum	
dvander@2168
    23
};
dvander@2168
    24
dvander@2168
    25
new String:g_command[MAXPLAYERS+1][CMD_LENGTH];
dvander@2168
    26
new g_currentPlace[MAXPLAYERS+1][Places];
dvander@2168
    27
dvander@2168
    28
/**
dvander@2168
    29
 * What to put in the 'info' menu field (for PlayerList and Player_Team menus only)
dvander@2168
    30
 */
dvander@2168
    31
enum PlayerMethod
dvander@2168
    32
{		
dvander@2168
    33
	ClientId,				/** Client id number ( 1 - Maxplayers) */
dvander@2168
    34
	UserId,					/** Client userid */
dvander@2168
    35
	Name,					/** Client Name */
dvander@2168
    36
	SteamId,				/** Client Steamid */
dvander@2168
    37
	IpAddress,				/** Client's Ip Address */
dvander@2168
    38
	UserId2					/** Userid (not prefixed with #) */
dvander@2168
    39
};
dvander@2168
    40
dvander@2168
    41
enum ExecuteType
dvander@2168
    42
{
dvander@2168
    43
	Execute_Player,
dvander@2168
    44
	Execute_Server
dvander@2168
    45
}
dvander@2168
    46
dvander@2168
    47
enum SubMenu_Type
dvander@2168
    48
{
dvander@2168
    49
	SubMenu_Group,
dvander@2168
    50
	SubMenu_GroupPlayer,
dvander@2168
    51
	SubMenu_Player,
dvander@2168
    52
	SubMenu_MapCycle,
dvander@2168
    53
	SubMenu_List,
dvander@2168
    54
	SubMenu_OnOff	
dvander@2168
    55
}
dvander@2168
    56
dvander@2168
    57
enum Item
dvander@2168
    58
{
dvander@2168
    59
	String:Item_cmd[256],
dvander@2168
    60
	ExecuteType:Item_execute,
dvander@2168
    61
	Handle:Item_submenus
dvander@2168
    62
}
dvander@2168
    63
dvander@2168
    64
enum Submenu
dvander@2168
    65
{
dvander@2168
    66
	SubMenu_Type:Submenu_type,
dvander@2168
    67
	String:Submenu_title[32],
dvander@2168
    68
	PlayerMethod:Submenu_method,
dvander@2168
    69
	Submenu_listcount,
dvander@2168
    70
	Handle:Submenu_listdata
dvander@2168
    71
}
dvander@2168
    72
dvander@2168
    73
new Handle:g_DataArray;
dvander@2168
    74
dvander@2168
    75
BuildDynamicMenu()
dvander@2168
    76
{
dvander@2168
    77
	new itemInput[Item];
dvander@2168
    78
	g_DataArray = CreateArray(sizeof(itemInput));
dvander@2168
    79
	
dvander@2168
    80
	new String:executeBuffer[32];
dvander@2168
    81
	
dvander@2168
    82
	new Handle:kvMenu;
dvander@2168
    83
	kvMenu = CreateKeyValues("Commands");
dvander@2168
    84
	KvSetEscapeSequences(kvMenu, true); 
dvander@2168
    85
	
dvander@2168
    86
	new String:file[256];
dvander@2168
    87
	
dvander@2168
    88
	/* As a compatibility shim, we use the old file if it exists. */
dvander@2168
    89
	BuildPath(Path_SM, file, 255, "configs/dynamicmenu/menu.ini");
dvander@2168
    90
	if (FileExists(file))
dvander@2168
    91
	{
dvander@2168
    92
		LogError("Warning! configs/dynamicmenu/menu.ini is now configs/adminmenu_custom.txt.");
dvander@2168
    93
		LogError("Read the 1.0.2 release notes, as the dynamicmenu folder has been removed.");
dvander@2168
    94
	}
dvander@2168
    95
	else
dvander@2168
    96
	{
dvander@2168
    97
		BuildPath(Path_SM, file, 255, "configs/adminmenu_custom.txt");
dvander@2168
    98
	}
dvander@2168
    99
	
dvander@2168
   100
	FileToKeyValues(kvMenu, file);
dvander@2168
   101
	
dvander@2168
   102
	new String:name[NAME_LENGTH];
dvander@2168
   103
	new String:buffer[NAME_LENGTH];
dvander@2168
   104
		
dvander@2168
   105
	if (!KvGotoFirstSubKey(kvMenu))
dvander@2168
   106
	{
dvander@2168
   107
		return;
dvander@2168
   108
	}
dvander@2168
   109
	
dvander@2168
   110
	decl String:admin[30];
dvander@2168
   111
	
dvander@2168
   112
	new TopMenuObject:categoryId;
dvander@2168
   113
	
dvander@2168
   114
	do
dvander@2168
   115
	{		
dvander@2168
   116
		KvGetSectionName(kvMenu, buffer, sizeof(buffer));
dvander@2168
   117
dvander@2168
   118
		KvGetString(kvMenu, "admin", admin, sizeof(admin),"sm_admin");
dvander@2168
   119
				
dvander@2168
   120
		if ((categoryId =FindTopMenuCategory(hAdminMenu, buffer)) == INVALID_TOPMENUOBJECT)
dvander@2168
   121
		{
dvander@2168
   122
			categoryId = AddToTopMenu(hAdminMenu,
dvander@2168
   123
							buffer,
dvander@2168
   124
							TopMenuObject_Category,
dvander@2168
   125
							DynamicMenuCategoryHandler,
dvander@2168
   126
							INVALID_TOPMENUOBJECT,
dvander@2168
   127
							admin,
dvander@2168
   128
							ADMFLAG_GENERIC,
dvander@2168
   129
							name);
dvander@2168
   130
dvander@2168
   131
		}
dvander@2168
   132
		
dvander@2168
   133
		if (!KvGotoFirstSubKey(kvMenu))
dvander@2168
   134
		{
dvander@2168
   135
			return;
dvander@2168
   136
		}
dvander@2168
   137
		
dvander@2168
   138
		do
dvander@2168
   139
		{		
dvander@2168
   140
			KvGetSectionName(kvMenu, buffer, sizeof(buffer));
dvander@2168
   141
			
dvander@2168
   142
			KvGetString(kvMenu, "admin", admin, sizeof(admin),"");
dvander@2168
   143
			
dvander@2168
   144
			if (admin[0] == '\0')
dvander@2168
   145
			{
dvander@2168
   146
				//No 'admin' keyvalue was found
dvander@2168
   147
				//Use the first argument of the 'cmd' string instead
dvander@2168
   148
				
dvander@2168
   149
				decl String:temp[64];
dvander@2168
   150
				KvGetString(kvMenu, "cmd", temp, sizeof(temp),"");
dvander@2168
   151
				
dvander@2168
   152
				BreakString(temp, admin, sizeof(admin));
dvander@2168
   153
			}
dvander@2168
   154
			
dvander@2168
   155
			
dvander@2168
   156
			KvGetString(kvMenu, "cmd", itemInput[Item_cmd], sizeof(itemInput[Item_cmd]));	
dvander@2168
   157
			KvGetString(kvMenu, "execute", executeBuffer, sizeof(executeBuffer));
dvander@2168
   158
			
dvander@2168
   159
			if (StrEqual(executeBuffer, "server"))
dvander@2168
   160
			{
dvander@2168
   161
				itemInput[Item_execute] = Execute_Server;
dvander@2168
   162
			}
dvander@2168
   163
			else //assume player type execute
dvander@2168
   164
			{
dvander@2168
   165
				itemInput[Item_execute] = Execute_Player;
dvander@2168
   166
			}
dvander@2168
   167
  							
dvander@2168
   168
  			/* iterate all submenus and load data into itemInput[Item_submenus] (adt array handle) */
dvander@2168
   169
  			
dvander@2168
   170
  			new count = 1;
dvander@2168
   171
  			decl String:countBuffer[10] = "1";
dvander@2168
   172
  			
dvander@2168
   173
  			decl String:inputBuffer[32];
dvander@2168
   174
  			
dvander@2168
   175
  			while (KvJumpToKey(kvMenu, countBuffer))
dvander@2168
   176
  			{
dvander@2168
   177
	  			new submenuInput[Submenu];
dvander@2168
   178
	  			
dvander@2168
   179
	  			if (count == 1)
dvander@2168
   180
	  			{
dvander@2168
   181
		  			itemInput[Item_submenus] = CreateArray(sizeof(submenuInput));	
dvander@2168
   182
	  			}
dvander@2168
   183
	  			
dvander@2168
   184
	  			KvGetString(kvMenu, "type", inputBuffer, sizeof(inputBuffer));
dvander@2168
   185
	  			
dvander@2168
   186
	  			if (strncmp(inputBuffer,"group",5)==0)
dvander@2168
   187
				{	
dvander@2168
   188
					if (StrContains(inputBuffer, "player") != -1)
dvander@2168
   189
					{			
dvander@2168
   190
						submenuInput[Submenu_type] = SubMenu_GroupPlayer;
dvander@2168
   191
					}
dvander@2168
   192
					else
dvander@2168
   193
					{
dvander@2168
   194
						submenuInput[Submenu_type] = SubMenu_Group;
dvander@2168
   195
					}
dvander@2168
   196
				}			
dvander@2168
   197
				else if (StrEqual(inputBuffer,"mapcycle"))
dvander@2168
   198
				{
dvander@2168
   199
					submenuInput[Submenu_type] = SubMenu_MapCycle;
dvander@2168
   200
					
dvander@2168
   201
					KvGetString(kvMenu, "path", inputBuffer, sizeof(inputBuffer),"mapcycle.txt");
dvander@2168
   202
					
dvander@2168
   203
					submenuInput[Submenu_listdata] = CreateDataPack();
dvander@2168
   204
					WritePackString(submenuInput[Submenu_listdata], inputBuffer);
dvander@2168
   205
					ResetPack(submenuInput[Submenu_listdata]);
dvander@2168
   206
				}
dvander@2168
   207
				else if (StrContains(inputBuffer, "player") != -1)
dvander@2168
   208
				{			
dvander@2168
   209
					submenuInput[Submenu_type] = SubMenu_Player;
dvander@2168
   210
				}
dvander@2168
   211
				else if (StrEqual(inputBuffer,"onoff"))
dvander@2168
   212
				{
dvander@2168
   213
					submenuInput[Submenu_type] = SubMenu_OnOff;
dvander@2168
   214
				}		
dvander@2168
   215
				else //assume 'list' type
dvander@2168
   216
				{
dvander@2168
   217
					submenuInput[Submenu_type] = SubMenu_List;
dvander@2168
   218
					
dvander@2168
   219
					submenuInput[Submenu_listdata] = CreateDataPack();
dvander@2168
   220
					
dvander@2168
   221
					new String:temp[6];
dvander@2168
   222
					new String:value[64];
dvander@2168
   223
					new String:text[64];
dvander@2168
   224
					new i=1;
dvander@2168
   225
					new bool:more = true;
dvander@2168
   226
					
dvander@2168
   227
					new listcount = 0;
dvander@2168
   228
								
dvander@2168
   229
					do
dvander@2168
   230
					{
dvander@2168
   231
						Format(temp,3,"%i",i);
dvander@2168
   232
						KvGetString(kvMenu, temp, value, sizeof(value), "");
dvander@2168
   233
						
dvander@2168
   234
						Format(temp,5,"%i.",i);
dvander@2168
   235
						KvGetString(kvMenu, temp, text, sizeof(text), value);
dvander@2168
   236
						
dvander@2168
   237
						Format(temp,5,"%i*",i);
dvander@2168
   238
						KvGetString(kvMenu, temp, admin, sizeof(admin),"");	
dvander@2168
   239
						
dvander@2168
   240
						if (value[0]=='\0')
dvander@2168
   241
						{
dvander@2168
   242
							more = false;
dvander@2168
   243
						}
dvander@2168
   244
						else
dvander@2168
   245
						{
dvander@2168
   246
							listcount++;
dvander@2168
   247
							WritePackString(submenuInput[Submenu_listdata], value);
dvander@2168
   248
							WritePackString(submenuInput[Submenu_listdata], text);
dvander@2168
   249
							WritePackString(submenuInput[Submenu_listdata], admin);
dvander@2168
   250
						}
dvander@2168
   251
						
dvander@2168
   252
						i++;
dvander@2168
   253
										
dvander@2168
   254
					} while (more);
dvander@2168
   255
					
dvander@2168
   256
					ResetPack(submenuInput[Submenu_listdata]);
dvander@2168
   257
					submenuInput[Submenu_listcount] = listcount;
dvander@2168
   258
				}
dvander@2168
   259
				
dvander@2168
   260
				if ((submenuInput[Submenu_type] == SubMenu_Player) || (submenuInput[Submenu_type] == SubMenu_GroupPlayer))
dvander@2168
   261
				{
dvander@2168
   262
					KvGetString(kvMenu, "method", inputBuffer, sizeof(inputBuffer));
dvander@2168
   263
					
dvander@2168
   264
					if (StrEqual(inputBuffer, "clientid"))
dvander@2168
   265
					{
dvander@2168
   266
						submenuInput[Submenu_method] = ClientId;
dvander@2168
   267
					}
dvander@2168
   268
					else if (StrEqual(inputBuffer, "steamid"))
dvander@2168
   269
					{
dvander@2168
   270
						submenuInput[Submenu_method] = SteamId;
dvander@2168
   271
					}
dvander@2168
   272
					else if (StrEqual(inputBuffer, "userid2"))
dvander@2168
   273
					{
dvander@2168
   274
						submenuInput[Submenu_method] = UserId2;
dvander@2168
   275
					}
dvander@2168
   276
					else if (StrEqual(inputBuffer, "userid"))
dvander@2168
   277
					{
dvander@2168
   278
						submenuInput[Submenu_method] = UserId;
dvander@2168
   279
					}
dvander@2168
   280
					else if (StrEqual(inputBuffer, "ip"))
dvander@2168
   281
					{
dvander@2168
   282
						submenuInput[Submenu_method] = IpAddress;
dvander@2168
   283
					}
dvander@2168
   284
					else
dvander@2168
   285
					{
dvander@2168
   286
						submenuInput[Submenu_method] = Name;
dvander@2168
   287
					}					
dvander@2168
   288
					
dvander@2168
   289
				}
dvander@2168
   290
				
dvander@2168
   291
				KvGetString(kvMenu, "title", inputBuffer, sizeof(inputBuffer));
dvander@2168
   292
				strcopy(submenuInput[Submenu_title], sizeof(submenuInput[Submenu_title]), inputBuffer);
dvander@2168
   293
	  			
dvander@2168
   294
	  			count++;
dvander@2168
   295
	  			Format(countBuffer, sizeof(countBuffer), "%i", count);
dvander@2168
   296
	  			
dvander@2168
   297
	  			PushArrayArray(itemInput[Item_submenus], submenuInput[0]);
dvander@2168
   298
	  		
dvander@2168
   299
	  			KvGoBack(kvMenu);	
dvander@2168
   300
  			}
dvander@2168
   301
  			
dvander@2168
   302
  			/* Save this entire item into the global items array and add it to the menu */
dvander@2168
   303
  			
dvander@2168
   304
  			new location = PushArrayArray(g_DataArray, itemInput[0]);
dvander@2168
   305
			
dvander@2168
   306
			decl String:locString[10];
dvander@2168
   307
			IntToString(location, locString, sizeof(locString));
dvander@2168
   308
dvander@2168
   309
			AddToTopMenu(hAdminMenu,
dvander@2168
   310
							buffer,
dvander@2168
   311
							TopMenuObject_Item,
dvander@2168
   312
							DynamicMenuItemHandler,
dvander@2168
   313
  							categoryId,
dvander@2168
   314
  							admin,
dvander@2168
   315
  							ADMFLAG_GENERIC,
dvander@2168
   316
  							locString);			
dvander@2168
   317
		
dvander@2168
   318
		} while (KvGotoNextKey(kvMenu));
dvander@2168
   319
		
dvander@2168
   320
		KvGoBack(kvMenu);
dvander@2168
   321
		
dvander@2168
   322
	} while (KvGotoNextKey(kvMenu));
dvander@2168
   323
	
dvander@2168
   324
	CloseHandle(kvMenu);
dvander@2168
   325
}
dvander@2168
   326
dvander@2168
   327
ParseConfigs()
dvander@2168
   328
{
dvander@2168
   329
	if (g_configParser == INVALID_HANDLE)
dvander@2168
   330
	{
dvander@2168
   331
		g_configParser = SMC_CreateParser();
dvander@2168
   332
	}
dvander@2168
   333
	
dvander@2168
   334
	SMC_SetReaders(g_configParser, NewSection, KeyValue, EndSection);
dvander@2168
   335
	
dvander@2168
   336
	if (g_groupList[groupListName] != INVALID_HANDLE)
dvander@2168
   337
	{
dvander@2168
   338
		CloseHandle(g_groupList[groupListName]);
dvander@2168
   339
	}
dvander@2168
   340
	
dvander@2168
   341
	if (g_groupList[groupListCommand] != INVALID_HANDLE)
dvander@2168
   342
	{
dvander@2168
   343
		CloseHandle(g_groupList[groupListCommand]);
dvander@2168
   344
	}
dvander@2168
   345
	
dvander@2168
   346
	g_groupList[groupListName] = CreateArray(ARRAY_STRING_LENGTH);
dvander@2168
   347
	g_groupList[groupListCommand] = CreateArray(ARRAY_STRING_LENGTH);
dvander@2168
   348
	
dvander@2168
   349
	decl String:configPath[256];
dvander@2168
   350
	BuildPath(Path_SM, configPath, sizeof(configPath), "configs/dynamicmenu/adminmenu_grouping.txt");
dvander@2168
   351
	if (FileExists(configPath))
dvander@2168
   352
	{
dvander@2168
   353
		LogError("Warning! configs/dynamicmenu/adminmenu_grouping.txt is now configs/adminmenu_grouping.txt.");
dvander@2168
   354
		LogError("Read the 1.0.2 release notes, as the dynamicmenu folder has been removed.");
dvander@2168
   355
	}
dvander@2168
   356
	else
dvander@2168
   357
	{
dvander@2168
   358
		BuildPath(Path_SM, configPath, sizeof(configPath), "configs/adminmenu_grouping.txt");
dvander@2168
   359
	}
dvander@2168
   360
	
dvander@2168
   361
	if (!FileExists(configPath))
dvander@2168
   362
	{
dvander@2168
   363
		LogError("Unable to locate admin menu groups file: %s", configPath);
dvander@2168
   364
			
dvander@2168
   365
		return;		
dvander@2168
   366
	}
dvander@2168
   367
	
dvander@2168
   368
	new line;
dvander@2168
   369
	new SMCError:err = SMC_ParseFile(g_configParser, configPath, line);
dvander@2168
   370
	if (err != SMCError_Okay)
dvander@2168
   371
	{
dvander@2168
   372
		decl String:error[256];
dvander@2168
   373
		SMC_GetErrorString(err, error, sizeof(error));
dvander@2168
   374
		LogError("Could not parse file (line %d, file \"%s\"):", line, configPath);
dvander@2168
   375
		LogError("Parser encountered error: %s", error);
dvander@2168
   376
	}
dvander@2168
   377
	
dvander@2168
   378
	return;
dvander@2168
   379
}
dvander@2168
   380
dvander@2168
   381
public SMCResult:NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@2168
   382
{
dvander@2168
   383
dvander@2168
   384
}
dvander@2168
   385
dvander@2168
   386
public SMCResult:KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
dvander@2168
   387
{
dvander@2168
   388
	PushArrayString(g_groupList[groupListName], key);
dvander@2168
   389
	PushArrayString(g_groupList[groupListCommand], value);
dvander@2168
   390
}
dvander@2168
   391
dvander@2168
   392
public SMCResult:EndSection(Handle:smc)
dvander@2168
   393
{
dvander@2168
   394
	g_groupCount = GetArraySize(g_groupList[groupListName]);
dvander@2168
   395
}
dvander@2168
   396
dvander@2168
   397
public DynamicMenuCategoryHandler(Handle:topmenu, 
dvander@2168
   398
						TopMenuAction:action,
dvander@2168
   399
						TopMenuObject:object_id,
dvander@2168
   400
						param,
dvander@2168
   401
						String:buffer[],
dvander@2168
   402
						maxlength)
dvander@2168
   403
{
dvander@2168
   404
	if ((action == TopMenuAction_DisplayTitle) || (action == TopMenuAction_DisplayOption))
dvander@2168
   405
	{
dvander@2168
   406
		GetTopMenuObjName(topmenu, object_id, buffer, maxlength);
dvander@2168
   407
	}
dvander@2168
   408
}
dvander@2168
   409
dvander@2168
   410
public DynamicMenuItemHandler(Handle:topmenu, 
dvander@2168
   411
					  TopMenuAction:action,
dvander@2168
   412
					  TopMenuObject:object_id,
dvander@2168
   413
					  param,
dvander@2168
   414
					  String:buffer[],
dvander@2168
   415
					  maxlength)
dvander@2168
   416
{
dvander@2168
   417
	if (action == TopMenuAction_DisplayOption)
dvander@2168
   418
	{
dvander@2168
   419
		GetTopMenuObjName(topmenu, object_id, buffer, maxlength);
dvander@2168
   420
	}
dvander@2168
   421
	else if (action == TopMenuAction_SelectOption)
dvander@2168
   422
	{	
dvander@2168
   423
		new String:locString[10];
dvander@2168
   424
		GetTopMenuInfoString(topmenu, object_id, locString, sizeof(locString));
dvander@2168
   425
		
dvander@2168
   426
		new location = StringToInt(locString);
dvander@2168
   427
		
dvander@2168
   428
		new output[Item];
dvander@2168
   429
		GetArrayArray(g_DataArray, location, output[0]);
dvander@2168
   430
		
dvander@2168
   431
		strcopy(g_command[param], sizeof(g_command[]), output[Item_cmd]);
dvander@2168
   432
					
dvander@2168
   433
		g_currentPlace[param][Place_Item] = location;
dvander@2168
   434
		g_currentPlace[param][Place_ReplaceNum] = 1;
dvander@2168
   435
		
dvander@2168
   436
		ParamCheck(param);
dvander@2168
   437
	}
dvander@2168
   438
}
dvander@2168
   439
dvander@2168
   440
public ParamCheck(client)
dvander@2168
   441
{
dvander@2168
   442
	new String:buffer[6];
dvander@2168
   443
	new String:buffer2[6];
dvander@2168
   444
	
dvander@2168
   445
	new outputItem[Item];
dvander@2168
   446
	new outputSubmenu[Submenu];
dvander@2168
   447
	
dvander@2168
   448
	GetArrayArray(g_DataArray, g_currentPlace[client][Place_Item], outputItem[0]);
dvander@2168
   449
		
dvander@2168
   450
	if (g_currentPlace[client][Place_ReplaceNum] < 1)
dvander@2168
   451
	{
dvander@2168
   452
		g_currentPlace[client][Place_ReplaceNum] = 1;
dvander@2168
   453
	}
dvander@2168
   454
	
dvander@2168
   455
	Format(buffer, 5, "#%i", g_currentPlace[client][Place_ReplaceNum]);
dvander@2168
   456
	Format(buffer2, 5, "@%i", g_currentPlace[client][Place_ReplaceNum]);
dvander@2168
   457
	
dvander@2168
   458
	if (StrContains(g_command[client], buffer) != -1 || StrContains(g_command[client], buffer2) != -1)
dvander@2168
   459
	{
dvander@2168
   460
		GetArrayArray(outputItem[Item_submenus], g_currentPlace[client][Place_ReplaceNum] - 1, outputSubmenu[0]);
dvander@2168
   461
		
dvander@2168
   462
		new Handle:itemMenu = CreateMenu(Menu_Selection);
dvander@2168
   463
		SetMenuExitBackButton(itemMenu, true);
dvander@2168
   464
			
dvander@2168
   465
		if ((outputSubmenu[Submenu_type] == SubMenu_Group) || (outputSubmenu[Submenu_type] == SubMenu_GroupPlayer))
dvander@2168
   466
		{	
dvander@2168
   467
			decl String:nameBuffer[ARRAY_STRING_LENGTH];
dvander@2168
   468
			decl String:commandBuffer[ARRAY_STRING_LENGTH];
dvander@2168
   469
		
dvander@2168
   470
			for (new i = 0; i<g_groupCount; i++)
dvander@2168
   471
			{			
dvander@2168
   472
				GetArrayString(g_groupList[groupListName], i, nameBuffer, sizeof(nameBuffer));
dvander@2168
   473
				GetArrayString(g_groupList[groupListCommand], i, commandBuffer, sizeof(commandBuffer));
dvander@2168
   474
				AddMenuItem(itemMenu, commandBuffer, nameBuffer);
dvander@2168
   475
			}
dvander@2168
   476
		}
dvander@2168
   477
		
dvander@2168
   478
		if (outputSubmenu[Submenu_type] == SubMenu_MapCycle)
dvander@2168
   479
		{	
dvander@2168
   480
			decl String:path[200];
dvander@2168
   481
			ReadPackString(outputSubmenu[Submenu_listdata], path, sizeof(path));
dvander@2168
   482
			ResetPack(outputSubmenu[Submenu_listdata]);
dvander@2168
   483
		
dvander@2168
   484
			new Handle:file = OpenFile(path, "rt");
dvander@2168
   485
			new String:readData[128];
dvander@2168
   486
			
dvander@2168
   487
			if(file != INVALID_HANDLE)
dvander@2168
   488
			{
dvander@2168
   489
				while(!IsEndOfFile(file) && ReadFileLine(file, readData, sizeof(readData)))
dvander@2168
   490
				{
dvander@2168
   491
					TrimString(readData);
dvander@2168
   492
					
dvander@2168
   493
					if (IsMapValid(readData))
dvander@2168
   494
					{
dvander@2168
   495
						AddMenuItem(itemMenu, readData, readData);
dvander@2168
   496
					}
dvander@2168
   497
				}
dvander@2168
   498
			}
dvander@2168
   499
		}
dvander@2168
   500
		else if ((outputSubmenu[Submenu_type] == SubMenu_Player) || (outputSubmenu[Submenu_type] == SubMenu_GroupPlayer))
dvander@2168
   501
		{
dvander@2168
   502
			new PlayerMethod:playermethod = outputSubmenu[Submenu_method];
dvander@2168
   503
		
dvander@2168
   504
			new String:nameBuffer[32];
dvander@2168
   505
			new String:infoBuffer[32];
dvander@2168
   506
			new String:temp[4];
dvander@2168
   507
			
dvander@2168
   508
			//loop through players. Add name as text and name/userid/steamid as info
dvander@2168
   509
			for (new i=1; i<=g_maxPlayers; i++)
dvander@2168
   510
			{
dvander@2168
   511
				if (IsClientInGame(i))
dvander@2168
   512
				{			
dvander@2168
   513
					GetClientName(i, nameBuffer, 31);
dvander@2168
   514
					
dvander@2168
   515
					switch (playermethod)
dvander@2168
   516
					{
dvander@2168
   517
						case UserId:
dvander@2168
   518
						{
dvander@2168
   519
							new userid = GetClientUserId(i);
dvander@2168
   520
							Format(infoBuffer, sizeof(infoBuffer), "#%i", userid);
dvander@2168
   521
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);	
dvander@2168
   522
						}
dvander@2168
   523
						case UserId2:
dvander@2168
   524
						{
dvander@2168
   525
							new userid = GetClientUserId(i);
dvander@2168
   526
							Format(infoBuffer, sizeof(infoBuffer), "%i", userid);
dvander@2168
   527
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);							
dvander@2168
   528
						}
dvander@2168
   529
						case SteamId:
dvander@2168
   530
						{
dvander@2168
   531
							GetClientAuthString(i, infoBuffer, sizeof(infoBuffer));
dvander@2168
   532
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);							
dvander@2168
   533
						}	
dvander@2168
   534
						case IpAddress:
dvander@2168
   535
						{
dvander@2168
   536
							GetClientIP(i, infoBuffer, sizeof(infoBuffer));
dvander@2168
   537
							AddMenuItem(itemMenu, infoBuffer, nameBuffer);							
dvander@2168
   538
						}
dvander@2168
   539
						case Name:
dvander@2168
   540
						{
dvander@2168
   541
							AddMenuItem(itemMenu, nameBuffer, nameBuffer);
dvander@2168
   542
						}	
dvander@2168
   543
						default: //assume client id
dvander@2168
   544
						{
dvander@2168
   545
							Format(temp,3,"%i",i);
dvander@2168
   546
							AddMenuItem(itemMenu, temp, nameBuffer);						
dvander@2168
   547
						}								
dvander@2168
   548
					}
dvander@2168
   549
				}
dvander@2168
   550
			}
dvander@2168
   551
		}
dvander@2168
   552
		else if (outputSubmenu[Submenu_type] == SubMenu_OnOff)
dvander@2168
   553
		{
dvander@2168
   554
			AddMenuItem(itemMenu, "1", "On");
dvander@2168
   555
			AddMenuItem(itemMenu, "0", "Off");
dvander@2168
   556
		}		
dvander@2168
   557
		else
dvander@2168
   558
		{
dvander@2168
   559
			new String:value[64];
dvander@2168
   560
			new String:text[64];
dvander@2168
   561
					
dvander@2168
   562
			new String:admin[NAME_LENGTH];
dvander@2168
   563
			
dvander@2168
   564
			for (new i=0; i<outputSubmenu[Submenu_listcount]; i++)
dvander@2168
   565
			{
dvander@2168
   566
				ReadPackString(outputSubmenu[Submenu_listdata], value, sizeof(value));
dvander@2168
   567
				ReadPackString(outputSubmenu[Submenu_listdata], text, sizeof(text));
dvander@2168
   568
				ReadPackString(outputSubmenu[Submenu_listdata], admin, sizeof(admin));
dvander@2168
   569
				
dvander@2168
   570
				if (CheckCommandAccess(client, admin, 0))
dvander@2168
   571
				{
dvander@2168
   572
					AddMenuItem(itemMenu, value, text);
dvander@2168
   573
				}
dvander@2168
   574
			}
dvander@2168
   575
			
dvander@2168
   576
			ResetPack(outputSubmenu[Submenu_listdata]);	
dvander@2168
   577
		}
dvander@2168
   578
		
dvander@2168
   579
		SetMenuTitle(itemMenu, outputSubmenu[Submenu_title]);
dvander@2168
   580
		
dvander@2168
   581
		DisplayMenu(itemMenu, client, MENU_TIME_FOREVER);
dvander@2168
   582
	}
dvander@2168
   583
	else
dvander@2168
   584
	{	
dvander@2168
   585
		//nothing else need to be done. Run teh command.
dvander@2168
   586
		
dvander@2168
   587
		DisplayTopMenu(hAdminMenu, client, TopMenuPosition_LastCategory);
dvander@2168
   588
		
dvander@2168
   589
		if (outputItem[Item_execute] == Execute_Player) // assume 'player' type execute option
dvander@2168
   590
		{
dvander@2168
   591
			FakeClientCommand(client, g_command[client]);
dvander@2168
   592
		}
dvander@2168
   593
		else // assume 'server' type execute option
dvander@2168
   594
		{
dvander@2168
   595
			InsertServerCommand(g_command[client]);
dvander@2168
   596
			ServerExecute();
dvander@2168
   597
		}
dvander@2168
   598
dvander@2168
   599
		g_command[client][0] = '\0';
dvander@2168
   600
		g_currentPlace[client][Place_ReplaceNum] = 1;
dvander@2168
   601
	}
dvander@2168
   602
}
dvander@2168
   603
dvander@2168
   604
public Menu_Selection(Handle:menu, MenuAction:action, param1, param2)
dvander@2168
   605
{
dvander@2168
   606
	if (action == MenuAction_End)
dvander@2168
   607
	{
dvander@2168
   608
		CloseHandle(menu);
dvander@2168
   609
	}
dvander@2168
   610
	
dvander@2168
   611
	if (action == MenuAction_Select)
dvander@2168
   612
	{
dvander@2168
   613
		new String:info[NAME_LENGTH];
dvander@2168
   614
 
dvander@2168
   615
		/* Get item info */
dvander@2168
   616
		new bool:found = GetMenuItem(menu, param2, info, sizeof(info));
dvander@2168
   617
		
dvander@2168
   618
		if (!found)
dvander@2168
   619
		{
dvander@2168
   620
			return;
dvander@2168
   621
		}
dvander@2168
   622
		
dvander@2168
   623
		new String:buffer[6];
dvander@2168
   624
		new String:infobuffer[NAME_LENGTH+2];
dvander@2168
   625
		Format(infobuffer, sizeof(infobuffer), "\"%s\"", info);
dvander@2168
   626
		
dvander@2168
   627
		Format(buffer, 5, "#%i", g_currentPlace[param1][Place_ReplaceNum]);
dvander@2168
   628
		ReplaceString(g_command[param1], sizeof(g_command[]), buffer, infobuffer);
dvander@2168
   629
		//replace #num with the selected option (quoted)
dvander@2168
   630
		
dvander@2168
   631
		Format(buffer, 5, "@%i", g_currentPlace[param1][Place_ReplaceNum]);
dvander@2168
   632
		ReplaceString(g_command[param1], sizeof(g_command[]), buffer, info);
dvander@2168
   633
		//replace @num with the selected option (unquoted)
dvander@2168
   634
		
dvander@2168
   635
		// Increment the parameter counter.
dvander@2168
   636
		g_currentPlace[param1][Place_ReplaceNum]++;
dvander@2168
   637
		
dvander@2168
   638
		ParamCheck(param1);
dvander@2168
   639
	}
dvander@2168
   640
	
dvander@2168
   641
	if (action == MenuAction_Cancel && param2 == MenuCancel_ExitBack)
dvander@2168
   642
	{
dvander@2168
   643
		//client exited we should go back to submenu i think
dvander@2168
   644
		DisplayTopMenu(hAdminMenu, param1, TopMenuPosition_LastCategory);
dvander@2168
   645
	}
dvander@2168
   646
}