#include <amxmodx>
#include <reapi>
//#define CUSTOM_MENU // Меню с 3-мя пунктами. 1 - Войти в игру, 6 - Наблюдатели, 0 - Выход
#define TIME_CHANGE 10 // Пауза между сменой команд, в секундах
#define PLAYER_DIFF 1 // Разница между командами (если на n человек больше, за эту команду зайти нельзя)
#define MAXPLAYERS 32
new g_MapName[32], bool:g_VIPMap = false, VGUIMenu:menus;
new Float:g_fLastTeamChange[MAXPLAYERS+1];
new HookChain:HookShowMenuPre;
public plugin_init()
{
register_plugin("[ReAPI] Choose team", "1.1", "maFFyoZZyk");
register_clcmd("chooseteam", "CMD_ChooseTeam");
RegisterHookChain(RG_ShowVGUIMenu, "ShowVGUIMenu_Pre", false);
RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Pre", false);
HookShowMenuPre = RegisterHookChain(RG_ShowMenu, "ShowMenu_Pre", false);
DisableHookChain(HookShowMenuPre);
get_mapname(g_MapName, charsmax(g_MapName));
if(containi(g_MapName, "as_") != -1) g_VIPMap = true;
set_task(1.2, "ChangeServerCvars");
}
public ChangeServerCvars() set_cvar_num("mp_limitteams", 0);
public CMD_ChooseTeam(id)
{
if(!is_user_connected(id))
return HC_CONTINUE;
set_member(id, m_bTeamChanged, false);
if(TIME_CHANGE && get_member(id, m_iTeam))
{
new Float:fNextChoose = g_fLastTeamChange[id] + TIME_CHANGE;
new Float:fCurTime = get_gametime();
if(fNextChoose > fCurTime)
{
client_print_color(id, 0, "^1[^4GFS^1] Сменить команду можно через ^4%d ^1секунд", floatround(fNextChoose - fCurTime));
return HC_SUPERCEDE;
}
}
return HC_CONTINUE;
}
public ShowVGUIMenu_Pre(const id, VGUIMenu:menuType, const bitsSlots, szOldMenu[])
{
if (is_user_bot(id))
{
return HC_CONTINUE;
}
new szMenu[MAX_MENU_LENGTH], iKeys = MENU_KEY_0;
if(menuType == VGUI_Menu_Team)
{
#if defined CUSTOM_MENU
SetHookChainArg(3, ATYPE_INTEGER, MENU_KEY_0 | MENU_KEY_1 | MENU_KEY_6);
SetHookChainArg(4, ATYPE_STRING, "\yВыберите действие:^n^n\y1. \rВойти в игру^n\y6. \wНаблюдение^n^n\y0. \wВыход");
#else
new iTeamTT, iTeamCT; CalculateTeamNum(iTeamTT, iTeamCT);
new TeamName:team = get_member(id, m_iTeam);
new iLen = formatex(szMenu, charsmax(szMenu), "\yВыбор команды:^n^n");
if((iTeamTT - iTeamCT) >= PLAYER_DIFF || team == TEAM_TERRORIST) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1. \dТеррористы [\r%d\w]^n", iTeamTT);
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1. \wТеррористы [\r%d\w]^n", iTeamTT);
iKeys |= MENU_KEY_1;
}
if((iTeamCT - iTeamTT) >= PLAYER_DIFF || team == TEAM_CT) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \dСпецотряд [\r%d\w]^n^n", iTeamCT);
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \wСпецотряд [\r%d\w]^n^n", iTeamCT);
iKeys |= MENU_KEY_2;
}
if(g_VIPMap)
{
if(team != TEAM_CT) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \dVIP^n^n");
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \wVIP^n^n");
iKeys |= MENU_KEY_3;
}
}
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y5. \yАвто-Выбор^n");
iKeys |= MENU_KEY_5;
if(team == TEAM_SPECTATOR) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y6. \rНаблюдение^n^n^n");
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y6. \rНаблюдение^n^n^n");
iKeys |= MENU_KEY_6;
}
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y0. \wВыход");
SetHookChainArg(3, ATYPE_INTEGER, iKeys);
SetHookChainArg(4, ATYPE_STRING, szMenu);
if (strlen(szMenu) > 175)
{
EnableHookChain(HookShowMenuPre);
}
#endif
}
else if(menuType == VGUI_Menu_Class_T)
{
new iLen = formatex(szMenu, charsmax(szMenu), "\yВыбор класса:^n^n");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1. \wФеникс^n");
iKeys |= MENU_KEY_1;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \wЭлитный отряд^n");
iKeys |= MENU_KEY_2;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \wАрктические мстители^n");
iKeys |= MENU_KEY_3;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y4. \rПартизаны^n^n^n");
iKeys |= MENU_KEY_4;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y5. \yАвто-Выбор^n");
iKeys |= MENU_KEY_5;
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y0. \wВыход");
SetHookChainArg(3, ATYPE_INTEGER, iKeys);
SetHookChainArg(4, ATYPE_STRING, szMenu);
if (strlen(szMenu) > 175)
{
EnableHookChain(HookShowMenuPre);
}
}
else if(menuType == VGUI_Menu_Class_CT)
{
new iLen = formatex(szMenu, charsmax(szMenu), "\yВыбор класса:^n^n");
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1. \wМорские котики^n");
iKeys |= MENU_KEY_1;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \wСпецназ^n");
iKeys |= MENU_KEY_2;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \wДесантники^n");
iKeys |= MENU_KEY_3;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y4. \rКарательный отряд^n^n^n");
iKeys |= MENU_KEY_4;
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y5. \yАвто-Выбор^n");
iKeys |= MENU_KEY_5;
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y0. \wВыход");
SetHookChainArg(3, ATYPE_INTEGER, iKeys);
SetHookChainArg(4, ATYPE_STRING, szMenu);
if (strlen(szMenu) > 175)
{
EnableHookChain(HookShowMenuPre);
}
}
return HC_CONTINUE;
}
// Fix menu limit in ReGameDLL (https://github.com/s1lentq/ReGameDLL_CS/blob/9d89a347fa22662b716697c97150ddea2bd00d99/regamedll/dlls/client.cpp#L394)
public ShowMenu_Pre(const id, const keys, const time, const needMore, const menu[]) {
DisableHookChain(HookShowMenuPre);
show_menu(id, keys, menu, time);
switch(menus)
{
case Menu_ChooseTeam: set_member(id, m_iMenu, Menu_ChooseTeam); // AMXX overide m_iMenu after show_menu
case VGUI_Menu_Class_T: set_member(id, m_iMenu, VGUI_Menu_Class_T); // AMXX overide m_iMenu after show_menu
case VGUI_Menu_Class_CT: set_member(id, m_iMenu, VGUI_Menu_Class_CT); // AMXX overide m_iMenu after show_menu
}
return HC_SUPERCEDE;
}
public HandleMenu_ChooseTeam_Pre(const id, const MenuChooseTeam:key)
{
if (is_user_bot(id)) {
return HC_CONTINUE;
}
switch(key)
{
#if defined CUSTOM_MENU
case 1: SetHookChainArg(2, ATYPE_INTEGER, (rg_get_join_team_priority() == TEAM_TERRORIST) ? MenuChoose_T : MenuChoose_CT);
case MenuChoose_Spec: user_silentkill(id);
#else
case MenuChoose_T: SetHookChainArg(2, ATYPE_INTEGER, MenuChoose_T);
case MenuChoose_CT: SetHookChainArg(2, ATYPE_INTEGER, MenuChoose_CT);
case MenuChoose_AutoSelect: SetHookChainArg(2, ATYPE_INTEGER, MenuChoose_AutoSelect);
case MenuChoose_Spec: user_silentkill(id);
#endif
}
g_fLastTeamChange[id] = get_gametime();
return HC_CONTINUE;
}
CalculateTeamNum(&iTeamTT, &iTeamCT)
{
for(new id = 1; id <= MAXPLAYERS; id++)
{
if(!is_user_connected(id)) continue;
switch(get_member(id, m_iTeam))
{
case TEAM_CT: iTeamCT++;
case TEAM_TERRORIST: iTeamTT++;
}
}
}