• Гость, перед открытием темы прочитай описание раздела, чтобы не ошибиться. Любые вопросы по настройке сервера создаются в разделе Технической Поддержки.

Помощь index out of bounds

8ball1

Участник
Сообщения
10
Симпатии
0
Баллы
57
#1
L 04/05/2019 - 19:52:50: [AMXX] Displaying debug trace (plugin "players_menu.amxx", version "1.3")
L 04/05/2019 - 19:52:50: [AMXX] Run time error 4: index out of bounds
L 04/05/2019 - 19:52:50: [AMXX] [0] 1faf8327d645dd0f9ee2e81ecbe9ecde.sma: PlayersMenuHandler (line 64)
Помогите исправить, заранее благодарен.
Исходник прилагаю.
 

Вложения

g3cKpunTop

Скриптер
Сообщения
93
Симпатии
21
Баллы
69
#2
C++:
#include <amxmodx>
#include <cstrike>

#define SUPERADMIN             // Может пинать, кикать и тд игроков с иммунитетом
#define SUPER_FLAG    ADMIN_RCON

new g_iSlapSettings[] =
{
    0,     // 0 HP
    5,     // 5 HP
    10,    // 10 HP
    0     // убить
}
new g_szTeams[][] =
{
    "Террористы",
    "Контр-Террористы",
    "Наблюдатели"
}

enum _:MENUS
{
    SLAP,
    KICK,
    TEAM
}

enum _:DATA { Menu, Pos, Item };
new g_iPlMenu[33][DATA];
new g_iPlArray[33][32];

public plugin_init()
{
    register_plugin("Players Menu", "1.3", "neugomon");
    
    register_clcmd("amx_kickmenu", "cmdKickMenu", ADMIN_KICK);
    register_clcmd("amx_slapmenu", "cmdSlapMenu", ADMIN_SLAY);
    register_clcmd("amx_teammenu", "cmdTeamMenu", ADMIN_BAN);
    
    register_menucmd(register_menuid("Players Menu"), 1023, "PlayersMenuHandler");
}

public cmdKickMenu(id, flags)
    return PreOpenMenu(id, flags, KICK);
    
public cmdSlapMenu(id, flags)
    return PreOpenMenu(id, flags, SLAP);
    
public cmdTeamMenu(id, flags)
    return PreOpenMenu(id, flags, TEAM);   

public PlayersMenuHandler(id, key)
{
    if(!is_user_connected(id)) return PLUGIN_HANDLED;
    switch(key)
    {
        case 7:
        {
            switch(g_iPlMenu[id][Menu])
            {
                case KICK: KickHandler(id, g_iPlArray[id][g_iPlMenu[Pos][id] * 8 + key]);
                case SLAP:
                {
                    if(++g_iPlMenu[id][Item] > charsmax(g_iSlapSettings))
                        g_iPlMenu[id][Item] = 0;               
                    BuildMenu(id, g_iPlMenu[id][Pos]);
                }
                case TEAM:
                {
                    if(++g_iPlMenu[id][Item] > charsmax(g_szTeams))
                        g_iPlMenu[id][Item] = 0;
                    BuildMenu(id, g_iPlMenu[id][Pos]);   
                }
            }   
        }
        case 8: BuildMenu(id, ++g_iPlMenu[id][Pos]);
        case 9: if(g_iPlMenu[id][Pos]) BuildMenu(id, --g_iPlMenu[id][Pos]);
        default:
        {
            switch(g_iPlMenu[id][Menu])
            {
                case KICK: KickHandler(id, g_iPlArray[id][g_iPlMenu[id][Pos] * 8 + key]);
                case SLAP: SlapHandler(id, g_iPlArray[id][g_iPlMenu[id][Pos] * 7 + key]);
                case TEAM: TeamHandler(id, g_iPlArray[id][g_iPlMenu[id][Pos] * 7 + key]);
            }
        }
    }
    return PLUGIN_HANDLED;
}

PreOpenMenu(id, flags, menu)
{
    if(get_user_flags(id) & flags)
    {
        g_iPlMenu[id][Pos]     = 0;
        g_iPlMenu[id][Item]     = 0;
        g_iPlMenu[id][Menu]     = menu;
        
        BuildMenu(id, g_iPlMenu[id][Pos]);
    }
    else    console_print(id, "* Недостаточно прав для использования этой команды!");
    return PLUGIN_HANDLED;
}

BuildMenu(id, pos)
{
    new szMenu[512];
    new len;
    new start;
    new end;
    new keys = MENU_KEY_0;
    new pnum;
    new pages;
    get_players(g_iPlArray[id], pnum, "h");
    
    if(g_iPlMenu[id][Menu] == KICK)
    {
        start = pos * 8;
        end   = start + 8;
        pages = (pnum / 8 + ((pnum % 8) ? 1 : 0));
    }
    else
    {
        start = pos * 7;
        end   = start + 7;
        pages = (pnum / 7 + ((pnum % 7) ? 1 : 0));
    }
    
    if(start >= pnum)
        start = g_iPlMenu[id][Pos] = 0;
    if(end > pnum)
        end = pnum;
    
    switch(g_iPlMenu[id][Menu])
    {
        case KICK: len = formatex(szMenu, charsmax(szMenu), "\d[\rKick Menu\d] ");
        case SLAP: len = formatex(szMenu, charsmax(szMenu), "\d[\rSlap/Slay Menu\d] ");   
        case TEAM: len = formatex(szMenu, charsmax(szMenu), "\d[\rTeam Menu\d] ");   
    }
    
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\yВыберите игрока\w\R%d/%d^n^n", pos + 1, pages);
#if defined SUPERADMIN
    new bool:flagSuperId = bool:(get_user_flags(id) & SUPER_FLAG);
#endif   
    for(new i = start, szName[32], team[15], flags, a; i < end; i++)
    {
        get_user_name(g_iPlArray[id][i], szName, charsmax(szName));

        if(g_iPlMenu[id][Menu] == SLAP)
        {
            if(!is_user_alive(g_iPlArray[id][i]))
            {
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%d. %s^n", ++a, szName);
                continue;
            }   
        }
        
        flags = get_user_flags(g_iPlArray[id][i]);
    #if defined SUPERADMIN
        if(!flagSuperId && id != g_iPlArray[id][i] && flags & ADMIN_IMMUNITY)
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, szName);
            continue;
        }
    #else
        if(id != g_iPlArray[id][i] && flags & ADMIN_IMMUNITY)
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, szName);
            continue;
        }
    #endif
        switch(g_iPlMenu[id][Menu])
        {
            case TEAM:
            {
                new tm = _:cs_get_user_team(g_iPlArray[id][i]);
                switch(tm)
                {
                    case 1: team = "\d[\rTE\d]";
                    case 2:    team = "\d[\rCT\d]";
                    case 3:    team = "\d[\rSPEC\d]";
                }
            
                if(tm == g_iPlMenu[id][Item]+1)
                {
                    if(flags & ADMIN_MENU)
                        len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s \d[\r%s\d] %s^n", ++a, szName, (id != g_iPlArray[id][i]) ? "Admin" : "Вы", team);
                    else     len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s %s^n", ++a, szName, team);
                }
                else
                {
                    keys |= (1 << a++);
                    if(flags & ADMIN_MENU)
                        len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \y%s \d[\r%s\d] %s^n", a, szName, (id != g_iPlArray[id][i]) ? "Admin" : "Вы", team);
                    else     len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \w%s %s^n", a, szName, team);
                }
            }
            default:
            {
                keys |= (1 << a++);
                
                if(flags & ADMIN_MENU)
                    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \y%s \d[\r%s\d]^n", a, szName, (id != g_iPlArray[id][i]) ? "Admin" : "Вы");
                else     len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \w%s^n", a, szName);
            }
        }
        
    }
    
    switch(g_iPlMenu[id][Menu])
    {
        case SLAP:
        {
            if(g_iPlMenu[id][Item] == charsmax(g_iSlapSettings) && g_iSlapSettings[g_iPlMenu[id][Item]] == 0)
                len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r8. \yУбить^n");
            else     len += formatex(szMenu[len], charsmax(szMenu) - len,
                    "^n\r8. \wСтукнуть на \y%d \wHP^n", g_iSlapSettings[g_iPlMenu[id][Item]]);
            keys |= MENU_KEY_8;   
        }
        case TEAM:
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r8. \w%s^n", g_szTeams[g_iPlMenu[id][Item]]);
            keys |= MENU_KEY_8;
        }
    }

    if(end != pnum)
    {
        formatex(szMenu[len], charsmax(szMenu) - len, "^n\r9. \yДалее^n\r0. \r%s", pos ? "Назад" : "Выход");
        keys |= MENU_KEY_9;
    }
    else formatex(szMenu[len], charsmax(szMenu) - len, "^n\r0. \r%s", pos ? "Назад" : "Выход");
    
    show_menu(id, keys, szMenu, -1, "Players Menu");
    return PLUGIN_HANDLED;
}

KickHandler(id, player)
{
    new name[32];  get_user_name(id, name, charsmax(name));
    new name2[32]; get_user_name(player, name2, charsmax(name2));

    ChatColor("^1[^4Kick Menu^1] ^4Администратор ^3%s ^4кикнул ^3%s", name, name2);
    server_cmd("kick #%d Вы были удалены с сервера администратором %s", get_user_userid(player), name);
}

SlapHandler(id, player)
{
    new authid[25];     get_user_authid(id, authid, charsmax(authid));
    new authid2[25];     get_user_authid(player, authid2, charsmax(authid2));
    new name[32];        get_user_name(id, name, charsmax(name));
    new name2[32];        get_user_name(player, name2, charsmax(name2));

    new aSize = sizeof g_iSlapSettings;
    if(aSize > 1 && g_iPlMenu[id][Item] < aSize - 1)
    {
        new item = g_iPlMenu[id][Item];
        log_amx("Cmd: ^"%s<%s>^" slap with %d damage ^"%s<%s>^"", name, authid, g_iSlapSettings[item], name2, authid2);
        ChatColor("^1[^4Slap^1] ^4Администратор ^3%s ^4стукнул ^3%s ^4на ^3%d HP", name, name2, g_iSlapSettings[item]);
        user_slap(player, (get_user_health(player) > g_iSlapSettings[item]) ? g_iSlapSettings[item] : 0);
        
        BuildMenu(id, g_iPlMenu[id][Pos]);
    }
    else
    {
        log_amx("Cmd: ^"%s<%s>^" slay ^"%s<%s>^"", name, authid, name2, authid2);
        ChatColor("^1[^4Slay^1] ^4Администратор ^3%s ^4убил ^3%s", name, name2);
        user_kill(player, 1);
    }
}

TeamHandler(id, player)
{
    new name[32];  get_user_name(id, name, charsmax(name));
    new name2[32]; get_user_name(player, name2, charsmax(name2));
    ChatColor("^1[^4Team Menu^1] ^4Администратор ^3%s ^4перевел ^3%s ^4за ^3%s", name, name2, g_szTeams[g_iPlMenu[id][Item]]);

    if(is_user_alive(player)) user_kill(player, 1);
    cs_set_user_team(player, g_iPlMenu[id][Item] + 1);   
}

stock ChatColor(const szMessage[], any:...)
{
    new szMsg[190];
    vformat(szMsg, charsmax(szMsg), szMessage, 2);
    
    new pl[32], pnum;
    get_players(pl, pnum, "c");
    
    for(new i; i < pnum; i++)
    {
        message_begin(MSG_ONE_UNRELIABLE, 76, .player = pl[i]);
        write_byte(pl[i]);
        write_string(szMsg);
        message_end();
    }
}
 

8ball1

Участник
Сообщения
10
Симпатии
0
Баллы
57
#4
C++:
#include <amxmodx>
#include <cstrike>

#define SUPERADMIN             // Может пинать, кикать и тд игроков с иммунитетом
#define SUPER_FLAG    ADMIN_RCON

new g_iSlapSettings[] =
{
    0,     // 0 HP
    5,     // 5 HP
    10,    // 10 HP
    0     // убить
}
new g_szTeams[][] =
{
    "Террористы",
    "Контр-Террористы",
    "Наблюдатели"
}

enum _:MENUS
{
    SLAP,
    KICK,
    TEAM
}

enum _:DATA { Menu, Pos, Item };
new g_iPlMenu[33][DATA];
new g_iPlArray[33][32];

public plugin_init()
{
    register_plugin("Players Menu", "1.3", "neugomon");
   
    register_clcmd("amx_kickmenu", "cmdKickMenu", ADMIN_KICK);
    register_clcmd("amx_slapmenu", "cmdSlapMenu", ADMIN_SLAY);
    register_clcmd("amx_teammenu", "cmdTeamMenu", ADMIN_BAN);
   
    register_menucmd(register_menuid("Players Menu"), 1023, "PlayersMenuHandler");
}

public cmdKickMenu(id, flags)
    return PreOpenMenu(id, flags, KICK);
   
public cmdSlapMenu(id, flags)
    return PreOpenMenu(id, flags, SLAP);
   
public cmdTeamMenu(id, flags)
    return PreOpenMenu(id, flags, TEAM);  

public PlayersMenuHandler(id, key)
{
    if(!is_user_connected(id)) return PLUGIN_HANDLED;
    switch(key)
    {
        case 7:
        {
            switch(g_iPlMenu[id][Menu])
            {
                case KICK: KickHandler(id, g_iPlArray[id][g_iPlMenu[Pos][id] * 8 + key]);
                case SLAP:
                {
                    if(++g_iPlMenu[id][Item] > charsmax(g_iSlapSettings))
                        g_iPlMenu[id][Item] = 0;              
                    BuildMenu(id, g_iPlMenu[id][Pos]);
                }
                case TEAM:
                {
                    if(++g_iPlMenu[id][Item] > charsmax(g_szTeams))
                        g_iPlMenu[id][Item] = 0;
                    BuildMenu(id, g_iPlMenu[id][Pos]);  
                }
            }  
        }
        case 8: BuildMenu(id, ++g_iPlMenu[id][Pos]);
        case 9: if(g_iPlMenu[id][Pos]) BuildMenu(id, --g_iPlMenu[id][Pos]);
        default:
        {
            switch(g_iPlMenu[id][Menu])
            {
                case KICK: KickHandler(id, g_iPlArray[id][g_iPlMenu[id][Pos] * 8 + key]);
                case SLAP: SlapHandler(id, g_iPlArray[id][g_iPlMenu[id][Pos] * 7 + key]);
                case TEAM: TeamHandler(id, g_iPlArray[id][g_iPlMenu[id][Pos] * 7 + key]);
            }
        }
    }
    return PLUGIN_HANDLED;
}

PreOpenMenu(id, flags, menu)
{
    if(get_user_flags(id) & flags)
    {
        g_iPlMenu[id][Pos]     = 0;
        g_iPlMenu[id][Item]     = 0;
        g_iPlMenu[id][Menu]     = menu;
       
        BuildMenu(id, g_iPlMenu[id][Pos]);
    }
    else    console_print(id, "* Недостаточно прав для использования этой команды!");
    return PLUGIN_HANDLED;
}

BuildMenu(id, pos)
{
    new szMenu[512];
    new len;
    new start;
    new end;
    new keys = MENU_KEY_0;
    new pnum;
    new pages;
    get_players(g_iPlArray[id], pnum, "h");
   
    if(g_iPlMenu[id][Menu] == KICK)
    {
        start = pos * 8;
        end   = start + 8;
        pages = (pnum / 8 + ((pnum % 8) ? 1 : 0));
    }
    else
    {
        start = pos * 7;
        end   = start + 7;
        pages = (pnum / 7 + ((pnum % 7) ? 1 : 0));
    }
   
    if(start >= pnum)
        start = g_iPlMenu[id][Pos] = 0;
    if(end > pnum)
        end = pnum;
   
    switch(g_iPlMenu[id][Menu])
    {
        case KICK: len = formatex(szMenu, charsmax(szMenu), "\d[\rKick Menu\d] ");
        case SLAP: len = formatex(szMenu, charsmax(szMenu), "\d[\rSlap/Slay Menu\d] ");  
        case TEAM: len = formatex(szMenu, charsmax(szMenu), "\d[\rTeam Menu\d] ");  
    }
   
    len += formatex(szMenu[len], charsmax(szMenu) - len, "\yВыберите игрока\w\R%d/%d^n^n", pos + 1, pages);
#if defined SUPERADMIN
    new bool:flagSuperId = bool:(get_user_flags(id) & SUPER_FLAG);
#endif  
    for(new i = start, szName[32], team[15], flags, a; i < end; i++)
    {
        get_user_name(g_iPlArray[id][i], szName, charsmax(szName));

        if(g_iPlMenu[id][Menu] == SLAP)
        {
            if(!is_user_alive(g_iPlArray[id][i]))
            {
                len += formatex(szMenu[len], charsmax(szMenu) - len, "\d%d. %s^n", ++a, szName);
                continue;
            }  
        }
       
        flags = get_user_flags(g_iPlArray[id][i]);
    #if defined SUPERADMIN
        if(!flagSuperId && id != g_iPlArray[id][i] && flags & ADMIN_IMMUNITY)
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, szName);
            continue;
        }
    #else
        if(id != g_iPlArray[id][i] && flags & ADMIN_IMMUNITY)
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s \y[\rImmunity\y]^n", ++a, szName);
            continue;
        }
    #endif
        switch(g_iPlMenu[id][Menu])
        {
            case TEAM:
            {
                new tm = _:cs_get_user_team(g_iPlArray[id][i]);
                switch(tm)
                {
                    case 1: team = "\d[\rTE\d]";
                    case 2:    team = "\d[\rCT\d]";
                    case 3:    team = "\d[\rSPEC\d]";
                }
           
                if(tm == g_iPlMenu[id][Item]+1)
                {
                    if(flags & ADMIN_MENU)
                        len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s \d[\r%s\d] %s^n", ++a, szName, (id != g_iPlArray[id][i]) ? "Admin" : "Вы", team);
                    else     len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \d%s %s^n", ++a, szName, team);
                }
                else
                {
                    keys |= (1 << a++);
                    if(flags & ADMIN_MENU)
                        len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \y%s \d[\r%s\d] %s^n", a, szName, (id != g_iPlArray[id][i]) ? "Admin" : "Вы", team);
                    else     len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \w%s %s^n", a, szName, team);
                }
            }
            default:
            {
                keys |= (1 << a++);
               
                if(flags & ADMIN_MENU)
                    len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \y%s \d[\r%s\d]^n", a, szName, (id != g_iPlArray[id][i]) ? "Admin" : "Вы");
                else     len += formatex(szMenu[len], charsmax(szMenu) - len, "\r%d. \w%s^n", a, szName);
            }
        }
       
    }
   
    switch(g_iPlMenu[id][Menu])
    {
        case SLAP:
        {
            if(g_iPlMenu[id][Item] == charsmax(g_iSlapSettings) && g_iSlapSettings[g_iPlMenu[id][Item]] == 0)
                len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r8. \yУбить^n");
            else     len += formatex(szMenu[len], charsmax(szMenu) - len,
                    "^n\r8. \wСтукнуть на \y%d \wHP^n", g_iSlapSettings[g_iPlMenu[id][Item]]);
            keys |= MENU_KEY_8;  
        }
        case TEAM:
        {
            len += formatex(szMenu[len], charsmax(szMenu) - len, "^n\r8. \w%s^n", g_szTeams[g_iPlMenu[id][Item]]);
            keys |= MENU_KEY_8;
        }
    }

    if(end != pnum)
    {
        formatex(szMenu[len], charsmax(szMenu) - len, "^n\r9. \yДалее^n\r0. \r%s", pos ? "Назад" : "Выход");
        keys |= MENU_KEY_9;
    }
    else formatex(szMenu[len], charsmax(szMenu) - len, "^n\r0. \r%s", pos ? "Назад" : "Выход");
   
    show_menu(id, keys, szMenu, -1, "Players Menu");
    return PLUGIN_HANDLED;
}

KickHandler(id, player)
{
    new name[32];  get_user_name(id, name, charsmax(name));
    new name2[32]; get_user_name(player, name2, charsmax(name2));

    ChatColor("^1[^4Kick Menu^1] ^4Администратор ^3%s ^4кикнул ^3%s", name, name2);
    server_cmd("kick #%d Вы были удалены с сервера администратором %s", get_user_userid(player), name);
}

SlapHandler(id, player)
{
    new authid[25];     get_user_authid(id, authid, charsmax(authid));
    new authid2[25];     get_user_authid(player, authid2, charsmax(authid2));
    new name[32];        get_user_name(id, name, charsmax(name));
    new name2[32];        get_user_name(player, name2, charsmax(name2));

    new aSize = sizeof g_iSlapSettings;
    if(aSize > 1 && g_iPlMenu[id][Item] < aSize - 1)
    {
        new item = g_iPlMenu[id][Item];
        log_amx("Cmd: ^"%s<%s>^" slap with %d damage ^"%s<%s>^"", name, authid, g_iSlapSettings[item], name2, authid2);
        ChatColor("^1[^4Slap^1] ^4Администратор ^3%s ^4стукнул ^3%s ^4на ^3%d HP", name, name2, g_iSlapSettings[item]);
        user_slap(player, (get_user_health(player) > g_iSlapSettings[item]) ? g_iSlapSettings[item] : 0);
       
        BuildMenu(id, g_iPlMenu[id][Pos]);
    }
    else
    {
        log_amx("Cmd: ^"%s<%s>^" slay ^"%s<%s>^"", name, authid, name2, authid2);
        ChatColor("^1[^4Slay^1] ^4Администратор ^3%s ^4убил ^3%s", name, name2);
        user_kill(player, 1);
    }
}

TeamHandler(id, player)
{
    new name[32];  get_user_name(id, name, charsmax(name));
    new name2[32]; get_user_name(player, name2, charsmax(name2));
    ChatColor("^1[^4Team Menu^1] ^4Администратор ^3%s ^4перевел ^3%s ^4за ^3%s", name, name2, g_szTeams[g_iPlMenu[id][Item]]);

    if(is_user_alive(player)) user_kill(player, 1);
    cs_set_user_team(player, g_iPlMenu[id][Item] + 1);  
}

stock ChatColor(const szMessage[], any:...)
{
    new szMsg[190];
    vformat(szMsg, charsmax(szMsg), szMessage, 2);
   
    new pl[32], pnum;
    get_players(pl, pnum, "c");
   
    for(new i; i < pnum; i++)
    {
        message_begin(MSG_ONE_UNRELIABLE, 76, .player = pl[i]);
        write_byte(pl[i]);
        write_string(szMsg);
        message_end();
    }
}
Все-таки проблема осталась
 
Сверху