Shadowman 939 Опубликовано 5 Мая 2010 Адаптировал для Соли от 19.04.2010 и поиграл немного. Есть один очень неприятный баг: если в диалоге выдачи квеста производится спавн чего-либо (любых объектов, и неважно, скриптовый или из аллспавн по поршню), то мод делает мгновенный сейв при выдаче мессаги о получении квеста, а спавн делается уже после сохранения. Сами понимаете: после загрузки такого сейва спавн из того диалога "в пролёте". Квест, понятное дело, - тоже - объекты ведь не заспавнились, а квест уже выдан. Чтобы такого не было, нужно делать сохранение функцией на таймерах АМК с задержкой на пару секунд, чтобы успел произойти спавн. Может, даже и побольше (секунд 5): спавн иногда бывает довольно мощный. Поделиться этим сообщением Ссылка на сообщение
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 Поделиться этим сообщением Ссылка на сообщение
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 Поделиться этим сообщением Ссылка на сообщение
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 Поделиться этим сообщением Ссылка на сообщение