plugins/basecommands/map.sp
author David Anderson <dvander@alliedmods.net>
Wed Oct 31 05:26:08 2007 +0000 (2007-10-31)
changeset 1658 2a449596c3a8
parent 1623 382af42756e3
child 1738 cb3be0b31d99
permissions -rw-r--r--
- fixed bug where the menu map parser truncated lines and thus gave IsMapValid() weird results
- fixed a bug where kicking yourself could throw an RTE
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
	
dvander@1623
    17
		ShowActivity2(param1, "[SM] ", "%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
dvander@1623
    62
	ShowActivity2(client, "[SM] ", "%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
ferret99gt@1606
    85
LoadMapList(Handle:menu)
pred@1536
    86
{
pred@1536
    87
	decl String:mapPath[256];
dvander@1592
    88
	BuildPath(Path_SM, mapPath, sizeof(mapPath), "configs/adminmenu_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
	new Handle:file = OpenFile(mapPath, "rt");
pred@1536
   117
	if (file == INVALID_HANDLE)
pred@1536
   118
	{
pred@1580
   119
		LogError("[SM] Could not open file: %s, reverting to map folder", mapPath);
pred@1580
   120
		return LoadMapFolder(menu);
pred@1536
   121
	}
pred@1536
   122
	
dvander@1658
   123
	decl String:buffer[256], len;
pred@1536
   124
	while (!IsEndOfFile(file) && ReadFileLine(file, buffer, sizeof(buffer)))
pred@1536
   125
	{
pred@1536
   126
		TrimString(buffer);
dvander@1658
   127
		
pred@1536
   128
		if ((len = StrContains(buffer, ".bsp", false)) != -1)
pred@1536
   129
		{
pred@1536
   130
			buffer[len] = '\0';
pred@1536
   131
		}
pred@1536
   132
dvander@1658
   133
		if (buffer[0] == '\0' 
dvander@1658
   134
			|| buffer[0] == ';'
dvander@1658
   135
			|| buffer[0] == '/'
dvander@1658
   136
			|| !IsValidConVarChar(buffer[0]))
pred@1536
   137
		{
pred@1536
   138
			continue;
pred@1536
   139
		}
dvander@1658
   140
		
dvander@1658
   141
		if (IsMapValid(buffer))
dvander@1658
   142
		{
dvander@1658
   143
			AddMenuItem(menu, buffer, buffer);
dvander@1658
   144
		}
pred@1536
   145
	}
pred@1536
   146
pred@1536
   147
	CloseHandle(file);
pred@1580
   148
	
pred@1580
   149
	new count = GetMenuItemCount(menu);
pred@1580
   150
	
pred@1580
   151
	if (!count)
pred@1580
   152
		return LoadMapFolder(menu);
pred@1580
   153
	else
pred@1580
   154
		return count;
pred@1580
   155
}
pred@1580
   156
pred@1580
   157
LoadMapFolder(Handle:menu)
pred@1580
   158
{
pred@1580
   159
	LogMessage("[SM] Loading menu map list from maps folder");
pred@1580
   160
	
pred@1580
   161
	new Handle:mapDir = OpenDirectory("maps/");
pred@1580
   162
	
pred@1580
   163
	if (mapDir == INVALID_HANDLE)
pred@1580
   164
	{
pred@1580
   165
		LogError("[SM] Could not open map directory for reading");
pred@1580
   166
		return 0;
pred@1580
   167
	}
pred@1580
   168
	
pred@1580
   169
	new String:mapName[64];
pred@1580
   170
	new String:buffer[64];
pred@1580
   171
	new FileType:fileType;
pred@1580
   172
	new len;
pred@1580
   173
	
pred@1580
   174
	while(ReadDirEntry(mapDir, mapName, sizeof(mapName), fileType))
pred@1580
   175
	{
pred@1580
   176
		if(fileType == FileType_File)
pred@1580
   177
		{
pred@1580
   178
			len = strlen(mapName);
pred@1580
   179
pred@1580
   180
			if(SplitString(mapName, ".bsp", buffer, sizeof(buffer)) == len)
pred@1580
   181
			{
pred@1580
   182
				AddMenuItem(menu, buffer, buffer);
pred@1580
   183
			}
pred@1580
   184
		}
pred@1580
   185
  	}
pred@1580
   186
  	
pred@1580
   187
  	CloseHandle(mapDir);
pred@1580
   188
  	
pred@1580
   189
  	return GetMenuItemCount(menu);
dvander@1592
   190
}