- Код: Выделить всё
if((Start = Pos * MAPS_PER_PAGE) >= g_iMapsNum)
Start = Pos = g_MenuPosition[id] = 0;
Вот убейте, как не пытался не смог я выполнить условие этой проверки(не разу не вызывается), но она везде есть(во всяком случае в тех плагинах, которых я ковыряюсь). При каких обстоятельствах она вообще может выполниться? Есть ли в ней смысл?
Исходник приложу на всякий, что бы проще было понять о чем речь:
- Код: Выделить всё
#include <amxmodx>
#pragma semicolon 1
const PATH_STRLEN = 64;
const MAPNAME_SIZE = 32;
const MAPS_PER_PAGE = 8;
new Array:g_ArrayMaps, g_iMapsNum;
new g_MenuPosition[MAX_PLAYERS + 1];
new g_ConfigsDir[PATH_STRLEN], g_MapsFile[PATH_STRLEN + 32];
public plugin_init() {
register_menucmd(register_menuid("_maps_menu"), 1023, "HandleMapsMenu");
register_clcmd("say /b", "CmdMapsMenu");
}
public plugin_cfg() {
new File; g_ArrayMaps = ArrayCreate(MAPNAME_SIZE);
get_localinfo("amxx_configsdir", g_ConfigsDir, charsmax(g_ConfigsDir));
formatex(g_MapsFile, charsmax(g_MapsFile), "%s/maps.ini", g_ConfigsDir);
if((File = fopen(g_MapsFile, "rt")))
ReadMaps(File);
}
ReadMaps(const File) {
new Text[MAPNAME_SIZE];
while(!feof(File)) {
fgets(File, Text, charsmax(Text)); trim(Text);
if(!Text[0] || Text[0] == ';' || !is_map_valid(Text)) continue;
ArrayPushString(g_ArrayMaps, Text);
}
fclose(File); g_iMapsNum = ArraySize(g_ArrayMaps);
}
public CmdMapsMenu(const id) {
ShowMapsMenu(id, g_MenuPosition[id] = 0);
}
ShowMapsMenu(const id, Pos){
if(Pos < 0)
return PLUGIN_CONTINUE;
new Start, End, PagesNum, Len, Menu[512], TempMapName[MAPNAME_SIZE], b, Keys = MENU_KEY_0;
if((Start = Pos * MAPS_PER_PAGE) >= g_iMapsNum)
Start = Pos = g_MenuPosition[id] = 0;
if((End = Start + MAPS_PER_PAGE) > g_iMapsNum)
End = g_iMapsNum;
if((PagesNum = g_iMapsNum / MAPS_PER_PAGE + (g_iMapsNum % MAPS_PER_PAGE ? 1 : 0)) == 1)
Len = copy(Menu, charsmax(Menu), "\yМеню смены карты^n^n");
else
Len = formatex(Menu, charsmax(Menu), "\yМеню смены карты \d(%d/%d)^n^n", Pos + 1, PagesNum);
while(Start < End) {
Keys |= (1<<b);
ArrayGetString(g_ArrayMaps, Start, TempMapName, charsmax(TempMapName));
Len += formatex(Menu[Len], charsmax(Menu) - Len, "\y%d. \w%s^n", ++b, TempMapName);
Start++;
}
if(End < g_iMapsNum) {
Keys |= MENU_KEY_9;
formatex(Menu[Len], charsmax(Menu) - Len, "^n\y9. \wДалее^n\y0. \w%s", Pos ? "Назад" : "Выход");
} else
formatex(Menu[Len], charsmax(Menu) - Len, "^n\y0. \w%s", Pos ? "Назад" : "Выход");
return show_menu(id, Keys, Menu, -1, "_maps_menu");
}
public HandleMapsMenu(const id, const Key) {
switch(Key) {
case 8: ShowMapsMenu(id, ++g_MenuPosition[id]);
case 9: ShowMapsMenu(id, --g_MenuPosition[id]);
default:{
new TempMapName[MAPNAME_SIZE], g_Target = g_MenuPosition[id] * MAPS_PER_PAGE + Key;
ArrayGetString(g_ArrayMaps, g_Target, TempMapName, charsmax(TempMapName));
message_begin(MSG_ALL, SVC_INTERMISSION);
message_end();
set_task(3.0, "ChangeMap", _, TempMapName, charsmax(TempMapName));
}
}
}
public ChangeMap(const map[]) {
server_cmd("changelevel %s", map);
}