Unlimited Choose Team

Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Для VGUI убрал лимит и вернул кнопку наблюдателей когда живой.

1. Как теперь вернуть эту кнопку для олд меню, не делая при этом целиком костомное меню?
2. Если открыть меню и закрыть - пропадает радар каким-то чудом =D

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

#pragma semicolon 1

public plugin_init() {
    register_plugin("Unlimited Choose Team", "1.0", "Javekson");
    
    RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Pre", false);
    RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Post", true);
    RegisterHookChain(RG_ShowVGUIMenu, "ShowVGUIMenu", false);
}

public HandleMenu_ChooseTeam_Pre(const id, const MenuChooseTeam:slot){
    if(slot == MenuChoose_Spec) {
        if(is_user_alive(id)) {
            user_silentkill(id);
        }
    }
}

public HandleMenu_ChooseTeam_Post(const id, const MenuChooseTeam:slot){
    set_member(id, m_bTeamChanged, false);
}

public ShowVGUIMenu(const id, VGUIMenu:menuType, const bitsSlots, szOldMenu[]) {
    if(menuType == VGUI_Menu_Team) {
        message_begin(MSG_ONE, get_user_msgid("ScoreAttrib"), _, id);
        write_byte(id);
        write_byte(1<<0);
        message_end();
    }
}
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Javekson, как вариант предложу проверить какое меню у игрока. Если ord style то подменять аргумент szOldMenu с на #Team_Select_Spect (ну и конешно биты клавиш меню изменить). А для самого перехода за спектров рекомендую в пре хуке HandleMenu_ChooseTeam проверять выбран ли пункт спектров. Если да, то пометить deadflag игрока как DEAD_DEAD, а в посте
вернуть обратно. Все это для обхода условия. Для VGUI меню вот честно сказать не могу припомнить точно как лучше. Но если брать пример с подменой флага у ScoreAttrib, то все же после отправки меню лучше его вернуть обратно.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fantom, код раздувается... =DDD И так.

Нашел только мебмеб проверки графического меню get_member(id, m_bVGUIMenus) , но в принципе он пойдет.

подменять аргумент szOldMenu с на #Team_Select_Spect
Только не #Team_Select_Spect а #IG_Team_Select_Spect иначе кнопки 0. Выход не будет. Дело вкуса конечно.

Да и собсно так, если правильно.
Код:
    SetHookChainArg(3, ATYPE_INTEGER, bsKeys);
    SetHookChainArg(4, ATYPE_STRING, "#IG_Team_Select_Spect");
А для самого перехода за спектров рекомендую в пре хуке HandleMenu_ChooseTeam проверять выбран ли пункт спектров. Если да, то пометить deadflag игрока как DEAD_DEAD, а в посте
вернуть обратно.
Здесь честно говоря я вообще ничего не понял, но, вроде работает нормально и так, радар не пропадает =D А движек сам делает свое дело.

Но если брать пример с подменой флага у ScoreAttrib, то все же после отправки меню лучше его вернуть обратно.
Вернул в пост, радар пропадать не стал, исправило проблему, но все это выглядит не ок, а как по другому я не знаю.

Итого получили.
Убран лимит переходов за команду.
Добавлена возможность перехода за наблюдателей в любое время, даже когда живой, включая старое и новое меню.
Исправлен баг с пропаданием радара.

И получилось такое вот безобразие если честн

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

#pragma semicolon 1

public plugin_init() {
    register_plugin("Unlimited Choose Team", "1.0", "Javekson");
 
    RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Pre", false);
    RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Post", true);
    RegisterHookChain(RG_ShowVGUIMenu, "ShowVGUIMenu_Pre", false);
    RegisterHookChain(RG_ShowVGUIMenu, "ShowVGUIMenu_Post", true);
}

public HandleMenu_ChooseTeam_Pre(const id, const MenuChooseTeam:slot){
    if(slot == MenuChoose_Spec) {
        if(is_user_alive(id)) {
            user_silentkill(id);
        }
    }
}

public HandleMenu_ChooseTeam_Post(const id, const MenuChooseTeam:slot){
    set_member(id, m_bTeamChanged, false);
}

public ShowVGUIMenu_Pre(const id, VGUIMenu:menuType, const bitsSlots, szOldMenu[]) {
    if(!get_member(id, m_bVGUIMenus)) {
        if(equal(szOldMenu, "#IG_Team_Select")) {
            new bsKeys = MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_5|MENU_KEY_6;
         
            SetHookChainArg(3, ATYPE_INTEGER, bsKeys);
            SetHookChainArg(4, ATYPE_STRING, "#IG_Team_Select_Spect");
        }
        return HC_CONTINUE;
    }
 
    if(menuType == VGUI_Menu_Team) {
        message_begin(MSG_ONE, get_user_msgid("ScoreAttrib"), _, id);
        write_byte(id);
        write_byte(1<<0);
        message_end();
    }
 
    return HC_CONTINUE;
}

public ShowVGUIMenu_Post(const id, VGUIMenu:menuType, const bitsSlots, szOldMenu[]) {
    if(menuType == VGUI_Menu_Team) {
        message_begin(MSG_ONE, get_user_msgid("ScoreAttrib"), _, id);
        write_byte(id);
        write_byte(1<<7);
        message_end();
    }
}
 
Последнее редактирование:
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Только не #Team_Select_Spect а #IG_Team_Select_Spect иначе кнопки 0. Выход не будет. Дело вкуса конечно.
Тогда при первом появлении можно будет закрыть меню и не зайти ни за какую команду (летать по камерам).
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
fl0wer, в старом меню при первом появлении достаточно даже не закрывать его, а просто по новой открыть меню и кнопка выхода появится сама, потому роли тут не сыграет, что с плагином что без, но думаю стоит добавить проверки на жив ли игрок прежде чем выполнять код в принципе
23 Апр 2019
fantom fl0wer
Я возвращаю все флаги, т.е. write_byte(1<<7); и не совсем уверен что это правильно будет, что скажите? Ибо я хз какие у игрока были флаги до этого там
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
а просто по новой открыть меню и кнопка выхода появится сама, потому роли тут не сыграет
Тогда стоит добавить фикс прям в Регейм. Чесно я впервые слышу о таком
23 Апр 2019
Я возвращаю все флаги, т.е. write_byte(1<<7); и не совсем уверен что это правильно будет, что скажите? Ибо я хз какие у игрока были флаги до этого там
Стоит возвращать те которые были. И еще лучше ewrite использовать для всяких там випок
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Тогда стоит добавить фикс прям в Регейм. Чесно я впервые слышу о таком
Нет, вру, но частично. В обычном клиенте при повторном вызове появится кнопка Выхода, но при ее нажатии остается только два пункта с выбором команды, то есть по факту выхода не произошло, переключился на новую менюшку.
23 Апр 2019
Вопрос решен, тему можно закрывать думаю.
Большое спасибо fantom за решение проблем.

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

#pragma semicolon 1

enum (<<=1) {
    SCORE_STATUS_DEAD = 1,
    SCORE_STATUS_BOMB,
    SCORE_STATUS_VIP
}

new g_msgScoreAttrib;
new HookChain:g_hcShowVGUIMenu_Post;

public plugin_init() {
    register_plugin("Unlimited Choose Team", "1.0", "Javekson");
    
    RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Pre", false);
    RegisterHookChain(RG_HandleMenu_ChooseTeam, "HandleMenu_ChooseTeam_Post", true);
    RegisterHookChain(RG_ShowVGUIMenu, "ShowVGUIMenu_Pre", false);
    
    g_hcShowVGUIMenu_Post = RegisterHookChain(RG_ShowVGUIMenu, "ShowVGUIMenu_Post", true);
}

public plugin_cfg() {
    DisableHookChain(g_hcShowVGUIMenu_Post);
    
    g_msgScoreAttrib = get_user_msgid("ScoreAttrib");
}

public HandleMenu_ChooseTeam_Pre(const id, const MenuChooseTeam:slot) {
    if(slot == MenuChoose_Spec && is_user_alive(id)) {
        user_silentkill(id);
    }
}

public HandleMenu_ChooseTeam_Post(const id, const MenuChooseTeam:slot) {
    set_member(id, m_bTeamChanged, false);
}

public ShowVGUIMenu_Pre(const id, VGUIMenu:menuType, const bitsSlots) {
    if(menuType != VGUI_Menu_Team || !is_user_alive(id)) {
        return HC_CONTINUE;
    }
    
    if(get_member(id, m_bVGUIMenus)) {
        EnableHookChain(g_hcShowVGUIMenu_Post);
        
        emessage_begin(MSG_ONE, g_msgScoreAttrib, .player = id);
        ewrite_byte(id);
        ewrite_byte(SCORE_STATUS_DEAD);
        emessage_end();
        
        return HC_CONTINUE;
    }
    
    SetHookChainArg(3, ATYPE_INTEGER, bitsSlots | MENU_KEY_6);
    SetHookChainArg(4, ATYPE_STRING, "#IG_Team_Select_Spect");
    
    return HC_CONTINUE;
}

public ShowVGUIMenu_Post(const id, VGUIMenu:menuType, const bitsSlots, szOldMenu[]) {
    DisableHookChain(g_hcShowVGUIMenu_Post);
    
    new bitsFlags = 0;
    if(get_entvar(id, var_deadflag) != DEAD_NO) {
        bitsFlags |= SCORE_STATUS_DEAD;
    }
    
    if(get_member(id, m_bHasC4)) {
        bitsFlags |= SCORE_STATUS_BOMB;
    }
    
    if(get_member(id, m_bIsVIP)) {
        bitsFlags |= SCORE_STATUS_VIP;
    }
    
    emessage_begin(MSG_ONE, g_msgScoreAttrib, .player = id);
    ewrite_byte(id);
    ewrite_byte(bitsFlags);
    emessage_end();
}
 

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

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