Перейти к контенту

Autosave


utak3r

Рекомендуемые сообщения

Адаптировал для Соли от 19.04.2010 и поиграл немного.

Есть один очень неприятный баг: если в диалоге выдачи квеста производится спавн чего-либо (любых объектов, и неважно, скриптовый или из аллспавн по поршню), то мод делает мгновенный сейв при выдаче мессаги о получении квеста, а спавн делается уже после сохранения. Сами понимаете: после загрузки такого сейва спавн из того диалога "в пролёте". Квест, понятное дело, - тоже - объекты ведь не заспавнились, а квест уже выдан.

Чтобы такого не было, нужно делать сохранение функцией на таймерах АМК с задержкой на пару секунд, чтобы успел произойти спавн. Может, даже и побольше (секунд 5): спавн иногда бывает довольно мощный.

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

Поделиться этим сообщением


Ссылка на сообщение

DimOriN, у меня немного другой вариант :)

Отвечаю на вопрос V92

...можешь сделать чтобы сохранка делалась с этой самой задержкой?

В

amk.script в конце таблички local func_by_string = {} дописываем:

    func_by_string["autosave"] = function (params_string)
        u3_utils.savegame(params_string)
    end

И в news_manager.script вот этот кусок

    if type == "new" or type == "update" then
        u3_utils.savegame(news_text)        
    end
    if type == "complete" then
        u3_utils.savegame(news_text.." - completed")        
    end

меняем на

    if type == "new" or type == "update" then
        amk.start_timer("autosave", 3, news_text)
    end
    if type == "complete" then
        amk.start_timer("autosave", 3, news_text.." - completed")
    end

Теперь сейв делается с задержкой в 3 сек (в параметрах запуска таймера можно вместо 3 сек поставить сколько нужно, если у кого не успевает срабатывать спавн за 3 сек).

 

 

ЗЫ: То, что я привел - это для текущей версии Солянки (таблица func_by_string = {} была введена Сапсаном в Соль от 22.01, кажется...)

Т.е. если таковой у вас не имеется - делать как предложил DimOriN :)

Тут нужна короткая задержка - всего несколько секунд: видимо, задавать нужно десятичной дробью в параметре <минуты>

 

И еще небольшое дополнение. Я так понимаю, что имя сейва не должно превышать 64 символа.

Поэтому в скрипте u3_utils.script ф-цию savegame(save_name)

(см. постом ниже, там еще правка по некорректным символам с имени сейва)

 

Пока до конца не понял, в чем проблема, но при попытках автосохраниться в некоторых случаях в логе появляется строчка "Invalid filename", после чего неминуемо следует либо вылет, либо зависание. Сейв с именем ровно в 64 символа у меня есть, сделанный этим самым автосейвом - значит, проблема не здесь. А вот где - х.з.

 

The ReapeR, правку по задержке ставить обязательно, иначе часть сейвов будет кривыми. А вот с именами файлов - непонятно, что не нравится в имени.

Может, отладку какую поставить, чтобы видеть точно, что же там было за имя движку не нравится, что ли...

Изменено пользователем Shadowman

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

Поделиться этим сообщением


Ссылка на сообщение

Еще один глючок нашёл: "Invalid filename" в лог выдаётся если то сообщение, которое используется для имени файла, содержит кавычки (Например: Поговорить с поваром на базе "Свободы").

Естественно, перед попыткой сохранения с таким именем нужно удалять предварительно кавычки скриптом. Чуть позже выложу правку.

 

в скрипте u3_utils.script ф-цию savegame(save_name)

function savegame(save_name)
    if save_name == nil then
        printf("Trying to save a game without any name!")
        return false
    end
    if isGameOn() then
        local save_param = user_name().."-"..save_name
        save_param = string.gsub(save_param,"[><|?*/\\:\"%b/n]",".")
        save_param = string.gsub(save_param,"[%%][c][\[][%a%d%p%s]*[\]]","")
        save_param = string.gsub(save_param,"Задание выполнено","Выполнено ")
        if string.len(save_param)>64 then
            save_param = string.sub(save_param,1,64)
        end
        get_console():execute("save "..save_param)
    end
end

 

 

sapsan-у отдельное спасибо за помощь по регэкспам :good:

 

The ReapeR, :)

Символы "__" в имени сейва означают, что раньше сейв этот не сохранялся вовсе и выдавал матюк "Invalid filename" из-за недопустимого имени файла, а теперь - сохраняется, т.к. я недопустимые символы заменил на подчеркивание. Видимо, сообщение с цветовыми тэгами - вот и пишет, как есть (мы ведь не проверяем ничего кроме > < | ? * / \ : ").

А я еще удивлялся, чего же не сохраняет, когда задание выполнено, хотя в коде вроде видно, что должен. Теперь понятно.

Плохо, что цифры банить нельзя. Придется шаблон какой-то еще выдумывать для таких тэгов.

Тут плохо еще то, что собственно какое задание-то выполнено и не видно из-за того, что длина строки обрезана (даже если и не обрезать, все одно в окне с сейвами не видно будет).

 

Код выше обновил, пробуйте.

Теперь сохранение правильно делается и после заданий, цветовой код отрезал камрад sapsan, высказав своё "фэ" такой фразой: string.gsub(save_param,"[%%][c][\[][%a%d%p%s]*[\]]","") :rolleyes:

 

The ReapeR, последний вариант точно рабочий!

alexey-Выполнено ...Добыть часть тела монстра. - completed

(начальная строка примерно такая:

%c[255,160,160,160]Задание выполнено:/n%c[default]Добыть часть тела монстра)

Изменено пользователем Shadowman

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

Поделиться этим сообщением


Ссылка на сообщение

AK-103, http://www.wowwiki.com/Pattern_matching

Шаблоны в Луа - по ним и сделано и работает.

приведенный выше код превращает строку

%c[255,160,160,160]Задание выполнено:/n%c[default]Добыть часть тела монстра

в такую

<Username>-Выполнено ...Добыть часть тела монстра

 

Кстати, скорей всего ограничение длины строки можно и убрать: другое дело, что в игре окошко с сейвами узковато, чтоб показать даже 40 символов...

Хотя, и это, наверное, поправимо.

 

AK-103, просто было настроение ;)

Изменено пользователем Shadowman

Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...