[CS: GO] Smart Jail Doors (v0.5.2-beta, 18 ноя 2015)

Тема в разделе "Утверждённые плагины", создана пользователем Kailo, 9 июн 2015.

  1. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Smart Jail Doors (v0.5.2-beta, 18 ноя 2015)
    Обзор Smart Jail Doors

    Описание
    Плагин создан для серверов в жанре Jailbreak. Он предоставляет API для создания плагинов, где надо Открывать/Закрывать двери джайлов.
    Так же позволяет создавать на карте дополнительные кнопки для открытия джайлов (это полезно на картах, где далеко расположена кнопка или нету ни одной кнопки, к примеру ba_jail_alcatraz_redux_go).

    Команды
    sm_sjd — админ команда (рут флаг по-умолчанию), открывает меню плагина.
    sm_sjddebug — выводит в консоль список карт где отсутствует конфигурация.
    sm_sjdhm [<name>] — дамп списка объектов в консоль; ручной режим для выбранного объекта.

    Cvars
    sjd_buttons_sound_enable (def. "1") — переключатель звука использования кнопки.
    sjd_buttons_sound (def. "buttons/button3.wav") — звук использования кнопки.
    sjd_buttons_glow (def. "0") — переключатель свечения кнопки.
    sjd_buttons_glow_color (def. "0 150 0") — цвет свечения кнопки.
    sjd_buttons_filter (def. "0") — фильтр доступа для кнопки (0 — все, 1 — кт).

    API
    Нативы для создания плагинов вы можете найти в smartjaildoors.inc, который лежит в папке "addons/sourcemod/scripting/include".
    PHP:
    /**
     * Open jail's doors on current map saved in Smart Jail Doors config.
     * Открывает двери джайлов.
     *
     * @noreturn
     */
    native void SJD_OpenDoors();

    /**
     * Close jail's doors on current map saved in Smart Jail Doors config.
     * Закрывает двери джайлов.
     *
     * @noreturn
     */
    native void SJD_CloseDoors();

    /**
     * Toggle jail's doors on current map saved in Smart Jail Doors config.
     * If door can't be toggled - nothing.
     * Переключает двери джайлов: открывает если закрыты, закрывает если открыты.
     * Если нельзя переключить, то ничего.
     *
     * @noreturn
     */
    native void SJD_ToggleDoors();

    /**
     * Toggle jail's doors on current map saved in Smart Jail Doors config.
     * If door can't be toggled - open.
     * Переключает двери джайлов: открывает если закрыты, закрывает если открыты.
     * Если нельзя переключить, то открывает.
     *
     * @noreturn
     */
    native void SJD_ToggleExDoors();

    /**
     * Check if exist doors config for said map.
     * Возвращает true, если имеется конфиг на указанной карте, иначе false.
     *
     * @param mapName    String with map name for check.
     * @return
     */
    native bool SJD_IsMapConfigured(const char[] mapName);

    /**
     * Check if exist doors config for current map.
     * Возвращает true, если имеется конфиг на текущей карте, иначе false.
     */
    stock bool SJD_IsCurrentMapConfigured();
    Так же вы можете посмотреть пример плагина с использованием SJD.

    Инструкция по установки
    • Загрузите последний релиз .
    • Распакуйте файлы в "<ваш сервер>/csgo" папку. (README.md и ChangeLog.txt необязательно)
    • Смените карту на сервере.
    • Настройте плагин на всех картах вашего сервера или скачайте подготовленный конфиг (подготовленный конфиг будет позже).
    • Готово.

    Список изменений

    Загрузка
    Посмотреть вложение smartjaildoors.zip или https://github.com/Kailo97/smartjaildoors/releases.

    Благодарности
    Спасибо Фениксу за советвы по написанию плагина.
    Спасибо s.t.v.o.l за помощь в тестах.
    Так же спасибо всем кто ответил мне в этой теме.
    Спасибо R1KO за совет о циклах.
     
    Последнее редактирование: 21 ноя 2015
    R1KO, ThreshHNS, hanson и 5 другим нравится это.
  2. Napas

    Napas

    Сообщения:
    471
    Симпатии:
    38
    Re: Smart Jail Doors (v0.1.0-beta, 2015-06-09)

    Полезная вещь) устоновлю на серевр себе.
     
  3. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Smart Jail Doors (v0.1.0-beta, 2015-06-09)

    Плагин написан хорошо.
    Но есть мелкие моменты.
    Переменные называй понятней, а то не поймешь где глобальная, а где локальная (например kv, написал бы g_hKv или g_Kv уже было бы понятней) и какой у неё тип.

    PHP:
    do {
            
    char name[64], clsname[64];
            
    int result;
            
    kv.GetSectionName(namesizeof(name));
            
    kv.GetString("class"clsnamesizeof(clsname));
            
    Call_StartFunction(nullhandler);
            
    Call_PushString(name);
            
    Call_PushString(clsname);
            if (
    data != 0)
                
    Call_PushCell(data);
            
    Call_Finish(result);
        } while (
    kv.GotoNextKey());
    Переменные нужно было создать до цикла.

    PHP:
    int doors[128], MaxEntities GetMaxEntities();
        for (
    int i=MaxClients+1;i<MaxEntities;i++) {
            if (
    IsValidEntity(i)) {
                
    char entclsname[64];
                
    GetEntityClassname(ientclsnamesizeof(entclsname));
                if (
    StrEqual(clsnameentclsname)) {
                    
    char entname[64];
                    
    GetEntityName(ientnamesizeof(entname));
                    if (
    StrEqual(nameentname)) {
                        
    doors[doors[0]+1] = i;
                        
    doors[0]++;
                    }
                }
            }
        }
    Тут тоже самое.

    В принципе всё. Может я чего и не заметил но в целом всё отлично.

    Еще помимо нативов советую создать форварды открытия и закрытия дверей. Мало ли)
     
    neatek3 нравится это.
  4. White Wolf

    White Wolf [] (int _n) -> double { return (_n % 2) == 0;}); Супер-модератор

    Сообщения:
    1.194
    Симпатии:
    426
    Re: Smart Jail Doors (v0.1.0-beta, 2015-06-09)

    Оффтоп
     
  5. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.2.0-beta, 2015-06-09)

    Релиз v0.2.0-beta
    • Добавлена команда sm_sjddebug — выводит в консоль список карт где отсутствует конфигурация.
    • Оптимизация циклов (Спасибо R1KO).
    • Улучшение некоторых функций.
    • Переименование глобальных переменных.
     
  6. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Smart Jail Doors (v0.2.0-beta, 2015-06-09)

    Kailo,
    PHP:
    do {
            
    char name[64], clsname[64];
            
    int result;
            
    g_kv.GetSectionName(namesizeof(name));
            
    g_kv.GetString("class"clsnamesizeof(clsname));
            
    Call_StartFunction(nullhandler);
            
    Call_PushString(name);
            
    Call_PushString(clsname);
            if (
    data != 0)
                
    Call_PushCell(data);
            
    Call_Finish(result);
        } while (
    g_kv.GotoNextKey());

    ...

    do {
            
    char buffer[8];
            
    float origin[3];
            
    int result;
            
    g_kv.GetSectionName(buffersizeof(buffer));
            
    g_kv.GetVector("pos"origin);
            
    Call_StartFunction(nullhandler);
            
    Call_PushCell(StringToInt(buffer));
            
    Call_PushArray(origin3);
            if (
    data != 0)
                
    Call_PushCell(data);
            
    Call_Finish(result);
        } while (
    g_kv.GotoNextKey());
    А тут так и осталось))

    PHP:
    char buffer[16];
    Format(buffersizeof(buffer), "%d"buttonid);
    FormatEx быстрее
     
  7. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.579
    Симпатии:
    1.989
    Re: Smart Jail Doors (v0.2.0-beta, 2015-06-09)

    Но медленнее IntToString.
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Smart Jail Doors (v0.2.0-beta, 2015-06-09)

    AlmazON, я скинул ток первую строку, которая попалась под руку и честно говоря даже не посмотрел что там форматируется.
     
  9. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.2.1-beta, 2015-06-10)

    Релиз v0.2.1-beta
    • Исправление критических ошибок.
    • Оптимизация циклов.
     
    Последнее редактирование: 10 июн 2015
  10. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Smart Jail Doors (v0.2.1-beta, 2015-06-10)

    Kailo,
    PHP:
    e[64];
        do {
            
    int result;
            
    g_kv.GetSectionName(namesizeof(name));
            
    g_kv.GetString("class"clsnamesizeof(clsname));
            
    Call_StartFunction(nullhandler);
            
    Call_PushString(name);
            
    Call_PushString(clsname);
            if (
    data != 0)
                
    Call_PushCell(data);
            
    Call_Finish(result);
        } while (
    g_kv.GotoNextKey());
    int result; все ровно в цикле. Да и вообще зачем она если она нигде не используется?
    Посмотрел что во всех ф-ях получаешь результат только не понятно зачем, он же нигде не используется.
     
    Kailo нравится это.
  11. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.2.1-beta, 2015-06-10)

    R1KO, я считал, что без него нельзя использовать Call_Finish(); спасибо за совет.
     
  12. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.3.0-beta, 12 июн 2015)

    Релиз v0.3.0-beta
    • Переделана use логика (теперь более похожа на source engine).
    • Добавлен 'SJD_IsMapConfigured' натив (см. описание выше).
    • Исправлен баг в 'IsMapConfigured' логике.
    • Исправлен баг в 'CheckMapsWithNoDoorsCfg' логике.
    • Оптимизация циклов.
     
  13. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Smart Jail Doors (v0.3.0-beta, 12 июн 2015)

    По коду замечаний нет. Плагин тестировался? Полет нормальный?

    P.S.
    PHP:
    public int Native_SJD_IsMapConfigured(Handle pluginint numParams)
    {
        
    int len;
        
    GetNativeStringLength(1len);
        
        if (
    len <= 0)
            return 
    view_as<int>(false);
        
        
    char[] mapName = new char[len 1];
        
    GetNativeString(1mapNamelen 1);
        
        return 
    view_as<int>(IsMapConfigured(mapName));
    }
    Тип ф-и int. А если просто вернуть false (без view_as<int>) будет ругаться на теги?
    Просто заметил что на старом синтаксисе в каллбеках нативов что bool что int возвращаются нормально, но при других типах нужно опускать тип (_:). Вот интересно просто на новом так же или всё же нужно всё преобразовывать в int.
     
  14. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.3.0-beta, 12 июн 2015)

    Компилируется без замечаний, все нововведения протестировал, все работает как должно. Можно возвращать без преобразований типа.
     
  15. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.4.0-beta, 24 июн 2015)

    Релиз v0.4.0-beta
    • Добавлен ToggleEx метод.
    • Добавлен 'SJD_ToggleExDoors' натив (см. описание выше).
    • Добавлена поддержка 'func_wall_toggle' класса объектов.
    • Добавлен русский перевод.
     
  16. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Smart Jail Doors (v0.4.0-beta, 24 июн 2015)

    Утвердил.
     
  17. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.4.1-beta, 20 авг 2015)

    Релиз v0.4.1-beta
    • Добавлен SJD_IsCurrentMapConfigured сток.
    • Исправлен баг с регистром названий объектов.
     
    White Wolf нравится это.
  18. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.5.0-beta, 26 авг 2015)

    Релиз v0.5.0-beta
    • Добавлен звук использования кнопки.
    • Добавлен cvar sjd_buttons_sound_enable (def. "1").
    • Добавлен cvar sjd_buttons_sound (def. "buttons/button3.wav").
    • Добавлено свечение кнопки.
    • Добавлен cvar sjd_buttons_glow (def. "0").
    • Добавлен cvar sjd_buttons_glow_color (def. "0 150 0").
    • Добавлен ручной режим - Нужен для сохранение дверей с noclip, nodrow и похожими текстурами, т.к. их нельзя получить прицеливанием.
    • Добавлена команда sm_sjdhm.
    • Добавлено меню ручного режима.
    • Исправлен баг с некорректным отображением языка в меню.
    • Format заменены на FormatEx.
    • Исправлена вкл./выкл./перезагрузка плагина (Меню автоматически закрывается, кнопки убираются и появляются на карте).
    • Добавлен cvar sjd_buttons_filter (def. "0").
     
  19. R1KO

    R1KO Супер-модератор

    Сообщения:
    6.001
    Симпатии:
    2.993
    Re: Smart Jail Doors (v0.5.0-beta, 26 авг 2015)

    PHP:
    public void ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        
    char cvarname[64];
        
    convar.GetName(cvarnamesizeof(cvarname));
        if (
    StrEqual("sjd_buttons_glow"cvarname)) {
            ...
        } else if (
    StrEqual("sjd_buttons_glow_color"cvarname)) {
            ...
        }
    }
    У тебя же квары глобальные, проще проверить квары по хандлу чем работать со строками:
    PHP:
    public void ConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
    {
        if (
    convar == cv_sjd_buttons_glow) {
            ...
        } else {
            ...
        }
    }
    А после else проверки вообще не нужно т.к. у тебя только 2 квара ссылаются на этот каллбек, следовательно если это не 1 квар то другой.

    PHP:
    void InputToDoor(const char[] name, const char[] clsname, const char[] input)
    {
        
        
    int doors[128], MaxEntities GetMaxEntities();
        
    char entclsname[64], entname[64];
        for (
    int i=MaxClients+1;i<MaxEntities;i++) {
            ...
        }
        
        ...
        
        for (
    int i=1;i<=doors[0];i++)
            
    AcceptEntityInput(doors[i], input);
    }
    i создается 2 раза. Рациональнее было бы создать её 1 раз до циклов (вместе с doors и MaxEntities).

    PHP:
    void ShowSJDMenu2(int client)
    {
        
    SetGlobalTransTarget(client);
        if (
    g_sjdclient != && g_sjdclient != client) {
            
    PrintToChat(clientCHAT_PATTERN"SJD menu denied - already opened");
            return;
        }
        
        
    Menu menu = new Menu(SJDMenu2);
        
    menu.SetTitle("Smart Jail Doors");
        
    char buffer[128];
        
    FormatEx(buffersizeof(buffer), "%t""Doors");
        
    menu.AddItem("doors"buffer);
        
    FormatEx(buffersizeof(buffer), "%t""Test");
        
    menu.AddItem("test"buffer);
        
    FormatEx(buffersizeof(buffer), "%t""Buttons");
        
    menu.AddItem("buttons"buffer);
        
    g_SJDMenu2 menu;
        
    menu.Display(clientMENU_TIME_FOREVER);
        
    g_sjdclient client;
    }
    Не логичнее сделать SetGlobalTransTarget(client); после проверок.
    PrintToChat(client всё ровно сам сделает SetGlobalTransTarget(client);


    И зачем создавать menu если можно сразу работать с g_SJDMenu2.

    PHP:
    public int SJDMenu2(Menu menuMenuAction actionint param1int param2)
    {
        switch (
    action) {
            case 
    MenuAction_Select: {
                
    char info[64];
                
    menu.GetItem(param2infosizeof(info));
                if (
    StrEqual(info"doors")) {
                    
    SJDMenu2_ShowDoorsSubMenu(param1);
                } else if (
    StrEqual(info"test")) {
                    
    SJDMenu2_ShowTestSubMenu(param1);
                } else if (
    StrEqual(info"buttons")) {
                    
    SJDMenu2_ShowButtonsSubMenu(param1);
                }
            }
            case 
    MenuAction_CancelCloseSJDMenu();
            case 
    MenuAction_Enddelete menu;
        }
    }
    Легче работать с номером пункта чем с его описанием. Ведь меню статическое, пункты в нем не изменяются. Так что оптимальнее проверять param2.

    PHP:
    void SJDMenu2_ShowDoorsSubMenu(int clientbool late false)
    {
        
    SetGlobalTransTarget(client);
        
    Menu menu = new Menu(SJDMenu2_DoorsSubMenu);
        
    menu.SetTitle("%t""Doors title");
        
    char buffer[128];
        
    FormatEx(buffersizeof(buffer), "%t""Save door");
        
    menu.AddItem("save"buffer);
        if (!
    ExecuteDoors(SJDMenu2_AddItemsToDoorsSubMenumenu)) {
            
    FormatEx(buffersizeof(buffer), "%t""No doors");
            
    menu.AddItem("nodoors"bufferITEMDRAW_DISABLED);
        }
        
    menu.OptionFlags |= MENUFLAG_BUTTON_EXITBACK;
        
    g_SJDMenu2 menu;
        
    menu.Display(clientMENU_TIME_FOREVER);
        
    EnableLookAt(late);
    }
    Тут аналогично, сразу g_SJDMenu2 = new Menu(SJDMenu2_DoorsSubMenu);
    И с каллбеком нажатия тоже так же.
    Да и дальше вроде как во всех меню так же.

    И кстати, зачем использовать глобальное меню? Чтобы закрывать в случае чего? Тогда меню нужно каждому игроку, т.к. если одновременно 2 игрока будут работать в меню то они будут перебивать меню друг друга. Хотя это маловероятно, но советую подумать об этом.

    Ну и дальше по коду одни и те же, эм.. замечания, что ли...
     
  20. Kailo

    Kailo

    Сообщения:
    28
    Симпатии:
    16
    Re: Smart Jail Doors (v0.5.0-beta, 26 авг 2015)

    Не знаю почему, но у меня в голове сложился стереотип что Handle нельзя сравнивать, хорошенько подумав я понял что он сравнивает не значения, а просто адрес переменной. Поправим.