Steam Works Group Manager

Steam Works Group Manager 1.8

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #1
Пользователь Someone разместил новый ресурс:

Steam Works Group Manager - Дополнительные возможности для плагинов

Дополнение, которое позволяет проверять игроков на состояние в группе Steam в любых плагинах.


Внимание! Группа проверяется при коннекте игрока! То есть, если игрок вступил в группу будучи на сервере, он должен перезайти, чтобы его заново проверило.


Проверка происходит при OnClientPutInServer.

Пример плагина с SWGM выложу позже.

Создавался по примеру...

Узнать больше об этом ресурсе...
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
ты бы синтаксисы не мешал в коде
то у тебя new, то int
хотя бы эта функция:
PHP:
public Action:CMD_Check(iClient, args)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i))
        {
            if(!IsFakeClient(i))
            {
                SteamWorks_GetUserGroupStatus(i, g_iGroupId);
            }
        }
    }
    return Plugin_Handled;
}
Функция объявлена старым синтаксисом, а цикл использует новый. И так весь плагин.
И инклюд в старом полностью оформлен
Вот ещё классная вещь:
PHP:
    for (int i = 1; i <= MaxClients; i++)
    {
        if(IsClientConnected(i) && !IsFakeClient(i) && IsClientInGame(i) && i > 0)
Интересно, а может в этом цикле i оказаться равным или меньше нуля? :biggrin:

Вот переписано полностью под новый синтаксис (и плагин и инклюд):
 

Вложения

  • SWGM.inc
    1 КБ · Просмотры: 34
  • SWGM.sp
    4.7 КБ · Просмотры: 37

September

Участник
Сообщения
5,238
Реакции
2,742
  • Команда форума
  • #3
Напишите кто-нибудь плагин, чтобы при вступлении в группу, выдавали кредиты в shop core (с проверкой на запрет повторного вступления). Я заплачу)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@September, это лишняя колонка в таблице БД шопа нужна будет
 

xados

Участник
Сообщения
316
Реакции
32
Я правильно понял. Если игрока нету в в стим группе то он и попасть на сервере не сможет или как:? объясните подробно как он работает пожалуйста а то не совсем догнал что от
 

September

Участник
Сообщения
5,238
Реакции
2,742
  • Команда форума
  • #7
Я правильно понял. Если игрока нету в в стим группе то он и попасть на сервере не сможет или как:? объясните подробно как он работает пожалуйста а то не совсем догнал что от

Так скажем, это штука для других плагинов, для взаимодействия со стим группой.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #8
Взялся немного доработать этот плагин под себя. Выкладываю свою модификацию.
  • Код переписан под новый синтаксис полностью, произведена оптимизация оного, сокращение в размерах.
  • Документация в include-файле расширена: добавлена информация о возможных возвращаемых ошибках.
  • Добавлен новый forward, который вызывается при каждом получении информации о том, состоит ли игрок в группе, является он офицером или нет.
  • Добавлено два native-вызова для принудительного обновления информации об игроке, или обо всех игроках.
Критика моего говнокода принимается.
 

Вложения

  • SWGM.7z
    2.5 КБ · Просмотры: 58

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@CrazyHackGUT, нуно твою говноверсию сравнить с моей говноверсией: обе же под новый синтаксис полностью переделаны :mocking:
--- Добавлено позже ---
@Danyas, ну если сервак один или несколько, но все стоят на одном VDS/VPS/машине, то ClientPrefs и SQLite ещё туда-сюда (хотя и то и другое - базы SQLite и хороши только в случае если к ним запросы не слишком часто происходят), а во KeyValue хороша только при маленькой базе и на одной машине (как я понимаю с текстом плагин будет работать медленнее, чем с SQLite).
А при большой базе и сравнительно большом количестве серверов лучше всё таки мистер мускул.

Есть один плагин статки для игры NMRiH и работает он с SQLite, емнип.
Так вот у него при длительных сессиях (есть в игре парочка карт с 50 волнами зомби и к последней волне количество зомби в одной волне уже больше 300) у него случаются проблемы (точнее у серверов его юзающих, подвисают они).
Кто его знает в чём именно причина, в SQLite или картах или ещё что, но я от него отказался больше двух лет назад.
Вроде немного помогло.
--- Добавлено позже ---
@CrazyHackGUT, хм, а ты при смене айди группы не перепроверяешь игроков на сервере?

И ещё, например в обычной 7-ке ваша кириллица в консоль (по крайней мере сервера) будет выводиться крокозябрами (я знаю как включить поддержку UTF-8, даже включил, но всё же).
Может имеет всё таки смысл изначально выводить сообщения в консоль на англицком?
Да и сообщения в чат тоже (ошибки нативов вы же вывели). Ну разве что выводить как в стоковых плагинах вместо PrintToChat(iClient, "[SWGM] Результаты выведены в консоль!"); вот так: ReplyToCommand(client, "[SWGM] %t", "See console for output"); (ну и при старте плагина подключить файлы перевода LoadTranslations("common.phrases");).

И при выводе в консоль использовать %2d (или даже %02d), вместо просто %d (так при количестве игроков большем 9 не будет перекашиваться таблица в консоли).

Ещё одно, а чего у меня при установке bool для натива выдаёт ошибку при компиле, а при int всё норм (а у тебя не так, похоже)? Да и в инструкции по созданию нативов на соурсмоде нигде bool не упоминался почему-то.
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #10
при смене айди группы не перепроверяешь игроков на сервере?
1. Я не думаю, что кому-то приспичит прямо посередине игры поменять группу проекта\сервера.
2. Как-то не подумал, да :)

обе же под новый синтаксис полностью переделаны
В твою не смотрел. Но я не тупо переписывал. Я убирал лишние проверки (так и не пойму, зачем проверять игрока на подключение к серверу в OnClientPutInServer, если он там по сути и так зашёл), по возможности урезал код (достаточно сравнить код вывода того, состоит ли игрок в группе или нет при вводе команды), и ещё по мелочи. Хотел ещё файл переводов прилепить, но компьютера сейчас под рукой для тестов нет :(
--- Добавлено позже ---
Ещё одно, а чего у меня при установке bool для натива выдаёт ошибку при компиле, а при int всё норм (а у тебя не так, похоже)? Да и в инструкции по созданию нативов на соурсмоде нигде bool не упоминался почему-то.
Функция натива может возвращать по логике только integer. И ничего более. Но на этот случай все юзают костыли аля view_as<>()
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
В твою не смотрел. Но я не тупо переписывал.
Да я не обвиняю ни в чём. Просто было любопытно сходятся ли мысли у дураков. :crazy:
Функция натива может возвращать по логике только integer. И ничего более. Но на этот случай все юзают костыли аля view_as<>()
Значит нуно попробовать скомпилить твой код. Небось компилер ругаться будет.:biggrin:
UPD Не ругался (что с моим инклюдом, что с твоим).
--- Добавлено позже ---
@CrazyHackGUT, а есть смысл делать delete hCvar; в OnPluginStart?
Переменная так и будет изменяться, а память высвободится?
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #12
а есть смысл делать delete hCvar; в OnPluginStart?
Хэндл переменной нигде более не используется, так что смысл есть, да. Не особо много памяти высвободится (т.к. сервер по прежнему будет держать переменную созданной и Сурсмод по прежнему будет ловить любые изменения оной), но освободится.

Значит нуно попробовать скомпилить твой код. Небось компилер ругаться будет.
По логике он не должен. Булевые переменные очень просто приводятся к integer-виду. false - 0, true - любое число (даже отрицательное, лол).
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
false - 0, true - любое число (даже отрицательное, лол).
не "любое", а "любое отличное от нуля".
А так да, знаю про это. Ещё при старом синтаксисе так было и при новом всё так же пашет.
Та же проверка if(client) вместо if(0 < client)
--- Добавлено позже ---
Хэндл переменной нигде более не используется, так что смысл есть, да.
Ок, нужно будет попробовать.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Так как переменная - локальная и функция окончена, ага.
Раньше CloseHandle добавляли для страховки от утечки памяти, но для кваров, на самом деле, ничего не закрывает (возвращает "false if not closeable") - практического смысла в нём нет. При использовании ConVar от нового синтаксиса ничего не меняется:
ConVarsType: ConVar
Closeable: No
Cloneable: No
API: Core
Found in: convars.inc


ConVar Handles are primarily used for getting and setting a console variable's value. They cannot be cloned nor deleted since they exist until SourceMod is shut down.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #17
@SAZONISCHE, в теории да. Берём никнейм клиента и ищем в нём через StrContains клантег:
PHP:
public bool ClanTagValidate(int client, char[] sClanTag) {
    if ((0 > client && client > MaxClients) || (IsFakeClient(client) || !IsClientInGame(client)))
        return false;

    char sUsername[MAX_TARGET_LENGTH];
    GetClientName(client, sUsername, MAX_TARGET_LENGTH);
    return (StrContains(sUsername, sClanTag, false) != -1);
}

public void OnPluginStart() {
    /**
     * Допустим, есть два игрока.
     * У одного никнейм [-=G44=-] | Client и ID энтити на сервере 3
     * У другого - Client и ID - 10
     */
    ClanTagValidate(3, "G44"); // вернёт true
    ClanTagValidate(10, "G44"); // вернёт false
}
 
Последнее редактирование:

Someone

Участник
Сообщения
1,933
Реакции
1,653
  • Автор ресурса
  • #18
@SAZONISCHE, в теории да. Берём никнейм клиента и ищем в нём через StrContains клантег:
PHP:
public bool ClanTagValidate(int client, char[] sClanTag) {
    if ((0 > client && client > MaxClients) || (IsFakeClient(client) || !IsClientInGame(client)))
        return false;

    char sUsername[MAX_TARGET_LENGTH];
    GetClientName(client, sUsername, MAX_TARGET_LENGTH);
    return (StrContains(sUsername, sClanTag, false) != -1);
}

public void OnPluginStart() {
    /**
     * Допустим, есть два игрока.
     * У одного никнейм [-=G44=-] | Client и ID энтити на сервере 3
     * У другого - Client и ID - 10
     */
    ClanTagValidate(3, "G44"); // вернёт true
    ClanTagValidate(10, "G44"); // вернёт false
}

Через CS_GetClientClanTag
--- Добавлено позже ---
Варик узнать наличие клантега?

Можем так ? Могу ошибаться, с char не дружу.

PHP:
#pragma semicolon 1

#include <cstrike>

static const char cTag[MAX_TARGET_LENGTH] = {"Your_Tag"}; // Вместо Your_Tag вписать свой тэг
bool b_UseTag[MAXPLAYERS+1];

public void OnClientPutInServer(int iClient)
{
    char cPlayerTag[MAX_TARGET_LENGTH];
 
    CS_GetClientClanTag(iClient, cPlayerTag, sizeof(cPlayerTag));
 
    if (StrEqual(cTag, cPlayerTag))
    {
        b_UseTag[iClient] = true;
    }
}

public void OnClientDisconnect(int iClient)
{
    b_UseTag[iClient] = false;
}

Ну а дальше просто использовать b_UseTag

Ну и опционально можно добавить таймер для проверки на изменение клан тэга.
 
Последнее редактирование:

SAZONISCHE

Участник
Сообщения
405
Реакции
232
Через CS_GetClientClanTag понятно что можно сам так делал (я говорил про стимворкс замудреный)
 
Сверху Снизу