plugins/basecommands/map.sp
author Matt Woodrow <pred@alliedmods.net>
Mon Oct 15 21:12:52 2007 +0000 (2007-10-15)
changeset 1580 e5198a9a458b
parent 1536 fe2146e4975d
child 1592 ff10cfeaf5d2
permissions -rw-r--r--
Menu map lists (map and votemap) now fall back to the contents of maps folder if the menu_maplist.ini isn't found
pred@1536
     1
pred@1536
     2
public MenuHandler_ChangeMap(Handle:menu, MenuAction:action, param1, param2)
pred@1536
     3
{
pred@1536
     4
	if (action == MenuAction_Cancel)
pred@1536
     5
	{
pred@1536
     6
		if (param2 == MenuCancel_ExitBack && hTopMenu != INVALID_HANDLE)
pred@1536
     7
		{
pred@1536
     8
			DisplayTopMenu(hTopMenu, param1, TopMenuPosition_LastCategory);
pred@1536
     9
		}
pred@1536
    10
	}
pred@1536
    11
	else if (action == MenuAction_Select)
pred@1536
    12
	{
pred@1536
    13
		decl String:map[64];
pred@1536
    14
		
pred@1536
    15
		GetMenuItem(menu, param2, map, sizeof(map));
pred@1536
    16
	
pred@1536
    17
		ShowActivity(param1, "%t", "Changing map", map);
pred@1536
    18
pred@1536
    19
		LogAction(param1, -1, "\"%L\" changed map to \"%s\"", param1, map);
pred@1536
    20
pred@1536
    21
		new Handle:dp;
pred@1536
    22
		CreateDataTimer(3.0, Timer_ChangeMap, dp);
pred@1536
    23
		WritePackString(dp, map);
pred@1536
    24
pred@1536
    25
	}
pred@1536
    26
}
pred@1536
    27
pred@1536
    28
public AdminMenu_Map(Handle:topmenu, 
pred@1536
    29
							  TopMenuAction:action,
pred@1536
    30
							  TopMenuObject:object_id,
pred@1536
    31
							  param,
pred@1536
    32
							  String:buffer[],
pred@1536
    33
							  maxlength)
pred@1536
    34
{
pred@1536
    35
	if (action == TopMenuAction_DisplayOption)
pred@1536
    36
	{
pred@1536
    37
		Format(buffer, maxlength, "%T", "Choose Map", param);
pred@1536
    38
	}
pred@1536
    39
	else if (action == TopMenuAction_SelectOption)
pred@1536
    40
	{
pred@1536
    41
		DisplayMenu(g_MapList, param, MENU_TIME_FOREVER);
pred@1536
    42
	}
pred@1536
    43
}
pred@1536
    44
pred@1536
    45
public Action:Command_Map(client, args)
pred@1536
    46
{
pred@1536
    47
	if (args < 1)
pred@1536
    48
	{
pred@1536
    49
		ReplyToCommand(client, "[SM] Usage: sm_map <map>");
pred@1536
    50
		return Plugin_Handled;
pred@1536
    51
	}
pred@1536
    52
pred@1536
    53
	decl String:map[64];
pred@1536
    54
	GetCmdArg(1, map, sizeof(map));
pred@1536
    55
pred@1536
    56
	if (!IsMapValid(map))
pred@1536
    57
	{
pred@1536
    58
		ReplyToCommand(client, "[SM] %t", "Map was not found", map);
pred@1536
    59
		return Plugin_Handled;
pred@1536
    60
	}
pred@1536
    61
pred@1536
    62
	ShowActivity(client, "%t", "Changing map", map);
pred@1536
    63
pred@1536
    64
	LogAction(client, -1, "\"%L\" changed map to \"%s\"", client, map);
pred@1536
    65
pred@1536
    66
	new Handle:dp;
pred@1536
    67
	CreateDataTimer(3.0, Timer_ChangeMap, dp);
pred@1536
    68
	WritePackString(dp, map);
pred@1536
    69
pred@1536
    70
	return Plugin_Handled;
pred@1536
    71
}
pred@1536
    72
pred@1536
    73
public Action:Timer_ChangeMap(Handle:timer, Handle:dp)
pred@1536
    74
{
pred@1536
    75
	decl String:map[65];
pred@1536
    76
pred@1536
    77
	ResetPack(dp);
pred@1536
    78
	ReadPackString(dp, map, sizeof(map));
pred@1536
    79
pred@1536
    80
	ServerCommand("changelevel \"%s\"", map);
pred@1536
    81
pred@1536
    82
	return Plugin_Stop;
pred@1536
    83
}
pred@1536
    84
pred@1536
    85
LoadMaps(Handle:menu)
pred@1536
    86
{
pred@1536
    87
	decl String:mapPath[256];
pred@1536
    88
	BuildPath(Path_SM, mapPath, sizeof(mapPath), "configs/menu_maplist.ini");
pred@1536
    89
	
pred@1536
    90
	if (!FileExists(mapPath))
pred@1580
    91
	{	
pred@1536
    92
		if (g_MapList != INVALID_HANDLE)
pred@1536
    93
		{
pred@1536
    94
			RemoveAllMenuItems(menu);
pred@1536
    95
		}
pred@1536
    96
		
pred@1580
    97
		return LoadMapFolder(menu);		
pred@1536
    98
	}
pred@1536
    99
pred@1536
   100
	// If the file hasn't changed, there's no reason to reload
pred@1536
   101
	// all of the maps.
pred@1536
   102
	new fileTime =  GetFileTime(mapPath, FileTime_LastChange);
pred@1536
   103
	if (g_mapFileTime == fileTime)
pred@1536
   104
	{
pred@1580
   105
		return GetMenuItemCount(menu);
pred@1536
   106
	}
pred@1536
   107
	
pred@1536
   108
	g_mapFileTime = fileTime;
pred@1536
   109
	
pred@1536
   110
	// Reset the array
pred@1536
   111
	if (g_MapList != INVALID_HANDLE)
pred@1536
   112
	{
pred@1536
   113
		RemoveAllMenuItems(menu);
pred@1536
   114
	}
pred@1536
   115
pred@1536
   116
	LogMessage("[SM] Loading menu map list file [%s]", mapPath);
pred@1536
   117
pred@1536
   118
	new Handle:file = OpenFile(mapPath, "rt");
pred@1536
   119
	if (file == INVALID_HANDLE)
pred@1536
   120
	{
pred@1580
   121
		LogError("[SM] Could not open file: %s, reverting to map folder", mapPath);
pred@1580
   122
		return LoadMapFolder(menu);
pred@1536
   123
	}
pred@1536
   124
	
pred@1536
   125
	decl String:buffer[64], len;
pred@1536
   126
	while (!IsEndOfFile(file) && ReadFileLine(file, buffer, sizeof(buffer)))
pred@1536
   127
	{
pred@1536
   128
		TrimString(buffer);
pred@1536
   129
pred@1536
   130
		if ((len = StrContains(buffer, ".bsp", false)) != -1)
pred@1536
   131
		{
pred@1536
   132
			buffer[len] = '\0';
pred@1536
   133
		}
pred@1536
   134
pred@1536
   135
		if (buffer[0] == '\0' || !IsValidConVarChar(buffer[0]) || !IsMapValid(buffer))
pred@1536
   136
		{
pred@1536
   137
			continue;
pred@1536
   138
		}
pred@1536
   139
pred@1536
   140
		AddMenuItem(menu, buffer, buffer);
pred@1536
   141
	}
pred@1536
   142
pred@1536
   143
	CloseHandle(file);
pred@1580
   144
	
pred@1580
   145
	new count = GetMenuItemCount(menu);
pred@1580
   146
	
pred@1580
   147
	if (!count)
pred@1580
   148
		return LoadMapFolder(menu);
pred@1580
   149
	else
pred@1580
   150
		return count;
pred@1580
   151
}
pred@1580
   152
pred@1580
   153
LoadMapFolder(Handle:menu)
pred@1580
   154
{
pred@1580
   155
	LogMessage("[SM] Loading menu map list from maps folder");
pred@1580
   156
	
pred@1580
   157
	new Handle:mapDir = OpenDirectory("maps/");
pred@1580
   158
	
pred@1580
   159
	if (mapDir == INVALID_HANDLE)
pred@1580
   160
	{
pred@1580
   161
		LogError("[SM] Could not open map directory for reading");
pred@1580
   162
		return 0;
pred@1580
   163
	}
pred@1580
   164
	
pred@1580
   165
	new String:mapName[64];
pred@1580
   166
	new String:buffer[64];
pred@1580
   167
	new FileType:fileType;
pred@1580
   168
	new len;
pred@1580
   169
	
pred@1580
   170
	while(ReadDirEntry(mapDir, mapName, sizeof(mapName), fileType))
pred@1580
   171
	{
pred@1580
   172
		if(fileType == FileType_File)
pred@1580
   173
		{
pred@1580
   174
			len = strlen(mapName);
pred@1580
   175
pred@1580
   176
			if(SplitString(mapName, ".bsp", buffer, sizeof(buffer)) == len)
pred@1580
   177
			{
pred@1580
   178
				AddMenuItem(menu, buffer, buffer);
pred@1580
   179
			}
pred@1580
   180
		}
pred@1580
   181
  	}
pred@1580
   182
  	
pred@1580
   183
  	CloseHandle(mapDir);
pred@1580
   184
  	
pred@1580
   185
  	return GetMenuItemCount(menu);
pred@1536
   186
}