Перезагрузка сервера после изменения плагина

Сообщения
78
Реакции
65
Есть ли решения чтобы автоматически перезагружать сервер(через restart чтобы игрока не выкидывало) когда файл amxx изменяется?
А может есть способ применить изменения плагина иным образом?

Надоело постоянно:
1. Развернул hlds
2. Нажал ⬆ (вставился ранее написанный restart)
3. Нажал Enter

В инете не нашел готового.
Идеи такие: через отдельный плагин с server_cmd("restart") или инжектить dll в hlds или через модуль для сервера (как fakemeta и т.п.)

UPDATE:
Сделал простой плагин который решает эту проблему
Код:
/*
    Simple helper for plugin developers.
    It will auto-restart server once file change detected in pluigns folder.
*/

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "Restart On File Change"
#define VERSION "1.0"
#define AUTHOR "Lopol2010"

#define DIRECTORY_WATCH "addons/amxmodx/plugins/"
#define FREQUENCY 1.0

new Trie:g_files

public plugin_init(){
    register_plugin(PLUGIN,VERSION,AUTHOR);
    watch_files()
}

public ensure_trie_created(&Trie:trie)
{
    if(!trie)
    {
        trie = TrieCreate()
    }
}

public watching_task()
{
    new TrieIter:it = TrieIterCreate(g_files)
    do {
        static filename[256]
        new oldLastChange, lastChange
        TrieIterGetKey(it, filename, charsmax(filename))
        TrieIterGetCell(it, oldLastChange)
        
        lastChange = GetFileTime(filename, FileTime_LastChange)   
        
        if(oldLastChange != lastChange)
        {
            server_cmd("restart")
        }

        TrieIterNext(it)
    
    } while(!TrieIterEnded(it))
}

public watch_files()
{
    
    new dir[256]
    dir = DIRECTORY_WATCH
    ensure_trie_created(g_files)

    if(!dir_exists(dir))
    {
        server_print("ERROR: couldn't find directory %s", dir)
        return
    }
    if(!task_exists(0))
    {
        set_task_ex(FREQUENCY, "watching_task", 0, _, _, SetTask_Repeat)
    }

    new filename[50]
    new FileType:filetype
    new hdir = open_dir(dir, filename, charsmax(filename))

    if(hdir == 0)
    {
        server_print("ERROR: couldn't open directory %s", dir)
        return
    }

    do {
        if(filetype == FileType_File)
        {
            new fullPath[100]
            formatex(fullPath, strlen(dir) + strlen(filename), "%s%s", dir, filename)
            TrieSetCell(g_files, fullPath, GetFileTime(fullPath, FileTime_LastChange))
        }
    } while (next_file(hdir, filename, charsmax(filename), filetype))
    
    close_dir(hdir)
}
 
Последнее редактирование:
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
А зачем перезагружать?
 
Сообщения
459
Реакции
272
Помог
9 раз(а)
Зачем рестарт? Если ты изменяешь обычный amxmodx плагин достаточно смены карты, например смена карты на текущую с сохранением таймлефта, а если прям очень хочется автоматизации можно начиркать плагин проверяющий версии плагинов.
Натив get_plugin и луп по плагинам поможет в этом
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
Вроде можно было как-то плагины без смены карты перезапускать
 
Сообщения
78
Реакции
65
А зачем перезагружать?
Зачем рестарт? Если ты изменяешь обычный amxmodx плагин достаточно смены карты, например смена карты на текущую
Дак один фиг придется карту менять руками теми же действиями что и для restart? А мне то надо чтобы просто развернул CS а новая версия плагина уже работает.

а если прям очень хочется автоматизации можно начиркать плагин проверяющий версии плагинов.
Натив get_plugin и луп по плагинам поможет в этом
Выглядит как то что мне надо, попробую сделать

Вроде можно было как-то плагины без смены карты перезапускать
У меня тоже почему-то витала такая мысль, поискать еще что ли...
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
А мне то надо чтобы просто развернул CS а новая версия плагина уже работает.
как будете обрабатывать прекеш? Он же при старте только. Клиентам которые онлайн вы уже не загрузите. Такая же история со стартом сервера (ServerActivate), спавном ентити, и другими событиями, которые при инициализации карты.
5 Апр 2021
Ах да еще и амхх модули как будете подгружать, если он не загружен. Некоторые из них также хукают сервер активейт и тому подобные ивенты.
А так вполне реально сделать. загляните в исходы амхх (подсказка CPlugin файл или примерно так если памьять не изменяет).
 
Сообщения
78
Реакции
65
fantom, Не думал что кто-то копнет так глубоко :D я имел ввиду: развернул cs и видишь как клиент переподключается после команды restart на сервере, после чего новый плагин разумеется будет работать.

Возможно я нашел простое решение, сделать плагин который следит за изменением файла amxx через GetFileTime. И в момент изменения, делать server cmd (restart).

Но уже есть проблема. GetFileTime из стандартного file.inc как я не пытался возвращает -1. Кто-то знает в чем беда?
Сейчас еще нашел чей-то самописный file_utils модуль который содержит точно такую же функцию, но и он не работает. Поэтому буду пытаться этот модуль доработать, хотя не разбираюсь в C.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу