Русское сообщество по скриптингу

Условие в многостраничных меню  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Условие в многостраничных меню

Сообщение Selpsan » 15 мар 2017, 13:01

Немного ковыряю код, изучаю плагины других авторов, понемногу, и во всех встречается примерно такая проверка(в многостраничных меню):
Код: Выделить всё
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_ArrayMapsg_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 
Fileg_ArrayMaps ArrayCreate(MAPNAME_SIZE);
    
get_localinfo("amxx_configsdir"g_ConfigsDircharsmax(g_ConfigsDir));
    
formatex(g_MapsFilecharsmax(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(FileTextcharsmax(Text)); trim(Text);
        if(!
Text[0] || Text[0] == ';' || !is_map_valid(Text)) continue;
        
ArrayPushString(g_ArrayMapsText);
    }
    
fclose(File); g_iMapsNum ArraySize(g_ArrayMaps);
}

public 
CmdMapsMenu(const id) {
    
ShowMapsMenu(idg_MenuPosition[id] = 0);
}

ShowMapsMenu(const idPos){
    if(
Pos 0)
        return 
PLUGIN_CONTINUE;
    
    new 
StartEndPagesNumLenMenu[512], TempMapName[MAPNAME_SIZE], bKeys 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 0)) == 1)
        
Len copy(Menucharsmax(Menu), "\yМеню смены карты^n^n");
    else
        
Len formatex(Menucharsmax(Menu), "\yМеню смены карты \d(%d/%d)^n^n"Pos 1PagesNum);
    
    while(
Start End) {
        
Keys |= (1<<b);
        
ArrayGetString(g_ArrayMapsStartTempMapNamecharsmax(TempMapName));
        
Len += formatex(Menu[Len], charsmax(Menu) - Len"\y%d. \w%s^n", ++bTempMapName);
        
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(idKeysMenu, -1"_maps_menu");
}

public 
HandleMapsMenu(const id, const Key) {
    switch(
Key) {
        case 
8ShowMapsMenu(id, ++g_MenuPosition[id]);
        case 
9ShowMapsMenu(id, --g_MenuPosition[id]);
        default:{
            new 
TempMapName[MAPNAME_SIZE], g_Target g_MenuPosition[id] * MAPS_PER_PAGE Key;
            
ArrayGetString(g_ArrayMapsg_TargetTempMapNamecharsmax(TempMapName));
            
message_begin(MSG_ALLSVC_INTERMISSION); 
            
message_end();
            
set_task(3.0"ChangeMap"_TempMapNamecharsmax(TempMapName));
        }
    }
}

public 
ChangeMap(const map[]) {
    
server_cmd("changelevel %s"map);
}
 
Аватара пользователя
Selpsan
 
Сообщения: 10
Зарегистрирован: 14 мар 2016, 16:29
Благодарил (а): 4 раз.
Поблагодарили: 14 раз.
Языки программирования: Counter-Strike 1.6

Re: Условие в многостраничных меню  [Решено]

Сообщение NEoMASTERR » 15 мар 2017, 13:05

Последнюю карту могли удалить с массива пока кто то перелистывал страницы. В таком случае будет возврат на 0 страницу. Т.е. при перелистывании на пустую страницу ставится нулевая
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Условие в многостраничных меню

Сообщение Selpsan » 15 мар 2017, 13:15

NEoMASTERR, а, вон оно что, но это подойдет больше при работе меню игроков получается, в данном примере в массив записываются данные только при старте. Спасибо.
Аватара пользователя
Selpsan
 
Сообщения: 10
Зарегистрирован: 14 мар 2016, 16:29
Благодарил (а): 4 раз.
Поблагодарили: 14 раз.
Языки программирования: Counter-Strike 1.6


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 12