Убрать выбор класса при выборе команды

SPRATAY

Участник
Сообщения
32
Реакции
4
Операционная система
Linux
Текст ошибки
нету
Список мета-модулей
есть
Список плагинов SM
блокед
Список расширений SM
блокед
То что нужно убрать
image.jpg

Исходник где это уже реализовано: shavitush/bhoptimer
Можно использовать этот код он скрывает motd
C++:
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), VGUIMenu, true);
}

public Action:VGUIMenu(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    new String:buffer[5];
    BfReadString(bf, buffer, sizeof(buffer));
    if(StrEqual(buffer, "info"))
    {
        return Plugin_Handled;
    }
    return Plugin_Continue;
}

public OnClientPutInServer(client)
{
    CreateTimer(3.0, timer_menu, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}

public Action:timer_menu(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    if(client != 0 && !IsFakeClient(client))
    {
        ShowVGUIPanel(client, "team", INVALID_HANDLE, true);
    }
}
Я просто хз где искать значения для vgui может вы вкурсе
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
можно попробовать от имени игрока выбирать случайный класс фейковой командой joinclass
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
посмотри, что вызывается на окне выбора класса.

C++:
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), VGUIMenu, true);
}

public Action:VGUIMenu(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    new String:buffer[5];
    BfReadString(bf, buffer, sizeof(buffer));
    PrintToChatAll(buffer);
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
у меня когда- то выдавало class_ct и class_ter
 

SPRATAY

Участник
Сообщения
32
Реакции
4
можно попробовать от имени игрока выбирать случайный класс фейковой командой joinclass
Пример

посмотри, что вызывается на окне выбора класса.

C++:
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), VGUIMenu, true);
}

public Action:VGUIMenu(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    new String:buffer[5];
    BfReadString(bf, buffer, sizeof(buffer));
    PrintToChatAll(buffer);
}

судя по скрипту он в чат мне напишет верно?
Сообщения автоматически склеены:

посмотри, что вызывается на окне выбора класса.

C++:
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), VGUIMenu, true);
}

public Action:VGUIMenu(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    new String:buffer[5];
    BfReadString(bf, buffer, sizeof(buffer));
    PrintToChatAll(buffer);
}
Не работает:
logs:
C++:
L 12/01/2019 - 18:49:31: [SM]   [1] Line 386, C:\Users\SPRAT\Desktop\server\sourcepawn\scriptingnew\include\halflife.inc::PrintToChatAll
L 12/01/2019 - 18:49:31: [SM]   [2] Line 10, C:\Users\SPRAT\Desktop\server\sourcepawn\scriptingnew\test1.sp::VGUIMenu
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Не работает:
logs:
когда же вы все запомните, что сообщение об ошибке ВСЕГДА начинается с Exeption reported, а ты же предоставил бесполезную информацию, т.к. это только часть текста, о том где нужно искать возникновение ошибки, но совершенно не понятно что за ошибку.
Сообщения автоматически склеены:

Попробуй так:
C-подобный:
char sBuffer[PLATFORM_MAX_PATH];

public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), HookMsg, true);
}

public Action HookMsg(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init)
{
    sBuffer[0] = 0;
    BfReadString(msg, sBuffer, sizeof(sBuffer));
    RequestFrame(RequestFrame_Callback, players[0]);
    return Plugin_Continue;
}

public void RequestFrame_Callback(int client)
{
    PrintToChatAll("%N: '%s'", client, sBuffer);
}
 
Последнее редактирование:

SPRATAY

Участник
Сообщения
32
Реакции
4
когда же вы все запомните, что сообщение об ошибке ВСЕГДА начинается с Exeption reported, а ты же предоставил бесполезную информацию, т.к. это только часть текста, о том где нужно искать возникновение ошибки, но совершенно не понятно что за ошибку.
Сообщения автоматически склеены:

Попробуй так:
C-подобный:
char sBuffer[PLATFORM_MAX_PATH];

public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), HookMsg, true);
}

public Action HookMsg(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init)
{
    sBuffer[0] = 0;
    BfReadString(msg, sBuffer, sizeof(sBuffer));
    RequestFrame(RequestFrame_Callback, players[0]);
    return Plugin_Continue;
}

public void RequestFrame_Callback(int client)
{
    PrintToChatAll("%N: '%s'", client, sBuffer);
}
спасибо за рабочий скрипт:

C-подобный:
[M[F]K]Kuznetsov#47: 'specgui'
[M[F]K]Kuznetsov#47 присоединился к террористам
[M[F]K]Kuznetsov#47: 'class_ter'
[M[F]K]Kuznetsov#47: 'class_ter'
[M[F]K]Kuznetsov#47: 'overview'
[M[F]K]Kuznetsov#47: 'overview'
[M[F]K]Kuznetsov#47: 'overview'
[M[F]K]Kuznetsov#47 присоединился к спецназу
[M[F]K]Kuznetsov#47: 'class_ct'
[M[F]K]Kuznetsov#47: 'class_ct'
[M[F]K]Kuznetsov#47: 'class_ct'
[M[F]K]Kuznetsov#47: 'specgui'
[M[F]K]Kuznetsov#47: 'overview'
[M[F]K]Kuznetsov#47: 'overview'
[M[F]K]Kuznetsov#47: 'overview'
[M[F]K]Kuznetsov#47 присоединился к террористам
[M[F]K]Kuznetsov#47: 'class_ter'
[M[F]K]Kuznetsov#47: 'class_ter'
[M[F]K]Kuznetsov#47: 'class_ter'
[M[F]K]Kuznetsov#47: 'specgui'
Сообщения автоматически склеены:

Не прокатило
C++:
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), VGUIMenu, true);
}

public Action:VGUIMenu(UserMsg:msg_id, Handle:bf, const players[], playersNum, bool:reliable, bool:init)
{
    new String:buffer[5];
    BfReadString(bf, buffer, sizeof(buffer));
    if(StrEqual(buffer, "class_ct") || StrEqual(buffer, "class_ter"))
    {
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

Madness aka null138

Участник
Сообщения
713
Реакции
734
тогда самый простой способ, менять команду игрока вручную еще на выборе команды.
C++:
#include <sourcemod>
#include <sdktools>
#include <cstrike>

public void OnPluginStart() {
    AddCommandListener(jointeam, "jointeam");
}

public Action jointeam(int client, const char[] command, int args) {
    if(client < 1 || client >= MaxClients || !IsClientInGame(client)) return Plugin_Continue;
 
    char arg[4]; GetCmdArg(1, arg, sizeof(arg));
    int teamnum = StringToInt(arg);
    if(teamnum < 1 || teamnum > 3) teamnum = 1;

    CS_SwitchTeam(client, teamnum);
    if(IsPlayerAlive(client)) ForcePlayerSuicide(client);

    return Plugin_Handled;
}
 

SPRATAY

Участник
Сообщения
32
Реакции
4
тогда самый простой способ, менять команду игрока вручную еще на выборе команды.
C++:
#include <sourcemod>
#include <sdktools>
#include <cstrike>

public void OnPluginStart() {
    AddCommandListener(jointeam, "jointeam");
}

public Action jointeam(int client, const char[] command, int args) {
    if(client < 1 || client >= MaxClients || !IsClientInGame(client)) return Plugin_Continue;

    char arg[4]; GetCmdArg(1, arg, sizeof(arg));
    int teamnum = StringToInt(arg);
    if(teamnum < 1 || teamnum > 3) teamnum = 1;

    CS_SwitchTeam(client, teamnum);
    if(IsPlayerAlive(client)) ForcePlayerSuicide(client);

    return Plugin_Handled;
}
не хватает автомата: CCSPlayer::SwitchTeam( 1 ) - invalid team index.
А так работает но, кажись тот скрипт работал тока немного по другому ша проверяю)
Сообщения автоматически склеены:

не хватает автомата: CCSPlayer::SwitchTeam( 1 ) - invalid team index.
А так работает но, кажись тот скрипт работал тока немного по другому ша проверяю)
скрипт работает но как сделать так чтобы при выборе той же команды ничего не происходило, и не уверен что он будет работать с каким нибудь перебросом плагином, так как он ловит команду от пользователя, не уверен что можно перехватить vgui и после перехвата исполнить нужные команды
 
Последнее редактирование:

Madness aka null138

Участник
Сообщения
713
Реакции
734
скрипт работает но как сделать так чтобы при выборе той же команды ничего не происходило, и не
C++:
#include <sourcemod>
#include <sdktools>
#include <cstrike>

public void OnPluginStart() {
    AddCommandListener(jointeam, "jointeam");
}

public Action jointeam(int client, const char[] command, int args) {
    if(client < 1 || client >= MaxClients || !IsClientInGame(client)) return Plugin_Continue;

    char arg[4]; GetCmdArg(1, arg, sizeof(arg));
    int teamnum = StringToInt(arg);
    if(teamnum == GetClientTeam(client)) return Plugin_Handled;
    else if(teamnum == 1 || teamnum > 3) return Plugin_Continue;

    CS_SwitchTeam(client, teamnum);
    if(IsPlayerAlive(client)) ForcePlayerSuicide(client);

    return Plugin_Handled;
}
и не уверен что он будет работать с каким нибудь перебросом плагином, так как он ловит команду от пользователя, не уверен что можно перехватить vgui и после перехвата исполнить нужные команды
уйму других решений, я предложил лишь один из самых простых.
Про хук vgui, можно кстати попробовать вариант, который предложил сверху Grey, а именно: форсить команду как только vgui выбор появился. Честно говоря, я точно не знаю какая из клиентских команд отвечает за выбор классов. Можно поэкспериментировать с командами "menuselect 1, joinclass 1" и т.п.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
именно
Только классов как бы не 8 шт. (по 4 на команду, емнип)

Попробуй так:
C-подобный:
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), HookMsg, true);
}

public Action HookMsg(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init)
{
    static char txt[16];
    txt[0] = 0;
    BfReadString(msg, txt, sizeof(txt));
    if(txt[0] == 'c' && txt[1] == 'l' && txt[2] == 'a' && txt[3] == 's' && txt[4] == 's' && txt[5] == '_')
    {
        FakeClientCommandEx(players[0], "joinclass %d", txt[6] == 't' ? 1 : 5);
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
Проверь на спецах. Если проблемы с командой будет в консоль писать, то замени выделенную строку на FakeClientCommandEx(players[0], "joinclass 1");
 

SPRATAY

Участник
Сообщения
32
Реакции
4
именно
Только классов как бы не 8 шт. (по 4 на команду, емнип)

Попробуй так:
C-подобный:
public OnPluginStart()
{
    HookUserMessage(GetUserMessageId("VGUIMenu"), HookMsg, true);
}

public Action HookMsg(UserMsg msg_id, BfRead msg, const int[] players, int playersNum, bool reliable, bool init)
{
    static char txt[16];
    txt[0] = 0;
    BfReadString(msg, txt, sizeof(txt));
    if(txt[0] == 'c' && txt[1] == 'l' && txt[2] == 'a' && txt[3] == 's' && txt[4] == 's' && txt[5] == '_')
    {
        FakeClientCommandEx(players[0], "joinclass %d", txt[6] == 't' ? 1 : 5);
        return Plugin_Handled;
    }
    return Plugin_Continue;
}
Проверь на спецах. Если проблемы с командой будет в консоль писать, то замени выделенную строку на FakeClientCommandEx(players[0], "joinclass 1");
ваш скрипт чудесно работает сэр, даже если перекидывать с меню,плохих логов не видно, спасибо за проделанную работу, будем тестить
 
Последнее редактирование:
Сверху Снизу