Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Как блокануть VGUI ClassMenu

[РЕШЕНО]
Статус пользователя ssx
сообщение 23.4.2017, 17:53
Сообщение #1


Стаж: 9 лет

Сообщений: 2234
Благодарностей: 1341
Полезность: 836

Суть такая, у меня на m (chooseteam) стоит менюшка сервера , в ней пункт 1 = Выбрать команду

VGUI ChooseTeam блокирую вот так:
Код:
register_message(get_user_msgid("VGUIMenu"), "MessageVGUIMenu");

public MessageVGUIMenu(iMsgId, iMsgDest, iReceiver)
{
if(get_msg_arg_int(1) == 2)
{
set_pdata_int(iReceiver, 205, 0);
return ShowMenu(iReceiver);
}
return PLUGIN_CONTINUE;
}


Затем ShowMenu менюшка предлагает за кого играть ( КТ\ТР\Рандом\Спектаторы )
И вот при выборе за кого играть , если VGU Style то в окне предлагает выбрать класс игрока .

Как убрать выбор класса игрока ? Сделать чтобы игроку рандомом класс присваивал плагин.

Отредактировал: ssx, - 23.4.2017, 18:08


[CS 1.6 Public] 78.152.169.100:27014
[CS 1.6 DM FFA] 78.152.169.100:27015
[CS 1.6 DM AIM] 78.152.169.100:27017
[Half-Life DM FFA] 78.152.169.100:27016
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя LeoBH
сообщение 23.4.2017, 19:59
Сообщение #2


Стаж: 10 лет

Сообщений: 157
Благодарностей: 90
Полезность: 171

Вот тут готовый вариант:
Team Join Management by Exolent // forums.alliedmods.net

Часть кода, отвечающая именно за блок VGUI:
Cкрытый текст
Код:

register_message(get_user_msgid("VGUIMenu"), "message_VGUIMenu");

public message_VGUIMenu(iMsgid, iDest, id)
{
if(get_msg_arg_int(1) != VGUI_JOIN_TEAM_NUM)
{
return PLUGIN_CONTINUE;
}

if(should_autojoin(id))
{
set_autojoin_task(id, iMsgid);
return PLUGIN_HANDLED;
}
else if(should_autoswitch(id))
{
set_autoswitch_task(id, iMsgid);
return PLUGIN_HANDLED;
}
else if((TEAM_NONE < g_iTeam[id] < TEAM_SPEC) && get_pcvar_num(tjm_block_change))
{
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}


Отредактировал: LeoBH, - 23.4.2017, 20:00
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя SISA
сообщение 23.4.2017, 21:34
Сообщение #3
Стаж: 13 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

ssx,

Нажат кнопку за игрока или портировать весь код на амх, который отрабатывается на стороне сервера при нажатии на кнопку.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя ssx
сообщение 24.4.2017, 10:26
Сообщение #4


Стаж: 9 лет

Сообщений: 2234
Благодарностей: 1341
Полезность: 836

Таки не понял что нужно добавить в код чтобы автоматически выбирало класс игрока у VGUI Style


Вот сам код плагина:
Код:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <Connect_Control>

public plugin_init()
{
register_plugin("Change Team", "1.1", "neygomon");
register_clcmd("jointeam", "ShowMenu");
register_message(get_user_msgid("VGUIMenu"), "MessageVGUIMenu");
register_menucmd(register_menuid("Team Menu"), MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_5|MENU_KEY_6|MENU_KEY_0, "HandleMenu");
}

public ShowMenu(id)
{
new szMenu[512], iLen = formatex(szMenu, charsmax(szMenu), "\r[VICTORY.KM.UA] \w-> \rВыбор команды:^n^n"), iKeys = MENU_KEY_0;
new iNumTe = get_teamplayersnum(CS_TEAM_T), iNumCt = get_teamplayersnum(CS_TEAM_CT), CsTeams:iTeam = cs_get_user_team(id);
if(get_player_status(id) <= 3 && iNumTe > iNumCt) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1. \dТеррористы^n");
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y1. \wТеррористы^n");
iKeys |= MENU_KEY_1;
}
if(get_player_status(id) <= 3 && iNumCt > iNumTe) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \dКонтр-террористы^n^n");
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y2. \wКонтр-террористы^n^n");
iKeys |= MENU_KEY_2;
}
// if(g_VIPMap)
// {
// if(iTeam != CS_TEAM_CT) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \dСтать VIP^n^n");
// else
// {
// iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y3. \wСтать VIP^n^n");
// iKeys |= MENU_KEY_3;
// }
// }
if(CS_TEAM_UNASSIGNED < iTeam < CS_TEAM_SPECTATOR) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y5. \dАвтоматически^n");
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y5. \wАвтоматически^n");
iKeys |= MENU_KEY_5;
}
if(iTeam == CS_TEAM_SPECTATOR) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y6. \dСпектаторы^n^n^n");
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y6. \wСпектаторы^n^n^n");
iKeys |= MENU_KEY_6;
}
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y0. \wВыход");
return show_menu(id, iKeys, szMenu, -1, "Team Menu");
}

public HandleMenu(id, iKey)
{
switch(iKey)
{
case 0:
{
set_pdata_int(id, 125, get_pdata_int(id, 125) & ~(1<<8));
engclient_cmd(id, "jointeam", "1");
client_cmd(id, "slot5");
}
case 1:
{
set_pdata_int(id, 125, get_pdata_int(id, 125) & ~(1<<8));
engclient_cmd(id, "jointeam", "2");
client_cmd(id, "slot5");
}
case 2:
{
set_pdata_int(id, 125, get_pdata_int(id, 125) & ~(1<<8));
engclient_cmd(id, "jointeam", "3");
}
case 4:
{
set_pdata_int(id, 125, get_pdata_int(id, 125) & ~(1<<8));
engclient_cmd(id, "jointeam", "5");
client_cmd(id, "slot5");
}
case 5:
{
user_kill(id, 1);
engclient_cmd(id, "jointeam", "6");
}
}
return PLUGIN_HANDLED;
}

public MessageVGUIMenu(iMsgId, iMsgDest, iReceiver)
{
if(get_msg_arg_int(1) == 2)
{
set_pdata_int(iReceiver, 205, 0);
return ShowMenu(iReceiver);
}
return PLUGIN_CONTINUE;
}

get_teamplayersnum(const CsTeams:iTeam)
{
static players[32], iNum;
get_players(players, iNum, "he", iTeam == CS_TEAM_T ? "TERRORIST" : "CT");
return iNum;
}


Отредактировал: ssx, - 24.4.2017, 10:26


[CS 1.6 Public] 78.152.169.100:27014
[CS 1.6 DM FFA] 78.152.169.100:27015
[CS 1.6 DM AIM] 78.152.169.100:27017
[Half-Life DM FFA] 78.152.169.100:27016
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 24.4.2017, 10:30
Сообщение #5
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

ssx, после jointeam нужно вызвать команду joinclass по идеи.
engclient_cmd(id, "joinclass", "5")
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ssx
сообщение 24.4.2017, 11:21
Сообщение #6


Стаж: 9 лет

Сообщений: 2234
Благодарностей: 1341
Полезность: 836

Цитата(proff_q @ 24.4.2017, 10:30) *
ssx, после jointeam нужно вызвать команду joinclass по идеи.
engclient_cmd(id, "joinclass", "5")

Сделал так выбор ТР
Код:
			set_pdata_int(id, 125, get_pdata_int(id, 125) & ~(1<<8)); // снимаем лимит на смену команды
engclient_cmd(id, "jointeam", "1"); // заходим за ТР
client_cmd(id, "slot5"); // для Old Style заходим за случайный класс (engclient_cmd(id, "slot5") не прокатывает)
engclient_cmd(id, "joinclass", "5"); // для VGUI Style заходим за случайный класс

Заходит нормально, спавнит игрока но окно VGUI выбора класса игрока продолжает висеть . При выборе любого класса окно исчезает и пишет что команда недоступна (класс то уже выбран)

Как заблокировать отображение этого окна ?


[CS 1.6 Public] 78.152.169.100:27014
[CS 1.6 DM FFA] 78.152.169.100:27015
[CS 1.6 DM AIM] 78.152.169.100:27017
[Half-Life DM FFA] 78.152.169.100:27016
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 24.4.2017, 11:38
Сообщение #7
Стаж: 13 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Код
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

enum {
    SHOWTEAMSELECT = 3,
    PICKINGTEAM = 4
};

enum {
    Menu_ChooseTeam = 1
};

#define MENU_TEAM     2
#define IMMUNITY_ACCESS_LEVEL     ADMIN_RCON

new g_msgShowMenu, g_msgVGUIMenu;
new HamHook:g_hamhook;

#define m_iJoiningState                121
#define CBASEMONSTER_LINUX_XTRA_OFF    5
#define m_iMenu                    205

/*===============================================================================
================================================================
                                                                    [Plugin Init]
================================================================================
================================================================*/
public plugin_init()
{
    register_plugin("Team Join Management", "1.0 Beta", "PRoSToTeM@");

    // Think
    g_hamhook = RegisterHam(Ham_Player_PreThink, "player", "Player_PreThink_Post", 1);

    // Message IDs
    g_msgVGUIMenu = get_user_msgid("VGUIMenu");
    g_msgShowMenu = get_user_msgid("ShowMenu");
    
    // Message hooks
    register_message(g_msgVGUIMenu, "Message_Menu");
    register_message(g_msgShowMenu, "Message_Menu");
    
    // Client commands
    register_clcmd("jointeam", "ClCmdJoinTeam");
    
    DisableHamForward(g_hamhook);
}

public ClCmdJoinTeam(const nClient)
{
    if(get_user_flags(nClient) & IMMUNITY_ACCESS_LEVEL)
        return PLUGIN_CONTINUE;

    if (pev_valid(nClient) != 2)
        return PLUGIN_HANDLED_MAIN;

    if (get_pdata_int(nClient, m_iJoiningState, CBASEMONSTER_LINUX_XTRA_OFF) != 0)
        return PLUGIN_HANDLED_MAIN;
    
    return PLUGIN_CONTINUE;
}

public Message_Menu(const msg, const nDest, const nClient)
{
    if(get_user_flags(nClient) & IMMUNITY_ACCESS_LEVEL)
        return PLUGIN_CONTINUE;

    if (msg == g_msgShowMenu)
    {
        new szMsg[13];
        get_msg_arg_string(4, szMsg, charsmax(szMsg));
        
        if (!equal(szMsg, "#Team_Select"))
            return PLUGIN_CONTINUE;
    }
    else
    {
        if (get_msg_arg_int(1) != MENU_TEAM || get_msg_arg_int(2) & MENU_KEY_0)
            return PLUGIN_CONTINUE;
    }
    
    // safe checks
    if (get_pdata_int(nClient, m_iMenu, CBASEMONSTER_LINUX_XTRA_OFF) == Menu_ChooseTeam || get_pdata_int(nClient, m_iJoiningState, CBASEMONSTER_LINUX_XTRA_OFF) != SHOWTEAMSELECT)
        return PLUGIN_CONTINUE;
    
    EnableHamForward(g_hamhook);
    
    return PLUGIN_HANDLED;
}

public Player_PreThink_Post(const nClient)
{
    DisableHamForward(g_hamhook);
    
    new iOldShowMenuBlock = get_msg_block(g_msgShowMenu);
    new iOldVGUIMenuBlock = get_msg_block(g_msgVGUIMenu);
    set_msg_block(g_msgShowMenu, BLOCK_SET);
    set_msg_block(g_msgVGUIMenu, BLOCK_SET);
    engclient_cmd(nClient, "jointeam", "5");
    engclient_cmd(nClient, "joinclass", "5");
    set_msg_block(g_msgVGUIMenu, iOldVGUIMenuBlock);
    set_msg_block(g_msgShowMenu, iOldShowMenuBlock);
}


Или этот код юзать или портировать всю логику выбора команды из сервера. Всякие "Team Join Management by Exolent" и прочие поделки, можно даже не рассматривать. Они писались в эпоху отсутствия декомпила и сами авторы этих плагинов не особо понимали работу функции.

Отредактировал: SISA, - 24.4.2017, 11:45
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя BaHeK
сообщение 24.4.2017, 17:34
Сообщение #8


Стаж: 15 лет

Сообщений: 571
Благодарностей: 505
Полезность: 651

Код:

public MessageVGUIMenu(iMsgId, iMsgDest, iReceiver)
{
new msgarg1 = get_msg_arg_int(1);
if(msgarg1 == 2)
{
set_pdata_int(iReceiver, 205, 0);
return ShowMenu(iReceiver);
}
if(msgarg1 == 26 || msgarg1 == 27)
{
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}

26 - выбор класса за теров
27 - выбор класса за кт
или наоборот, не помню уже

Отредактировал: BaHeK, - 24.4.2017, 17:35


Чуть-чуть нарушаю
http://img-host.su/aoN1.png
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: