Контакты (заказать плагин/исправить ошибки/другое) Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Игрок с клиент мода, как его определить?
Karandachik Дата: Понедельник, 05.02.2024, 12:17:45 | Сообщение # 1
Сообщений: 62
Репутация: 3 [ +/- ]
Привет, задумала я значит сделать плагин оверлей в конце раунда.
Ничего сложного, но фишечка в том, что хочу выделить игроков с клиент мода.
Схема такая. если простой игрок то ему один оверлей, а если с клиент мода то другой.
Нашла в интернете много плагинов где используется распознавание по квару или просто способ вывода текста, но не видела нигде простого логического определения игрока с клиент мода.
По типу если игрок жив + он в игре+ с клиент мода - оверлей, если нет то другой оверлей.
Помогите с определением игрока клиентмода пожалуйста.
 
_wS_ Дата: Понедельник, 05.02.2024, 19:47:24 | Сообщение # 2
Код
bool g_bClientMod[MAXPLAYERS + 1];

public void OnPluginStart()
{
    for (int client = 1; client <= MaxClients; ++client) {
        if (IsClientInGame(client)) {
            OnClientPutInServer(client);
        }
    }
}

public void OnClientPutInServer(int client)
{
    // Этот вариант уже не работает.
    //char s[4];
    //g_bClientMod[client] = GetClientInfo(client, "~clientmod", s, sizeof(s)) && s[0];

    // Этот должен работать.
    char s[12];
    g_bClientMod[client] = GetClientInfo(client, "_client_version", s, sizeof(s)) && s[2]/*strlen(s) > 2*/ && StringToInt(s) > 0;
}

/*
if (g_bClientMod[client]) {
    ClientMod
}
*/
 
Karandachik Дата: Понедельник, 12.02.2024, 13:28:48 | Сообщение # 3
Сообщений: 62
Репутация: 3 [ +/- ]
Цитата _wS_ ()
public void OnClientConnected(int client)
{
char s[4];
g_bClientMod[client] = GetClientInfo(client, "~clientmod", s, sizeof(s)) && s[0];
}

Я думала есть что-то проще, по типу
if (IsClientInGame(client) && !IsClientmodClient(client) && !IsPlayerAlive(client))
 
_wS_ Дата: Понедельник, 12.02.2024, 22:09:28 | Сообщение # 4
Это и есть простой вариант, чтобы зря не ставить дополнительный plugin.
После этого просто if (g_bClientMod[client]) ..

Если хочется if (CM_IsClientModUser(client)), то ставим clientmod.sp plugin и берём там .inc.
 
Karandachik Дата: Вторник, 13.02.2024, 10:13:36 | Сообщение # 5
Сообщений: 62
Репутация: 3 [ +/- ]
Цитата _wS_ ()
Это и есть простой вариант, чтобы зря не ставить дополнительный plugin.
После этого просто if (g_bClientMod[client]) ..

Если хочется if (CM_IsClientModUser(client)), то ставим clientmod.sp plugin и берём там .inc.

Спасибо, я знала что есть что-то очень простое и гениальное.

Добавлено (05.03.2026, 12:23:02)
---------------------------------------------
Цитата _wS_ ()
Если хочется if (CM_IsClientModUser(client)), то ставим clientmod.sp plugin и берём там .inc.

А есть что-то для старого синтаксиса на 164 или 170???
Там инклуд на новом синтаксисе, мне нужно именно под старый сделать код.
Может у кого то завалялся способ определить игрока с криент мода он или нет под sourcemod 163 ???

Код
new bool:g_bClientMod[MAXPLAYERS + 1];

public OnPluginStart()
{
    for (new client = 1; client <= MaxClients; ++client) {
        if (IsClientConnected(client)) {
            OnClientConnected(client);
        }
    }
}

public OnClientConnected(client)
{
    new String:s[4];
    g_bClientMod[client] = GetClientInfo(client, "~clientmod", s, sizeof(s)) && s[0];
}

КакаяТоФункция(client)
{
    if (g_bClientMod[client]) {
        Клиент мод
    } else {
        Не клиент мод
    }
}
 
_wS_ Дата: Суббота, 09.05.2026, 06:09:34 | Сообщение # 6
Цитата TXCodding ()
Это не сработает

Это работало раньше, а сейчас нужно проверять _client_version и GetClientInfo с этим справляется.

---

Код
char s[12];
g_bClientMod[client] = GetClientInfo(client, "_client_version", s, sizeof(s)) && s[2]/*strlen(s) > 2*/ && StringToInt(s) > 0;
 
_wS_ Дата: Суббота, 09.05.2026, 16:14:00 | Сообщение # 7
Цитата TXCodding ()
// Небольшая задержка, чтобы ClientMod успел отправить данные

Это подтолкнуло покопать исх и узнать нового starik Как раз именно перед OnClientPutInServer игроку ставится SIGNONSTATE_FULL (игрок полностью подключен, все userinfo переменные передал и т.д.), а значит таймер в OnClientPutInServer не нужен. Хоть часто и работает в OnClientConnected, но, получается, может стрелять, а значит лучше юзать OnClientPutInServer.

Кст GetClientOfUserId уже проверяет на Connected (IsClientConnected лишнее).
Бывают ещё странные моменты, когда может пригодиться IsClientInGame, но это если игрок между OnClientConnect и OnClientPutInServer (маловероятно).

---
Ещё с sVersion[2] может быть проблема, если GetClientInfo записало < 3 символов.
Старый decl не занулял переменные/массивы и в них был мусор:

Код
public void OnPluginStart()
{
    decl s[4];
    for (int i = 0; i < sizeof(s); ++i) {
        PrintToServer("%d", s[i] == '\0');
    }
    // Мне выдало:
    // 1
    // 1
    // 0 привет..
    // 1
}
 
  • Страница 1 из 1
  • 1
Поиск: