Steam Works Group Manager

Steam Works Group Manager 1.8

Нет прав для скачивания

Someone

Нужно больше модульности..
Сообщения
1,689
Реакции
1,033
Пользователь Someone разместил новый ресурс:

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

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


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


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

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

Создавался по примеру...
Узнать больше об этом ресурсе...
 

Grey83

похухоль
Сообщения
2,786
Реакции
1,517
ты бы синтаксисы не мешал в коде
то у тебя 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:

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

Вложения

  • 1 KB Просмотры: 24
  • 4.7 KB Просмотры: 27

September

Добрый модер
Модератор
Сообщения
2,967
Реакции
941
Напишите кто-нибудь плагин, чтобы при вступлении в группу, выдавали кредиты в shop core (с проверкой на запрет повторного вступления). Я заплачу)
 

Grey83

похухоль
Сообщения
2,786
Реакции
1,517
@September, это лишняя колонка в таблице БД шопа нужна будет
 
Сообщения
303
Реакции
19
Я правильно понял. Если игрока нету в в стим группе то он и попасть на сервере не сможет или как:? объясните подробно как он работает пожалуйста а то не совсем догнал что от
 

September

Добрый модер
Модератор
Сообщения
2,967
Реакции
941
Я правильно понял. Если игрока нету в в стим группе то он и попасть на сервере не сможет или как:? объясните подробно как он работает пожалуйста а то не совсем догнал что от
Так скажем, это штука для других плагинов, для взаимодействия со стим группой.
 

Крузяра

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

Вложения

  • 2.5 KB Просмотры: 38

Grey83

похухоль
Сообщения
2,786
Реакции
1,517
@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 не упоминался почему-то.
 
Последнее редактирование:

Крузяра

Супермодератор
Сообщения
7,224
Реакции
5,505
при смене айди группы не перепроверяешь игроков на сервере?
1. Я не думаю, что кому-то приспичит прямо посередине игры поменять группу проекта\сервера.
2. Как-то не подумал, да :)

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

Grey83

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

Крузяра

Супермодератор
Сообщения
7,224
Реакции
5,505
а есть смысл делать delete hCvar; в OnPluginStart?
Хэндл переменной нигде более не используется, так что смысл есть, да. Не особо много памяти высвободится (т.к. сервер по прежнему будет держать переменную созданной и Сурсмод по прежнему будет ловить любые изменения оной), но освободится.

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

Grey83

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

AlmazON

Не путать с самим yand3xmail
Сообщения
5,146
Реакции
2,523
но освободится
Так как переменная - локальная и функция окончена, ага.
Раньше 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.
 

Крузяра

Супермодератор
Сообщения
7,224
Реакции
5,505
@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,689
Реакции
1,033
@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

Ну и опционально можно добавить таймер для проверки на изменение клан тэга.
 
Последнее редактирование:
Сообщения
234
Реакции
89
Через CS_GetClientClanTag понятно что можно сам так делал (я говорил про стимворкс замудреный)
 
Сверху