Ядро плагина Steam Works Group Manager 1.5

Дополнительные возможности для плагинов

  1. Someone

    Someone

    Сообщения:
    627
    Симпатии:
    254
    Пользователь Someone разместил новый ресурс:

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

    Узнать больше об этом ресурсе...
     
    SAZONISCHE нравится это.
  2. Grey83

    Grey83

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

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

    Вложения:

    • SWGM.inc
      Размер файла:
      1 КБ
      Просмотров:
      17
    • SWGM.sp
      Размер файла:
      4,7 КБ
      Просмотров:
      23
    CAH4E3 нравится это.
  3. September

    September

    Сообщения:
    1.603
    Симпатии:
    266
    Напишите кто-нибудь плагин, чтобы при вступлении в группу, выдавали кредиты в shop core (с проверкой на запрет повторного вступления). Я заплачу)
     
  4. Grey83

    Grey83

    Сообщения:
    611
    Симпатии:
    195
    @September, это лишняя колонка в таблице БД шопа нужна будет
     
  5. Danyas

    Danyas Модератор

    Сообщения:
    1.901
    Симпатии:
    708
    ClientPrefs / SQLite / Kv никто не отменял))
     
  6. xados

    xados

    Сообщения:
    265
    Симпатии:
    4
    Я правильно понял. Если игрока нету в в стим группе то он и попасть на сервере не сможет или как:? объясните подробно как он работает пожалуйста а то не совсем догнал что от
     
  7. September

    September

    Сообщения:
    1.603
    Симпатии:
    266
    Так скажем, это штука для других плагинов, для взаимодействия со стим группой.
     
  8. Kruzya

    Kruzya Костылизируя некостылизируемое Ньюсмейкер

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

    Вложения:

    • SWGM.7z
      Размер файла:
      2,5 КБ
      Просмотров:
      24
    Meowmurmur, TotSamiiRodya, Samoletik1337 и 2 другим нравится это.
  9. Grey83

    Grey83

    Сообщения:
    611
    Симпатии:
    195
    @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 не упоминался почему-то.
     
    Последнее редактирование: 20 окт 2016
    Samoletik1337, Meowmurmur, Kruzya и ещё 1-му нравится это.
  10. Kruzya

    Kruzya Костылизируя некостылизируемое Ньюсмейкер

    Сообщения:
    2.060
    Симпатии:
    1.511
    1. Я не думаю, что кому-то приспичит прямо посередине игры поменять группу проекта\сервера.
    2. Как-то не подумал, да :)

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

    Grey83

    Сообщения:
    611
    Симпатии:
    195
    Да я не обвиняю ни в чём. Просто было любопытно сходятся ли мысли у дураков. :crazy:
    Значит нуно попробовать скомпилить твой код. Небось компилер ругаться будет.:biggrin:
    UPD Не ругался (что с моим инклюдом, что с твоим).
    --- Добавлено позже ---
    @CrazyHackGUT, а есть смысл делать delete hCvar; в OnPluginStart?
    Переменная так и будет изменяться, а память высвободится?
     
    Meowmurmur нравится это.
  12. Kruzya

    Kruzya Костылизируя некостылизируемое Ньюсмейкер

    Сообщения:
    2.060
    Симпатии:
    1.511
    Хэндл переменной нигде более не используется, так что смысл есть, да. Не особо много памяти высвободится (т.к. сервер по прежнему будет держать переменную созданной и Сурсмод по прежнему будет ловить любые изменения оной), но освободится.

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

    Grey83

    Сообщения:
    611
    Симпатии:
    195
    не "любое", а "любое отличное от нуля".
    А так да, знаю про это. Ещё при старом синтаксисе так было и при новом всё так же пашет.
    Та же проверка if(client) вместо if(0 < client)
    --- Добавлено позже ---
    Ок, нужно будет попробовать.
     
    Meowmurmur нравится это.
  14. AlmazON

    AlmazON Не путать с самим yand3xmail

    Сообщения:
    5.165
    Симпатии:
    2.434
    Так как переменная - локальная и функция окончена, ага.
    Раньше CloseHandle добавляли для страховки от утечки памяти, но для кваров, на самом деле, ничего не закрывает (возвращает "false if not closeable") - практического смысла в нём нет. При использовании ConVar от нового синтаксиса ничего не меняется:
     
    Meowmurmur нравится это.
  15. Kruzya

    Kruzya Костылизируя некостылизируемое Ньюсмейкер

    Сообщения:
    2.060
    Симпатии:
    1.511
    Я не утверждаю правоту своих мыслей. Просто тот, к кому я ходил за советами по Павну, так говорил. Сам я не проверял.
     
  16. SAZONISCHE

    SAZONISCHE

    Сообщения:
    123
    Симпатии:
    29
    Варик узнать наличие клантега?
     
  17. Kruzya

    Kruzya Костылизируя некостылизируемое Ньюсмейкер

    Сообщения:
    2.060
    Симпатии:
    1.511
    @SAZONISCHE, в теории да. Берём никнейм клиента и ищем в нём через StrContains клантег:
    PHP:
    public bool ClanTagValidate(int clientchar[] sClanTag) {
        if ((
    client && client MaxClients) || (IsFakeClient(client) || !IsClientInGame(client)))
            return 
    false;

        
    char sUsername[MAX_TARGET_LENGTH];
        
    GetClientName(clientsUsernameMAX_TARGET_LENGTH);
        return (
    StrContains(sUsernamesClanTagfalse) != -1);
    }

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

    Someone

    Сообщения:
    627
    Симпатии:
    254
    Через 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(iClientcPlayerTagsizeof(cPlayerTag));
     
        if (
    StrEqual(cTagcPlayerTag))
        {
            
    b_UseTag[iClient] = true;
        }
    }

    public 
    void OnClientDisconnect(int iClient)
    {
        
    b_UseTag[iClient] = false;
    }
    Ну а дальше просто использовать b_UseTag

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

    SAZONISCHE

    Сообщения:
    123
    Симпатии:
    29
    Через CS_GetClientClanTag понятно что можно сам так делал (я говорил про стимворкс замудреный)
     
  20. Someone

    Someone

    Сообщения:
    627
    Симпатии:
    254
    Он проверяет на наличие игрока в группе, а не тэг.