Добрый день. Помогите реализовать идею. В меню добавить к примеру пункт дополнительно, а в нем буду пункты к примеру настройка статистики, так же чтобы эти пункты можно было добавлять в ini файл
Код:
#include <amxmodx>
#tryinclude <gamecms5> // Срок админки GameCMS(раскомментировать, если надо).
#define SECONDS_IN_DAY 86400 // Не трогать!
enum _:MenuData
{
ItemName[64],
ItemCmd[32],
ItemFlag
};
new Array:g_eMenuData;
enum _:MenuSettings
{
MenuName[64],
MenuCmd[32],
MenuPage[4],
MenuFlag
};
new g_eMenuSettings[MenuSettings];
new g_iMenusNum;
new g_iMenuPos[MAX_PLAYERS + 1];
public plugin_precache()
{
new szPath[128], iLen = get_localinfo("amxx_configsdir", szPath, charsmax(szPath));
formatex(szPath[iLen], charsmax(szPath) - iLen, "/amxmodmenu/amxmodmenu.ini");
new hFile = fopen(szPath, "rt");
if(!hFile)
{
set_fail_state("Can't %s '%s'", file_exists(szPath) ? "read" : "find", szPath);
return;
}
g_eMenuData = ArrayCreate(MenuData);
new szLine[128], szType[24], szName[64], szCmd[32], szFlag[4], szMenuData[MenuData];
while(!feof(hFile))
{
fgets(hFile, szLine, charsmax(szLine));
Str_RemoveComment(szLine);
trim(szLine);
if(parse(szLine, szType, charsmax(szType), szCmd, charsmax(szCmd)) == 2)
{
if(szType[0] == EOS)
{
continue;
}
if(equali(szType, "display_menu_page"))
{
copy(g_eMenuSettings[MenuPage], charsmax(g_eMenuSettings[MenuPage]), szCmd);
continue;
}
}
if(parse(szLine, szType, charsmax(szType), szName, charsmax(szName), szCmd, charsmax(szCmd), szFlag, charsmax(szFlag)) == 4)
{
if(szType[0] == EOS)
{
continue;
}
replace_all(szName, charsmax(szName), "^^n", "^n");
replace_all(szName, charsmax(szName), "^^t", "^t");
if(equali(szType, "reg_main_menu"))
{
copy(g_eMenuSettings[MenuName], charsmax(g_eMenuSettings[MenuName]), szName);
copy(g_eMenuSettings[MenuCmd], charsmax(g_eMenuSettings[MenuCmd]), szCmd);
g_eMenuSettings[MenuFlag] = read_flags(szFlag);
}
else if(equali(szType, "add_menu_item"))
{
copy(szMenuData[ItemName], charsmax(szMenuData[ItemName]), szName);
copy(szMenuData[ItemCmd], charsmax(szMenuData[ItemCmd]), szCmd);
szMenuData[ItemFlag] = read_flags(szFlag);
ArrayPushArray(g_eMenuData, szMenuData);
}
}
}
fclose(hFile);
g_iMenusNum = ArraySize(g_eMenuData);
}
public plugin_init()
{
register_plugin("[Customizable] AmxModMenu", "0.0.5", "Albertio");
register_concmd(g_eMenuSettings[MenuCmd], "AmxModMenu_Cmd", g_eMenuSettings[MenuFlag]);
register_menucmd(register_menuid("AmxModMenu"), 1023, "AmxModMenu_Handler");
}
public AmxModMenu_Cmd(id, iFlag)
{
if(~get_user_flags(id) & iFlag)
{
console_print(id, "У вас недостаточно прав для использования этой команды");
return PLUGIN_HANDLED;
}
AmxModMenu_Display(id, g_iMenuPos[id] = 0);
return PLUGIN_HANDLED;
}
public AmxModMenu_Display(id, iPos)
{
if(iPos < 0)
{
return PLUGIN_HANDLED;
}
new szMenu[MAX_MENU_LENGTH], iLen;
#if defined _gamecms5_included
new iExpTime = cmsapi_service_timeleft(id), iSysTime = get_systime();
if(iExpTime - iSysTime > 0)
{
new iFinalTime = (iExpTime - iSysTime) / SECONDS_IN_DAY;
if(iFinalTime > 0)
{
if(g_eMenuSettings[MenuPage][0] == '1')
{
iLen = formatex(szMenu, charsmax(szMenu), "%s\R\y%d/%d^n\wОсталось \r%d \wдней^n^n", g_eMenuSettings[MenuName],
iPos + 1, (g_iMenusNum / 8) + (((g_iMenusNum % 8) > 0) ? 1 : 0), iFinalTime);
}
else
{
iLen = formatex(szMenu, charsmax(szMenu), "%s^n\wОсталось \r%d \wдней^n^n", g_eMenuSettings[MenuName], iFinalTime);
}
}
else
{
if(g_eMenuSettings[MenuPage][0] == '1')
{
iLen = formatex(szMenu, charsmax(szMenu), "%s\R\y%d/%d^n\rПоследний \wдень^n^n",
g_eMenuSettings[MenuName], iPos + 1, (g_iMenusNum / 8) + (((g_iMenusNum % 8) > 0) ? 1 : 0));
}
else
{
iLen = formatex(szMenu, charsmax(szMenu), "%s^n\rПоследний \wдень^n^n", g_eMenuSettings[MenuName]);
}
}
}
else if(iExpTime == 0)
{
if(g_eMenuSettings[MenuPage][0] == '1')
{
iLen = formatex(szMenu, charsmax(szMenu), "%s\R\y%d/%d^n\wПрава \yне ограничены^n^n",
g_eMenuSettings[MenuName], iPos + 1, (g_iMenusNum / 8) + (((g_iMenusNum % 8) > 0) ? 1 : 0));
}
else
{
iLen = formatex(szMenu, charsmax(szMenu), "%s^n\wПрава \yне ограничены^n^n", g_eMenuSettings[MenuName]);
}
}
#else
if(g_eMenuSettings[MenuPage][0] == '1')
{
iLen = formatex(szMenu, charsmax(szMenu), "%s\R\y%d/%d^n^n", g_eMenuSettings[MenuName],
iPos + 1, (g_iMenusNum / 8) + (((g_iMenusNum % 8) > 0) ? 1 : 0));
}
else
{
iLen = formatex(szMenu, charsmax(szMenu), "%s^n^n", g_eMenuSettings[MenuName]);
}
#endif
new iKeys = MENU_KEY_0, iStart = iPos * 8, iEnd = min(iStart + 8, g_iMenusNum), iNum, szMenuData[MenuData];
if(iStart >= g_iMenusNum)
{
iStart = iPos = g_iMenuPos[id] = 0;
}
for(new i = iStart, iFlags = get_user_flags(id); i < iEnd; i++)
{
ArrayGetArray(g_eMenuData, i, szMenuData);
if(iFlags & szMenuData[ItemFlag])
{
iKeys |= (1<<iNum);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", ++iNum, szMenuData[ItemName]);
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%d. %s^n", ++iNum, szMenuData[ItemName]);
}
}
if(iEnd != g_iMenusNum)
{
iKeys |= MENU_KEY_9
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r9. \wДалее^n\r0. \w%s", iPos ? "Назад" : "Выход");
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r0. \w%s", iPos ? "Назад" : "Выход");
}
return show_menu(id, iKeys, szMenu, -1, "AmxModMenu");
}
public AmxModMenu_Handler(id, key)
{
switch(key)
{
case 8:
{
AmxModMenu_Display(id, ++g_iMenuPos[id]);
}
case 9:
{
AmxModMenu_Display(id, --g_iMenuPos[id]);
}
default:
{
new szMenuData[MenuData];
ArrayGetArray(g_eMenuData, g_iMenuPos[id] * 8 + key, szMenuData);
new szMenuCmd[32];
copy(szMenuCmd, charsmax(szMenuCmd), szMenuData[ItemCmd]);
if(szMenuCmd[0] == 's' && szMenuCmd[1] == 'v' && szMenuCmd[2] == '_')
{
server_cmd(szMenuCmd);
}
else
{
client_cmd(id, szMenuCmd);
}
}
}
return PLUGIN_HANDLED;
}
stock Str_RemoveComment(str[])
{
new i;
while(str[i] != EOS)
{
if(str[i] == ';')
{
str[i] = EOS;
break;
}
i++;
}
}
Код:
"add_menu_item" "Кикнуть игрока" "amx_kickmenu" "c"
"add_menu_item" "Забанить забанить" "amx_banmenu" "c"
"add_menu_item" "Ударить/Убить игрока" "amx_slapmenu" "c"
"add_menu_item" "Команда игрока^n" "amx_teammenu" "c"
"add_menu_item" "Смена карты" "amx_mapmenu" "c"
"add_menu_item" "Голосование за карту^n" "amx_votemapmenu" "c"
"add_menu_item" "Голосовые сообщения" "amx_speechmenu" "c"
"add_menu_item" "Серверные команды" "amx_cmdmenu" "c"
"add_menu_item" "Заглушить игрока^n" "amx_gagmenu" "с"
"add_menu_item" "Значения переменных" "amx_cvarmenu" "l"
"add_menu_item" "Настройки статистики^n" "amx_statscfgmenu" "l"
"add_menu_item" "Управление плагинами" "amx_pausecfgmenu" "l"
"add_menu_item" "Запрет оружия" "amx_restmenu" "l"
"add_menu_item" "Обновить Админов" "amx_reloadadmins" "l"