Team Select Menu проверка кода

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Javekson, лимит на всю мессагу идет, а не только на вашу строчку.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fl0wer, понятно, ну суть в том, что крашит :D это все что мне известно
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Javekson, есть ещё другие аргументы, у которых известен размер, поэтому 175.
 
Сообщения
35
Реакции
12
Помог
1 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
Javekson, было бы неплохо ещё учесть в меню выбор vip на картах as_.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
h9lla, да я не для публики делаю плагин, для себя, у меня нету вип карты, а так вертеть как угодно можно, мне сейчас главное рабочий набросок сделать
7 Апр 2020
fantom кстати, не знаешь что за сообщение вылазит, когда в спектры пытаешься перейти, точнее, как от него избавится
this command is not available to you at his point
В этом варианте
Код:
#include < amxmodx >
#include < reapi >

#pragma semicolon 1

const MENU_KEYS        =    MENU_KEY_0 | MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_6;
const TIME_MENU        =    -1;

new const MENU_IDENT__TEAM_SELECT_MENU[ ]    =    "TEAM SELECT MENU";

enum
{
    KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0
}

new const MENU_CONTENT[ ] =
{
    "^t^t^t^t\rVK.COM/GMFORCE^n\
    ^t^t^t^t\yМеню выбора команды^n^n\
    ^t^t^t^t\y1. \wТеррористы^n\
    ^t^t^t^t\y2. \wКонтр-террористы^n^n\
    ^t^t^t^t\y5. \wСлучайный выбор^n\
    ^t^t^t^t\y6. \wНаблюдатели^n^n\
    ^t^t^t^t\y0. \wВыход"
};

public plugin_init( )
{
    RegisterHookChain( RG_ShowVGUIMenu, "hook_ShowVGUIMenu", .post = false );
   
    register_menucmd( register_menuid( MENU_IDENT__TEAM_SELECT_MENU ), MENU_KEYS, "handler_TeamSelectMenu" );
}

public hook_ShowVGUIMenu( const id, VGUIMenu: menuType, const bitsSlots, const szOldMenu[ ] )
{
    if( menuType != VGUI_Menu_Team )
    {
        return HC_CONTINUE;
    }
   
    RequestFrame( "func_OpenTeamSelectMenu", id );
   
    return HC_SUPERCEDE;
}

public func_OpenTeamSelectMenu( const id )
{
    set_member( id, m_bForceShowMenu, true );
   
    show_menu( id, MENU_KEYS, MENU_CONTENT, TIME_MENU, MENU_IDENT__TEAM_SELECT_MENU );
}

public handler_TeamSelectMenu( const id, const iKey )
{
    switch( iKey )
    {
        case KEY_1:
        {
            rg_internal_cmd( id, "jointeam", "1" );
        }
       
        case KEY_2:
        {
            rg_internal_cmd( id, "jointeam", "2" );
        }
       
        case KEY_5:
        {
            rg_internal_cmd( id, "jointeam", "5" );
        }
       
        case KEY_6:
        {
            user_silentkill( id );
           
            rg_internal_cmd( id, "jointeam", "6" );
        }
       
        case KEY_0:
        {
            return PLUGIN_HANDLED;
        }
    }
   
    rg_internal_cmd( id, "joinclass", "5" );
   
    set_member( id, m_bTeamChanged, false );
   
    return PLUGIN_HANDLED;
}
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
В общем оставлю тут два варианта, пока что. Какой из них лучше юзать, хз :D

Код:
#include < amxmodx >
#include < reapi >

#pragma semicolon 1

const MENU_KEYS        =    MENU_KEY_0 | MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_6;
const TIME_MENU        =    -1;

new const MENU_IDENT__TEAM_SELECT_MENU[ ]    =    "TEAM SELECT MENU";

enum
{
    KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0
}

new const MENU_CONTENT[ ] =
{
    "^t^t^t^t\rVK.COM/GMFORCE^n\
    ^t^t^t^t\yМеню выбора команды^n^n\
    ^t^t^t^t\y1. \wТеррористы^n\
    ^t^t^t^t\y2. \wКонтр-террористы^n^n\
    ^t^t^t^t\y5. \wСлучайный выбор^n\
    ^t^t^t^t\y6. \wНаблюдатели^n^n\
    ^t^t^t^t\y0. \wВыход"
};

public plugin_init( )
{
    RegisterHookChain( RG_ShowVGUIMenu, "hook_ShowVGUIMenu", .post = false );
    
    register_menucmd( register_menuid( MENU_IDENT__TEAM_SELECT_MENU ), MENU_KEYS, "handler_TeamSelectMenu" );
}

public hook_ShowVGUIMenu( const id, VGUIMenu: menuType, const bitsSlots, const szOldMenu[ ] )
{
    if( menuType != VGUI_Menu_Team )
    {
        return HC_CONTINUE;
    }
    
    RequestFrame( "func_OpenTeamSelectMenu", id );
    
    return HC_SUPERCEDE;
}

public func_OpenTeamSelectMenu( const id )
{
    set_member( id, m_bForceShowMenu, true );
    
    show_menu( id, MENU_KEYS, MENU_CONTENT, TIME_MENU, MENU_IDENT__TEAM_SELECT_MENU );
}

public handler_TeamSelectMenu( const id, const iKey )
{
    switch( iKey )
    {
        case KEY_1:
        {
            rg_internal_cmd( id, "jointeam", "1" );
        }
        
        case KEY_2:
        {
            rg_internal_cmd( id, "jointeam", "2" );
        }
        
        case KEY_5:
        {
            rg_internal_cmd( id, "jointeam", "5" );
        }
        
        case KEY_6:
        {
            user_silentkill( id );
            
            rg_internal_cmd( id, "jointeam", "6" );
        }
        
        case KEY_0:
        {
            return PLUGIN_CONTINUE;
        }
    }
    
    rg_internal_cmd( id, "joinclass", "5" );
    
    set_member( id, m_bTeamChanged, false );
    
    return PLUGIN_CONTINUE;
}
Код:
#include < amxmodx >
#include < reapi >

#pragma semicolon 1

new const MENU_CONTENT[ ] =
{
    "^t^t^t^t\rVK.COM/GMFORCE^n\
    ^t^t^t^t\yМеню выбора команды^n^n\
    ^t^t^t^t\y1. \wТеррористы^n\
    ^t^t^t^t\y2. \wКонтр-террористы^n^n\
    ^t^t^t^t\y5. \wСлучайный выбор^n\
    ^t^t^t^t\y6. \wНаблюдатели^n^n\
    ^t^t^t^t\y0. \wВыход"
};

new HookChain: g_hookShowMenu;

public plugin_init( )
{
    RegisterHookChain( RG_ShowVGUIMenu, "hook_ShowVGUIMenu", .post = false );
    RegisterHookChain( RG_HandleMenu_ChooseTeam, "hook_HandleMenuChooseTeamPre", .post = false );
    RegisterHookChain( RG_HandleMenu_ChooseTeam, "hook_HandleMenuChooseTeamPost", .post = true );
    
    DisableHookChain( g_hookShowMenu = RegisterHookChain( RG_ShowMenu, "hook_ShowMenu", .post = false ) );
}

public hook_ShowVGUIMenu( const id, VGUIMenu: menuType, const bitsSlots, const szOldMenu[ ] )
{
    if( menuType != VGUI_Menu_Team )
    {
        return HC_CONTINUE;
    }
    
    set_member( id, m_bForceShowMenu, true );
    
    SetHookChainArg( 3, ATYPE_INTEGER, MENU_KEY_0 | MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_6 );
    
    SetHookChainArg( 4, ATYPE_STRING, MENU_CONTENT );
    
    EnableHookChain( g_hookShowMenu );
    
    return HC_CONTINUE;
}

public hook_HandleMenuChooseTeamPre( const id, const MenuChooseTeam: slot )
{
    if( is_user_alive( id ) )
    {
        user_silentkill( id );
    }
    
    set_member_game( m_bSkipShowMenu, true );
}

public hook_HandleMenuChooseTeamPost( const id, const MenuChooseTeam: slot )
{
    set_member( id, m_bTeamChanged, false );
    
    set_member_game( m_bSkipShowMenu, false );
    
    set_member( id, m_iMenu, Menu_ChooseAppearance );
    
    rg_internal_cmd( id, "joinclass", "5" );
}

public hook_ShowMenu( const id, const bitsSlots, const iDisplayTime, const iNeedMore, pszText[ ] )
{
    DisableHookChain( g_hookShowMenu );
    
    show_menu( id, bitsSlots, pszText, iDisplayTime );
    
    set_member( id, m_iMenu, Menu_ChooseTeam );
    
    return HC_SUPERCEDE;
}
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Сообщения
486
Реакции
89
Помог
5 раз(а)
WILL_BE, https://dev-cs.ru/threads/4838/post-54932. Прошел год с последнего баг репорта (если это так можно назвать). До сих пор кроме слов "есть багы" ничего нет. Ни темы, ни конфигов, ни шагов для воспроизведения. Можете и дальше ждать фикса багов в плагине, автор которого знать не знает о них.
Я не жду фиксов, мне об этом сказал игрок и не более, сам я этого не наблюдал.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fantom заметил еще, что в стандарте, что с этим плагином, при первом коннекте, если еще не выбирать никакую команду, и перебить меню тимы, любым другим меню, например админкой, то при нажатие например на пункт 1 в меню админа - выбирается команда сразу, а если без плагина тимы, то появляется меню выбора скина, это можно как-то пофиксить?
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fl0wer, так в каком моменте то? я же перебиваю его другим меню, как это заранее чекнуть то
 
Сообщения
1,698
Реакции
1,510
Помог
26 раз(а)
Javekson, по сути везде где менюшки открываются.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fl0wer, :D ну да, я об этом варианте думал, но надеялся есть менее изощренный способ
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
fl0wer, amxx сам выставляет 0 если игрок уже зашел за команду либо он не в меню выбора команды/скина
https://github.com/alliedmodders/am...35426053db8dd7f8902/amxmodx/amxmodx.cpp#L1338
https://github.com/alliedmodders/am...9bae2840f042697e5da/amxmodx/newmenus.cpp#L882
И имхо это правильно. Если он занулит, то игроку заново придется жать M, чтобы выбрать команду. Я б смотрел в сторону наоборот не отображать любое иное меню, если у нас игрок еще не JOINED или в меню выбора команды.
 
Сообщения
219
Реакции
184
Помог
3 раз(а)
меня одного смутило?
DisableHookChain( и при первом показе он Enable и больше никогда не Disable

И вообще зачем отключать, что за оптимизации такие ?
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fantom, окей, понял, спасибо
12 Апр 2020
gyxoBka, почему не Disable ? В хуке RG_ShowMenu выключаю, что бы оно не работало на другие меню, того же радио например, ибо зачем мне для них выполнять код
Код:
    show_menu( id, bitsSlots, pszText, iDisplayTime );
    
    set_member( id, m_iMenu, Menu_ChooseTeam );
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Javekson, было бы неплохо ещё учесть в меню выбор vip на картах as_.
Как-то так, наверное

C++:
#include < amxmodx >
#include < reapi >

#pragma semicolon 1

const MAX_LENGTH__MENU_CONTENTS        =    512;

new const MENU_TAB[ ]                =    "^t^t^t^t";

new HookChain: g_hookShowMenu;

public plugin_init( )
{
    RegisterHookChain( RG_ShowVGUIMenu, "hook_ShowVGUIMenu", .post = false );
    RegisterHookChain( RG_HandleMenu_ChooseTeam, "hook_HandleMenuChooseTeam_Pre", .post = false );
    RegisterHookChain( RG_HandleMenu_ChooseTeam, "hook_HandleMenuChooseTeam_Post", .post = true );
    
    DisableHookChain( g_hookShowMenu = RegisterHookChain( RG_ShowMenu, "hook_ShowMenu", .post = false ) );
}

public hook_ShowVGUIMenu( const id, VGUIMenu: menuType, const bitsSlots, const szOldMenu[ ] )
{
    if( menuType != VGUI_Menu_Team )
    {
        return HC_CONTINUE;
    }
    
    /* ------------------------------ */
    
    new TeamName: iTeam = get_member( id, m_iTeam );
    
    new bool: bMapHasVIP = bool: ( get_member_game( m_bMapHasVIPSafetyZone ) == 1 );
    
    /* ------------------------------ */
    
    new sMenu[ MAX_LENGTH__MENU_CONTENTS ];
    
    new iKeys = MENU_KEY_1 | MENU_KEY_2 | MENU_KEY_5 | MENU_KEY_6;
    
    new iMenuLen = formatex( sMenu, charsmax( sMenu ), "%s\rGAME FORCE | PUBLIC 18+^n", MENU_TAB );
    
    iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "%s\rGROUP: VK.COM/GMFORCE^n^n", MENU_TAB );
    
    iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "%s\yМеню выбора команды^n^n", MENU_TAB );
    
    iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "%s\y1. \wТеррористы^n", MENU_TAB );
    
    iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "%s\y2. \wКонтр-террористы^n", MENU_TAB );
    
    if( bMapHasVIP && iTeam == TEAM_CT )
    {
        iKeys |= MENU_KEY_3;
        
        iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "%s\y3. \wVIP-персона^n", MENU_TAB );
    }
    
    iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "^n%s\y5. \wСлучайный выбор^n", MENU_TAB );
    
    iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "%s\y6. \wНаблюдатели^n^n", MENU_TAB );
    
    if( iTeam != TEAM_UNASSIGNED )
    {
        iKeys |= MENU_KEY_0;
        
        iMenuLen += formatex( sMenu[ iMenuLen ], charsmax( sMenu ) - iMenuLen, "%s\y0. \wВыход", MENU_TAB );
    }
    
    /* ------------------------------ */
    
    set_member( id, m_bForceShowMenu, true );
    
    SetHookChainArg( 3, ATYPE_INTEGER, iKeys );
    SetHookChainArg( 4, ATYPE_STRING, sMenu );
    
    EnableHookChain( g_hookShowMenu );
    
    return HC_CONTINUE;
}

public hook_HandleMenuChooseTeam_Pre( const id, const MenuChooseTeam: slot )
{
    set_member_game( m_bSkipShowMenu, true );
    
    /* ------------------------------ */
    
    if( slot == MenuChoose_VIP || get_member( id, m_bIsVIP ) )
    {
        return HC_CONTINUE;
    }
    
    /* ------------------------------ */
    
    if( is_user_alive( id ) )
    {
        user_silentkill( id );
    }
    
    return HC_CONTINUE;
}

public hook_HandleMenuChooseTeam_Post( const id, const MenuChooseTeam: slot )
{
    set_member( id, m_bTeamChanged, false );
    
    set_member_game( m_bSkipShowMenu, false );
    
    set_member( id, m_iMenu, Menu_ChooseAppearance );
    
    rg_internal_cmd( id, "joinclass", "5" );
}

public hook_ShowMenu( const id, const bitsSlots, const iDisplayTime, const iNeedMore, const pszText[ ] )
{
    DisableHookChain( g_hookShowMenu );
    
    show_menu( id, bitsSlots, pszText, iDisplayTime );
    
    set_member( id, m_iMenu, Menu_ChooseTeam );
    
    return HC_SUPERCEDE;
}
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу