[CS:S/CS:GO] Request: Advanced [SM 1.7]

diller110

Добрая душа
Сообщения
353
Реакции
278
Список изменений версии 2.2.1:
  • Исправлено много недочетов:
    • Ускорены некоторые обработки строк (совсем чуть чуть)
    • Исправлены размеры многих строк
    • Подчищено много не нужных действий
  • Убраны ненужные цифры также и в меню собственных заявок
--- Добавлено позже ---

char Text[512]; вроде как лимит для чата 192.
Интересно, что при вводе сообщения, ограничение не 192, а ~500.
stock на ф-ях не нужен.
Это же во время компиляции уберется, вроде. Не думаю, что критично.
@AlmazON , @R1KO
И технический вопрос:
C-подобный:
public int UserListItemHandler(Menu menu, MenuAction action, int client, int item) {
    if (action == MenuAction_Select){
        char query[255], items[5];
        menu.GetItem(item, items, 5);
        switch(item) {
            case 1: {
                PrintToChat(client, "%s \x01Выводим текст \x06%s \x01заявки", TAG, items);
                Format(query, 255, "SELECT request, answer FROM Request WHERE id = '%s' LIMIT 1", items);
                db.Query(UserListItemMenu_Print, query, GetClientUserId(client), DBPrio_Normal); 
                menu.Display(client, 30);
            }
            case 2: {
                BD_DeleteById(StringToInt(items));
                PrintToChat(client, "%s \x01Заявка \x06%s \x01успешно удалена!", TAG, items);
                menu.Cancel();
                delete menu;
                RequestMenu.Display(client,30);
            }
            case 3: {
                menu.Cancel();
                delete menu;
                RequestMenu.Display(client,30);
            }
        }
    }
}
Собственно, тут нету
if (action == MenuAction_End) {
delete menu;
}
Чтобы меню не закрывалось при выборе пунктов. По идее если пользователь все делает правильно, работает тоже правильно. Но например если это меню перекроет другое, получается утечка памяти?
Есть ли более изящные решения?
 
Последнее редактирование:

pentaxist

Участник
Сообщения
495
Реакции
91
Список изменений версии 2.1:

  • Добавлены квары sm_request_showban и sm_request_flag.

    • sm_request_showban 1 - Если у вас ведется запись демок, в меню появится пункт "Подозрения в читерстве", с таким сообщением: Посмотреть вложение 17829
      sm_request_flag "с" - Флаг доступа в админке к управлению заявками.
    Небольшие изменения, для поддержки большего кол-ва статусов. (добавлять прямо в исходнике)
    Оповещение игрока если его заявка изменена:

    • При условии, что он в онлайне - сразу
      Если карта не менялась, а игрок зашел - при входе
    Оповещение админа при входе о кол-ве непрочитанных заявок (статус 0)
    Косметические изменения сообщений и менюшек (спасибо @m9c0)
Плагин не создает конфиг файл насколько знаю. Квары вписывать в server.cfg ?
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
не создает конфиг файл
Добавь в исходнике после 52 строки:
C-подобный:
ShowBan = GetConVarInt(ConVar_ShowBanRequest);
Новую строчку:
PHP:
AutoExecConfig(true, "requests_advanced");
Автору @diller110 :
C-подобный:
HookEvent("player_team", Event_PlayerTeam, EventHookMode_PostNoCopy);
Если получаешь с event'а что-либо, то нельзя использовать метод EventHookMode_PostNoCopy. С новым компилятором можно получить ошибки в логи. return Plugin_Changed; и Action убрать - он только для EventHookMode_Pre событий.
C-подобный:
if((event.GetInt("oldteam") == 0) && IsValidClient(client) && !IsFakeClient(client))
Событие вызывается при каждом отключении игрока, а валидность индекса здесь проверять не требуется:
PHP:
if(!event.GetBool("disconnect") && event.GetInt("oldteam") == 0 && !IsFakeClient(client))
получается утечка памяти?
Получается.
 

m9c0

Участник
Сообщения
159
Реакции
72
@pentaxist, в исходнике плагина, найди примерно 81 строку, там будет доступ по флагу sm_kick, замени за sm_root, скомпилируй плагин, положи на сервер и перезапусти
 

pentaxist

Участник
Сообщения
495
Реакции
91
@pentaxist, в исходнике плагина, найди примерно 81 строку, там будет доступ по флагу sm_kick, замени за sm_root, скомпилируй плагин, положи на сервер и перезапусти
Я это делал на предыдущей версии плагина, после автор ввел квар на флаг, должно без компиляции работать.
 

m9c0

Участник
Сообщения
159
Реакции
72
@pentaxist, ну а разве не ты выше писал, что у тебя все равно меню доступно для всех админов?
 

pentaxist

Участник
Сообщения
495
Реакции
91
@pentaxist, ну а разве не ты выше писал, что у тебя все равно меню доступно для всех админов?
Так я больше для автора написал, что бы он в дальнейшем исправил. Так как квар должен давать доступ по определенному флагу, без танца с бубном.
А как это исправить, сам знаю.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #50
Оффтоп

@diller110, флаг из квара получаешь в строку, так из неё сразу через ReadFlagString в int, потом проверяй через CheckCommandAccess, ибо GetUserFlagBits требует явного наличия флага (т. е. если стоит флаг b то админ с флагом z не сможет юзать)
 

diller110

Добрая душа
Сообщения
353
Реакции
278
Список изменений версии 2.2.2 (багфиксы):
  • Фикс квара с флагом доступа
  • Попытка фикса вывода админам кол-ва непрочитанных заявок при входе
    • Это +2 запроса в БД при коннекте админа, но зато без ложных данных
  • Теперь генерируется файл с конфигом
  • Мелкие оптимизаци от Almazon
Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #52
@diller110, прикол в том что если команду указываешь то будет учитываться флаг. А если впишешь, то на неё можно будет переопределить флаги
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Мелкие оптимизаци
Вижу, чтобы избежать проблемы утечки памяти, сделал меню с глобальной переменной. А у меня остался такой вариант:
PHP:
public int UserListItemHandler(Menu menu, MenuAction action, int client, int item) {
    if (action == MenuAction_Select){
        char items[5];
        menu.GetItem(item, items, 5);
        switch(item) {
            case 1: {
                PrintToChat(client, "%s \x01Выводим текст \x06%s \x01заявки", TAG, items);
                char query[255];
                FormatEx(query, 255, "SELECT request, answer FROM Request WHERE id = '%s' LIMIT 1", items);
                db.Query(UserListItemMenu_Print, query, GetClientUserId(client), DBPrio_Normal);   
                menu.Display(client, 30);
                return;
            }
            case 2: {
                BD_DeleteById(StringToInt(items));
                PrintToChat(client, "%s \x01Заявка \x06%s \x01успешно удалена!", TAG, items);
            }
            delete menu;
            RequestMenu.Display(client,30);
        }
    }
    else if (action == MenuAction_End && client != MenuEnd_Selected) delete menu;
}
 

m9c0

Участник
Сообщения
159
Реакции
72
@diller110,
при установке статуса "в работе", заявка попадает в архив. Считаю это неправильным, так как в архив должны попадать заявки со статусами "выполнено" и "отклонено".
 

diller110

Добрая душа
Сообщения
353
Реакции
278
@m9c0, Да, в этом есть доля правды)
В главном посте обновленная версия, цифру не меняю, т.к. мелочь.
 

m9c0

Участник
Сообщения
159
Реакции
72
@diller110, ну это как бы и не срочно) мог бы добавить в список багов, которые нужно исправить к следующей версии
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Вижу, чтобы избежать проблемы утечки памяти, сделал меню с глобальной переменной. А у меня остался такой вариант:
PHP:
public int UserListItemHandler(Menu menu, MenuAction action, int client, int item) {
    if (action == MenuAction_Select){
        ...
    }
    else if (action == MenuAction_End && client != MenuEnd_Selected) delete menu;
}
при создании меню добавить флаг 'MENU_ACTIONS_ALL' (например, RequestMenu = CreateMenu(MenuHandler, MENU_ACTIONS_ALL); )
а в хендлере использовать действие 'MenuAction_Cancel'
PHP:
MenuAction_Cancel = (1<<3),        /**< The menu was cancelled (param1=client, param2=reason) */

/**
* Reasons a menu can be cancelled (MenuAction_Cancel).
*/
enum
{
    MenuCancel_Disconnected = -1,    /**< Client dropped from the server */
    MenuCancel_Interrupted = -2,    /**< Client was interrupted with another menu */
    MenuCancel_Exit = -3,            /**< Client exited via "exit" */
    MenuCancel_NoDisplay = -4,        /**< Menu could not be displayed to the client */
    MenuCancel_Timeout = -5,        /**< Menu timed out */
    MenuCancel_ExitBack = -6,        /**< Client selected "exit back" on a paginated menu */
};
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #58
@Grey83, а зачем ему all если MenuAction_Cancel по умолчанию есть всегда?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
PHP:
#define MENU_ACTIONS_DEFAULT    MenuAction_Select|MenuAction_Cancel|MenuAction_End
@R1KO, ну тогда без добавления флага (у меня он в менюшках стоит чтобы можно было текст меняющимся делать, в зависимости от переменных).
Использую для 'MenuAction_Display', 'MenuAction_DisplayItem' и 'MenuAction_DrawItem'.
 
Сверху Снизу