Подключение модулей плагина по очереди

Тема в разделе "Программирование / Скриптинг", создана пользователем alexfyodrv, 23 авг 2016.

  1. alexfyodrv

    alexfyodrv

    Сообщения:
    24
    Симпатии:
    0
    Здравствуйте. Подскажите как подключить a.smx, b.smx, c.smx по очереди, то есть чтобы c.smx не подключился раньше b.smx, а b.smx не подключился раньше a.smx. Требуется для реализации мода. Буду благодарен за помощь с кодом.

    Не подумайте, что я не искал решение на alliedmods. Я не нашел информации как подключить плагин в плагине.
     
    Последнее редактирование: 23 авг 2016
  2. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    863
    Симпатии:
    540
    Воткнуть зависимые плагины как вариант. Ну или:
    Код:
    ServerCommand("sm plugins load x");
     
    alexfyodrv нравится это.
  3. alexfyodrv

    alexfyodrv

    Сообщения:
    24
    Симпатии:
    0
    Каким образом сделать, чтобы сервер не подключал эти плагины повторно. И как вызвать мой плагин первым чтобы он подключил остальные.
     
  4. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    863
    Симпатии:
    540
    Если заглядывал в инклюду СБ, например, мог увидеть такие строчки:
    Код:
    public SharedPlugin:__pl_sourcebans =
    {
       name = "sourcebans",
       file = "sourcebans.smx",
       #if defined REQUIRE_PLUGIN
       required = 1
       #else
       required = 0
       #endif
    };
    Воткни подобное в c.smx, чтобы он требовал наличие b.smx, а в b.smx - a.smx
     
  5. White Wolf

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

    Сообщения:
    1.193
    Симпатии:
    420
    Хранить в плагине Handle других плагинов и при загрузке проверять на соответствие. Если handle найден в массиве, то плагин уже загружен.
     
  6. AlmazON

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

    Сообщения:
    4.540
    Симпатии:
    1.984
    Если смотреть тот же Shop, то всё реализуется вызовами и нативами.
    Можно любительским методом, например: создаём, как положено, в каждом плагине квар выключения. Плагин c.smx проверяет квар на существование плагина b.smx: если он не найден (INVALID HANDLE), значит, плагин не запускаем, ничего не делаем. b.smx точно также проверяет a.smx. Когда же a.smx загрузился (остальные не нашли кваров и потому выключены), отсылаем консольную команду плагину b.smx и он включается, отсылая команду плагину c.smx. В итоге, все плагины загружены в нужном порядке. Оффтоп
    Если хочешь, напишу пример, о чём речь, но едва ли такое стоит кому-либо использовать. :fie:
     
  7. Danyas

    Danyas Спасибо, браток © yand3xmail Модератор

    Сообщения:
    1.718
    Симпатии:
    459
    Лично я - понял, у меня такие вещи так и реализованы)
     
  8. AlmazON

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

    Сообщения:
    4.540
    Симпатии:
    1.984
    PHP:
    new bool:g_bCvarEnable;

    public 
    OnPluginStart()
    {
        
    PrintToServer("Load plugin A!!!");
        
    decl Handle:cvar;
        
    cvar CreateConVar("plugin_a_enable",        "1",    "1 - включение плагина 'a', 0 - выключение."_true0.0true1.0);
        
    HookConVarChange(cvarChangeCvar_A_enable);
        
    g_bCvarEnable GetConVarBool(cvar);
        if (
    FindConVar("plugin_b_enable")) ServerCommand("load_plugin_a");
    }

    public 
    ChangeCvar_A_enable(Handle:cvar, const String:oldValue[], const String:newValue[]) g_bCvarEnable GetConVarBool(cvar);
    PHP:
    new bool:g_bCvarEnable;
    new 
    bool:g_bLoadPluginA;
    new 
    bool:g_bFullEnable;

    public 
    OnPluginStart()
    {
        
    PrintToServer("Load plugin B!!!");
        
    decl Handle:cvar;
        
    cvar CreateConVar("plugin_b_enable",        "1",    "1 - включение плагина 'b', 0 - выключение."_true0.0true1.0);
        
    HookConVarChange(cvarChangeCvar_B_enable);
        
    g_bCvarEnable GetConVarBool(cvar);
        if (
    FindConVar("plugin_a_enable")) LoadPluginA(0);
        else 
    RegServerCmd("load_plugin_a"LoadPluginA"Команда статуса подключённости плагина 'a'.");
    }

    public 
    ChangeCvar_B_enable(Handle:cvar, const String:oldValue[], const String:newValue[])
    {
        if ((
    g_bFullEnable = (g_bCvarEnable GetConVarBool(cvar)) && g_bLoadPluginA))
        {
            
    //Выполнение обычного кода.
        
    }
    }

    public 
    Action:LoadPluginA(args)
    {
        
    g_bLoadPluginA true;
        if (
    FindConVar("plugin_c_enable")) ServerCommand("load_plugin_b");
        
    PrintToServer("ENTER plugin B!!!");
        return 
    Plugin_Handled;
    }

    //Пример проверки, что плагин загружен в верном порядке и включён кваром.
    public OnClientPostAdminCheck(client)
    {
        if (
    g_bFullEnable)
        {
            
    //Выполнение обычного кода.
        
    }
    }
    PHP:
    new bool:g_bCvarEnable;
    new 
    bool:g_bLoadPluginB;
    new 
    bool:g_bFullEnable;

    public 
    OnPluginStart()
    {
        
    PrintToServer("Load plugin C!!!");
        
    decl Handle:cvar;
        
    cvar CreateConVar("plugin_c_enable",        "1",    "1 - включение плагина 'c', 0 - выключение."_true0.0true1.0);
        
    HookConVarChange(cvarChangeCvar_C_enable);
        
    g_bCvarEnable GetConVarBool(cvar);
        if (
    FindConVar("plugin_b_enable")) LoadPluginB(0);
        else 
    RegServerCmd("load_plugin_b"LoadPluginB"Команда статуса подключённости плагина 'b'.");
    }

    public 
    ChangeCvar_C_enable(Handle:cvar, const String:oldValue[], const String:newValue[])
    {
        if ((
    g_bFullEnable = (g_bCvarEnable GetConVarBool(cvar)) && g_bLoadPluginB))
        {
            
    //Выполнение обычного кода.
        
    }
    }

    public 
    Action:LoadPluginB(args)
    {
        
    g_bLoadPluginB true;
        if (
    FindConVar("plugin_e_enable")) ServerCommand("load_plugin_d");
        
    PrintToServer("ENTER plugin C!!!");
        return 
    Plugin_Handled;
    }

    //Пример проверки, что плагин загружен в верном порядке и включён кваром.
    public OnClientPostAdminCheck(client)
    {
        if (
    g_bFullEnable)
        {
            
    //Выполнение обычного кода.
        
    }
    }
    В консоли сервера:
    Load - порядок загрузки модуля самим SM;
    ENTER - получаемая загрузка модулей.
    Вот так?! Оффтоп
     
    Последнее редактирование: 24 авг 2016
    alexfyodrv нравится это.
  9. alexfyodrv

    alexfyodrv

    Сообщения:
    24
    Симпатии:
    0
    Спасибо всем кто пытался мне помочь, но вряд ли это будет правильным решением. Возможно вы подскажите как это сделать по другому. Задача такая: Есть плагин sm:rpg все навыки подключаются как модули (по примеру vip riko) мне нужно сделать сортировку то есть установить свой порядок отображения их в меню. Я просмотрел все файлы исходников и пришел к выводу что подключается модули через функцию в инклуде так как каждый её вызывает. Как мне сделать так чтобы это меню можно было отсортировать в нужном мне порядке?

    Оффтоп
     
  10. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    863
    Симпатии:
    540
    У меня есть такой вариант реализации. Переместить все нужные модули в папку disabled и через server.cfg подгружать их. Но я не уверен, что SM вообще даёт подгружать плагины из disabled.

    Код:
    sm plugins load disabled/MyModule1
    sm plugins load disabled/MyModule2
     
    Danyas и alexfyodrv нравится это.
  11. alexfyodrv

    alexfyodrv

    Сообщения:
    24
    Симпатии:
    0
    я попробую.
     
  12. AlmazON

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

    Сообщения:
    4.540
    Симпатии:
    1.984
    1) Пользователи могут не выполнить это условие, закинув модули, как обычно.
    2) Файлы могут переименовать и работать перестанет вовсе.
    3) Плагины на серверах имеют свойство полностью перезагружаться заново с новой картой и, поскольку они уже не в папке disabled, то и вся последующая загрузка будет выполнена неверно.
    Короче, даже не костыль, а заплатка к костылю.
     
  13. alexfyodrv

    alexfyodrv

    Сообщения:
    24
    Симпатии:
    0
    Что вы предлагаете?
     
  14. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    863
    Симпатии:
    540
    @AlmazON, а я и не говорю, что это решение.
    @alexfyodrv, снова предложу этот вариант:
     
  15. White Wolf

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

    Сообщения:
    1.193
    Симпатии:
    420
    Последовательность загрузки можно регулировать сторонним плагином. Используйте ADT Array и для каждого элемента храните handle других плагинов. По handle плагина можно получить и имя плагина и прочую информацию о нём.
    ---- Пример на меню ----
    Jail-Warden-Pro/jwpm_menu.sp at dev · TiBarification/Jail-Warden-Pro · GitHub
     
    Webman нравится это.