Shadowman 939 Опубликовано 5 Мая 2010 Адаптировал для Соли от 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 Поделиться этим сообщением Ссылка на сообщение
Shadowman 939 Опубликовано 8 Мая 2010 (изменено) 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, правку по задержке ставить обязательно, иначе часть сейвов будет кривыми. А вот с именами файлов - непонятно, что не нравится в имени. Может, отладку какую поставить, чтобы видеть точно, что же там было за имя движку не нравится, что ли... Изменено 13 Мая 2010 пользователем Shadowman Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64 Поделиться этим сообщением Ссылка на сообщение
Shadowman 939 Опубликовано 13 Мая 2010 (изменено) Еще один глючок нашёл: "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-у отдельное спасибо за помощь по регэкспам The ReapeR, Символы "__" в имени сейва означают, что раньше сейв этот не сохранялся вовсе и выдавал матюк "Invalid filename" из-за недопустимого имени файла, а теперь - сохраняется, т.к. я недопустимые символы заменил на подчеркивание. Видимо, сообщение с цветовыми тэгами - вот и пишет, как есть (мы ведь не проверяем ничего кроме > < | ? * / \ : "). А я еще удивлялся, чего же не сохраняет, когда задание выполнено, хотя в коде вроде видно, что должен. Теперь понятно. Плохо, что цифры банить нельзя. Придется шаблон какой-то еще выдумывать для таких тэгов. Тут плохо еще то, что собственно какое задание-то выполнено и не видно из-за того, что длина строки обрезана (даже если и не обрезать, все одно в окне с сейвами не видно будет). Код выше обновил, пробуйте. Теперь сохранение правильно делается и после заданий, цветовой код отрезал камрад sapsan, высказав своё "фэ" такой фразой: string.gsub(save_param,"[%%][c][\[][%a%d%p%s]*[\]]","") The ReapeR, последний вариант точно рабочий! alexey-Выполнено ...Добыть часть тела монстра. - completed (начальная строка примерно такая: %c[255,160,160,160]Задание выполнено:/n%c[default]Добыть часть тела монстра) Изменено 13 Мая 2010 пользователем Shadowman Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64 Поделиться этим сообщением Ссылка на сообщение
Shadowman 939 Опубликовано 13 Мая 2010 (изменено) AK-103, http://www.wowwiki.com/Pattern_matching Шаблоны в Луа - по ним и сделано и работает. приведенный выше код превращает строку %c[255,160,160,160]Задание выполнено:/n%c[default]Добыть часть тела монстра в такую <Username>-Выполнено ...Добыть часть тела монстра Кстати, скорей всего ограничение длины строки можно и убрать: другое дело, что в игре окошко с сейвами узковато, чтоб показать даже 40 символов... Хотя, и это, наверное, поправимо. AK-103, просто было настроение Изменено 13 Мая 2010 пользователем Shadowman Железо: Intel Core i5 9400F / 16Gb DDR4 2400MHz / SSD NVMe M.2 Samsung 970 EVO Plus 256Gb / GF GTX 1050Ti 4Gb Ось: Win10x64 Поделиться этим сообщением Ссылка на сообщение