Kirgudu 1 217 Опубликовано 7 Октября 2015 Поделиться Опубликовано 7 Октября 2015 (изменено) @Romz, почему только Артосу? Он дал необходимый инструмент и пояснения, дальше тебе всё доступно, надо только понять принцип. Приведу пример из своей практики. Данные модуля проводников guiders.script, как и многих других, в ЧН сохраняются в нет-пакет актора, раздувая его без необходимости: function actor_binder:save(packet) ... guiders.save(packet) ... endДанных немного и в оригинале они представляют из себя простой набор переменных, одна из которых является плоской таблицей: function save(package) set_save_marker(package, "save", false, "guiders") package:w_stringZ(selected_point) package:w_bool(teleported_to_another_level) if temp_points_table[selected_point] then package:w_stringZ(temp_points_table[selected_point].level) package:w_stringZ(temp_points_table[selected_point].point) package:w_stringZ(temp_points_table[selected_point].look) else package:w_stringZ("nil") end set_save_marker(package, "save", true, "guiders") endОставим в стороне вероятную избыточность этих данных, так как перед нами не стоит сейчас цель оптимизировать всё. Надо всего лишь перенести эти данные из пстора актора в подключённое универсальное хранилище.Для этого переписываем метод save в модуле guiders примерно так: function save() local tSav = { teleported_to_another_level = teleported_to_another_level } if selected_point and selected_point:len() > 0 then tSav.selected_point = selected_point end if temp_points_table[selected_point] then tSav.temp_points_table = temp_points_table[selected_point] end SetVar("Guiders",tSav) endОсталось поправить вызов метода в биндере актора, удалив передачу в качестве аргумента нет-пакета актора: function actor_binder:save(packet) ... guiders.save() ... endАналогичным образом делаем правку чтения данных при загрузке.guiders.script было: function load() set_save_marker(package, "load", false, "guiders") selected_point = package:r_stringZ() teleported_to_another_level = package:r_bool() temp_points_table = {} local str = package:r_stringZ() if str~="nil" then temp_points_table[selected_point] = {} temp_points_table[selected_point].level = str temp_points_table[selected_point].point = package:r_stringZ() temp_points_table[selected_point].look = package:r_stringZ() end set_save_marker(package, "load", true, "guiders") end guiders.script стало: function load() local tSav = GetVar("Guiders",{}) if next(tSav) then DelVar("Guiders") else return end selected_point = tSav.selected_point or "" teleported_to_another_level = tSav.teleported_to_another_level temp_points_table = {} if tSav.temp_points_table then temp_points_table[selected_point] = table.clone(tSav.temp_points_table) --/ здесь table.clone() - аналог соотв. функции из lua_extension, полное копирование таблицы end end bind_stalker.script было: function actor_binder:load(packet) ... guiders.load(packet) ... end bind_stalker.script стало: function actor_binder:load(packet) ... guiders.load() ... endВсё это при условии, что методы SetVar, GetVar и DelVar добавлены в глобальном _g.script при внедрении комплекта se_stor. Если нет - можно воспользоваться методами se_stor.set() и se_stor.get(). Профит! Теперь все данные модуля guiders.script записываются в универсальном хранилище и читаются оттуда же. При этом нет необходимости записывать эти данные через чанки, а пстор актора освобождается от лишней информации. Изменено 8 Октября 2015 пользователем Kirgudu Добавлено Murarius, 7 Октября 2015 Люблю такие посты - и полезные, и толково оформленные! 1 3 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 7 Октября 2015 Поделиться Опубликовано 7 Октября 2015 @Kirgudu,А как с этим быть? Кроме того, в se_stor присутствует для записи local function save_storehouse() и local function save_chunks() но вот для загрузки имеется только local function read_chunks() И вот этот момент непонятен Этот вылет ловлю, когда пытаюсь закоментить вот этот кусок кода в lua_helper.script local log = function(fmt,...) _G.log(sModule..":"..tostring(fmt),...) end if to_log and type(string.exformat) == 'function' then log = function(fmt,...) to_log(string.exformat(fmt,...)) end end local printf = function(...) log(...) end --< конкретно вот эту строчку Сразу уточню - printf и log у меня и так работают. Поэтому хотел отрубить самопальные логи на основе get_console():execute Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 (изменено) @Romz, я сейчас с мобильного вошёл, посмотреть не могу. ЕМНИП, при загрузке данные (кроме чанков) читаются в другом месте. Глянь функцию read_tail_packet (как-то так) и откуда она вызывается.Если надо будет, уточню завтра.Что же касается вылета, видать твоя функция printf вовсе не так уж везде доступна. И при удалении, как ты говоришь, "самопальной" скрипту становится нечего вызывать.Посмотрел. Да, так и есть, я правильно запомнил. Во время загрузки данные в глобальную таблицу хранилища читаются функцией read_tail_packet, которая вызывается при регистрации каждого кастомного объекта, используемого для сохранения данных в файле. Изменено 8 Октября 2015 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 Что же касается вылета, видать твоя функция printf вовсе не так уж везде доступна. И при удалении, как ты говоришь, "самопальной" скрипту становится нечего вызывать. Вот это-то и непонятно... Она срабатывает во всех скриптах, кроме этого. Она в движке починена, вообще-то. И по всем скриптам Артоса я заменил его to_log на printf, и в остальных она нормально работает... Скорее всего, где-то в этом скрипте она неявно переопределяется... Поэкспериментирую (или забью). Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 Честно говоря, я тоже других переопределений prinf (кроме как в комментируемой тобой строчке) не нашёл, не могу без предметного теста сказать, откуда берётся эта ошибка. Да пусть у тебя в его модулях выводится через консоль, какая разница? На самом деле, после отладки вывод в лог вообще можно убрать. Инструмент Ссылка на комментарий
Romz 142 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 (изменено) Ок. Я честно пытался разобраться, как этой заразой пользоваться, но чегось не понял ничего. Перестраивать методы сохранения данных не вижу необходимости, поэтому давайте разберёмся с чанками. Вылет ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [error]ABORT CALLED: se_stor:save_chunks:=[weathers],file=[level_weathers]~not_exist:<Error!> ATTENTION! Game is interrupted! The information in lines above. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Log file has been saved successfully! ! [SCRIPT ERROR]: c:\gam\s-cop\gamedata\scripts\se_stor.script:113: attempt to call global 'exit' (a nil value) FATAL ERROR [error]Expression : fatal error [error]Function : CScriptEngine::lua_error [error]File : ..\xrServerEntities\script_engine.cpp [error]Line : 193 [error]Description : <no expression> [error]Arguments : LUA error: c:\gam\s-cop\gamedata\scripts\se_stor.script:113: attempt to call global 'exit' (a nil value) присутствует по-прежнему, но только из-за того, что он в abort принудительно вызывается. tPkChunks["weathers" ] = { file = "level_weathers" } --/ погода tPkChunks["psy_antenna" ] = { file = "sr_psy_antenna" } --/ зоны пси-излучения tPkChunks["treasure_mgr"] = { file = "treasure_manager"} --/ тайники-нычки tPkChunks["task_mgr" ] = { file = "task_manager" } --/ квесты-задания tPkChunks["bind_actor" ] = { file = "bind_stalker" } --/ ... Все файлы присутствуют, именно так называются, методы save и load в них присутствуют. Файл bind_stalker Внешний доступ перенесён из примера без изменений. Методы save и load изменены ---------------------------------------------------------------------------------------------------------------------- function actor_binder:save(packet) set_save_marker(...) local size = packet:w_tell() --/#+# for debug --/ ... все последующие строки --/ ... все предыдущие строки -- self.weather_manager:save(packet) --/ ... все последующие строки --/ ... все предыдущие строки --/#+# вызов сохранений во внешних модулях ------------------------ if se_stor then if to_log then to_log(script_name()..":save:size=["..(packet:w_tell() - size).."]") end --/#~# if type(se_stor.save) == 'function' then --/ 'прямой' вызов se_stor.save() end end --/<--------------------------------------------------------------- set_save_marker(...) end --/#+# сохранения данных из внешних модулей: ------------------------ function actor_binder:ext_save(pk) self.weather_manager:save(pk) self.actor_detector:save(pk) --/#?# а нужно? end ---------------------------------------------------------------------------------------------------------------------- function actor_binder:load(reader) set_save_marker(...) local size = reader:r_tell() --/#+# for debug --/ ... все последующие строки --/ ... все предыдущие строки -- self.weather_manager:load(packet) --/ ... все последующие строки --/ ... все предыдущие строки --/#+# вызов загрузки во внешних модулях -------------------------- if se_stor then if to_log then to_log(script_name()..":load:size=["..(reader:r_tell() - size).."]") end --/#~# if type(se_stor.save) == 'function' then --/ 'прямой' вызов se_stor.load() end end --/<--------------------------------------------------------------- set_save_marker(...) end --/#+# загрузка данных во внешние модули: --------------------------- function actor_binder:ext_load(pk) self.weather_manager:load(pk) -- self.actor_detector:load(pk) --/#?# а нужно? end --/ ... все последующие строки actor_detector закомментирован, потому что его нет в bind_stalker ЗП, в отличие от ТЧ В se_stor обращение к файлам, которое вызывает эту ошибку, выглядит for name,v in pairs(tPkChunks) do local func = _G[v.file] and _G[v.file].save Что я сделал не так применительно к ЗП? Кстати, собственно se_stor.save и se_stor.load, которые и вызываются из методов save и load bind_stalker выглядят --/ ----------------------------------------------------------------- --/ SAVE: вызов сохранения хранилища (from 'actor_binder:save') --/ ----------------------------------------------------------------- function save(e) --/< from 'actor_saved' if event then --/#+# опционально: для сохранения локальных данных внешних модулей в общую таблицу db.storehouse event("storage_save"):trigger() --/#!#> генерируем сигнал события: 'запись в хранилище' end save_storehouse() --/ saving db.storehouse end --/ ----------------------------------------------------------------- --/ LOAD: вызов чтения хранилища внешними модулями (from 'actor_binder:load') --/ ----------------------------------------------------------------- function load(e) --/< from 'actor_loaded' read_chunks()--/ чтение данных внешними модулями if event then --/#+# опционально: для чтения локальных данных внешних модулей из общей таблицы db.storehouse event("storage_load"):trigger() --/#!#> генерируем сигнал события: 'чтение из хранилища' end end То есть, сохраняем в таблицу, а читаем - из чанков. В read_chunks эта самая storehouse никак не упоминается. Не, можно забить, конечно, оставить ext_save и ext_load пустой и раскомментировать self.weather_manager, но охота же понять, как пользоваться данным инструментом, хотя бы на самом элементарном уровне. Изменено 8 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
abramcumner 1 157 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 Все файлы присутствуют, именно так называются, методы save и load в них присутствуют.Точно присутствуют? В оригинальном ЗПшном level_weathers.script нет функции save. Ссылка на комментарий
Kirgudu 1 217 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 (изменено) @abramcumner, об этом я уже писал здесь. @Romz, если подождёшь несколько дней, ориентировочно со вторника по пятницу на следующей неделе я постараюсь подготовить рабочий пример встраивания в чистый ЗП. Все файлы присутствуют, именно так называются, методы save и load в них присутствуют. В модуле level_weathers нет публичных функций save и load. Ну нету! Есть save и load, описанные только как методы класса WeatherManager. se_stor же ни о каких классах в подключаемых для сохранения модулях не знает. Поэтому тупо пользоваться примером из se_stor нельзя. Подробнее смотри по ссылке выше. Изменено 8 Октября 2015 пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 (изменено) @Kirgudu, То есть, это только для внутреннего, так сказать, пользования? Дык se_stor же, вроде, пытается методы тупо напрямую вызывать? Типа level_weathers.load? Изменено 8 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 (изменено) @Romz, а мы с @abramcumner тебе о чём? Похоже, ты просто не понимаешь разницы между публичной функцией модуля и методом класса в этом модуле. Допустим, есть у нас некий модуль module.script. В нём может быть это: function func() -- do something end и это: class "MyClass" function MyClass:__init() -- do something end function MyClass:func() -- do something end Чтобы вызвать функцию func из другого модуля в первом варианте, достаточно написать: module.func() Чтобы сделать то же самое во втором варианте, потребуется больше действий: local my_class = module.MyClass() --/ тут получили экземпляр класса my_class:func() --/ и только тут дёрнули метод se_stor умеет вызывать только публичные функции, как описано в варианте 1.Дык se_stor же, вроде, пытается методы тупо напрямую вызывать? Типа level_weathers.load?Да! Но их там нет, так как save и load в этом модуле существуют только в контексте класса. Изменено 8 Октября 2015 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 (изменено) Похоже, ты просто не понимаешь разницы между публичной функцией модуля и методом класса в этом модуле Ну есть такое... Я думал, они равнозначно вызываются... Теперь понятно. В treasure_manager и task_manager тогда тоже нет публичных save и load. Но зато в них присутствуют такие функции, как get_чтототам_manager, через которые их save и load в bind_stalker и вызываются... И в level_weathers тоже такая есть Поправка насчёт weather_manager. Его сохранение/загрузку Artos прописал и в таблицу чанков, и в доп. методы ext_save и ext_load. Это, понятное дело, избыточно (разве только в ЗП в этом модуле есть публичные save и load). Поэтому делаем что-то одно - либо оставляем в ext_save/load и убираем из таблицы чанков, либо убираем и из таблицы и из ext_save/load, но возвращаем в save/load. То есть, всё, что не имеет публичных вызовов save и load убираем из чанков.А если есть необходимость хранить их отдельно, переносим их вызовы save и load из actor_binder:save и actor_binder:load в ext_save и ext_load. Я правильно понял? Изменено 8 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 То есть, всё, что не имеет публичных вызовов save и load убираем из чанков. А что имеет - добавляем (так как список в примере se_stor неточный). А если есть необходимость хранить их отдельно, переносим их вызовы save и load из actor_binder:save и actor_binder:load в ext_save и ext_load. Примерно так. В примере из se_stor такие модули уже указаны в ext_save и ext_load. Надо только актуализировать список согласно реалиям ЗП. Либо - переделать таки эти модули на хранение данных в глобальной таблице хранилища, как я уже расписывал выше. Точнее сейчас сказать не могу, если это требуется - жди неделю. 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 8 Октября 2015 Поделиться Опубликовано 8 Октября 2015 (изменено) Либо - переделать таки эти модули на хранение данных в глобальной таблице хранилища, как я уже расписывал выше. Точнее сейчас сказать не могу, если это требуется - жди неделю. Подожду, конечно. А пока попробую сделать, как выше написал. Собственно, похоже, что save и load в явном виде осталось только в sr_psy_antenna, xr_sound и xr_statistic, остальное - исключительно через классы... Тогда имеет смысл, наверное, через se_stor сохранять только то, что нужно сохранять в модах. А от оригинала - оставить, как было, раз оно и так нормально сохраняется. Ну или наоборот, повыносить часть секций сохранений в se_stor, чтоб они уже с гарантией не загрузились на чистой игре. Проверил, пока только с sr_psy_antenna в чанках и self.weather_manager в ext_save/load. НИ началась нормально. Игра сохранилась и загрузилась без проблем, вроде. Именные сохранения тоже. Единственное, set load marker: перевалил за 8000, это размер сохранения он считает, как я понял, по поводу чего он и начал ругаться, что, мол проблемное сохранение. Хотя, собственно размер сохранения и не увеличился. Изменено 8 Октября 2015 пользователем Romz 1 Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 9 Октября 2015 Поделиться Опубликовано 9 Октября 2015 (изменено) @Romz, скорее всего, даные self.weather_manager у тебя сейчас не сохраняются. И вот почему. Методы ext_save/load вызываются из публичных (добавляемых комплектом se_stor) bind_stalker.save/load, которые, в свою очередь, должны вызываться при сохранении тех самых чанков. Но сейчас ты оставил в таблице tPkChunks, судя по всему, только sr_psy_antenna. ИМХО, для описанного тобой выше частного случая всё должно выглядеть так: bind_stalker.script function actor_binder:ext_save(pk) self.weather_manager:save(pk) end function actor_binder:ext_load(pk) self.weather_manager:load(pk) endтам же обязательно должно быть сделано (как и сказано в инструкции) это: --[[ --/#x# отключено! function actor_init (npc) --npc:bind_object(actor_binder(npc)) end --]] --/ ----------------------------------------------------------------- --/#+# организуем внешний доступ к биндеру актора: --/ ----------------------------------------------------------------- function actor_init(npc) _G.g_bind_actor = this.actor_binder(npc) npc:bind_object(g_bind_actor) end function save(...) _G.g_bind_actor:ext_save(...) end function load(...) _G.g_bind_actor:ext_load(...) end se_stor.script local tPkChunks = {} --/ таблица нет-пакетов с чанками внешних модулей (option for SIMBION mod) if iSSVer < 8 then --/ for SHoC -- ... для ЗП можно оставить без изменений elseif iSSVer < 12 then --/ for CS -- ... для ЗП можно оставить без изменений else --/ for CoP tPkChunks["bind_actor" ] = { file = "bind_stalker" } --/ ext_save/load в bind_stalker.script tPkChunks["psy_antenna" ] = { file = "sr_psy_antenna" } --/ зоны пси-излучения endСобственно, ext_save/load были сделаны как раз для того, чтобы данные внешних модулей, у которых отсутствуют публичные save/load, но есть класс с этими методами, инициализируемый в биндере актора, с минимальными изменениями перенести из нет-пакета актора в чанки.Почему у тебя вырос объём данных, записываемых в нет-пакет актора, сказать не могу, тут надо смотреть, что ты пишешь. Если беспокоит или просто интересно, для анализа организуй сам дополнительный вывод в лог соответствующей информации, это не сложно. Но, в принципе, в случае ЗП объем 8000 байт не страшен, в ЗП и ЧН безопасно записывать в нет-пакет до 16000-16200 байт. Это, кстати, учитывается в механизме se_stor. Изменено 9 Октября 2015 пользователем Kirgudu 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 9 Октября 2015 Поделиться Опубликовано 9 Октября 2015 (изменено) @Kirgudu, Так и сделал. Только в таблицу чанков добавил tPkChunks["xr_statistic"] = { file = "xr_statistic" } --/ статистикаНе знаю зачем. Чтоб было и для эксперимента. Плюс, переношу вот эти вызовы. --[[ release_body_manager.get_release_body_manager():save(packet) -- AtmosFear if atmosfear then self.atmosfear:save(packet) self.psi_storm_manager:save(packet) self.fallout_manager:save(packet) end -- End AtmosFear self.surge_manager:save(packet) -- treasure_manager.get_treasure_manager():save(packet) -- task_manager.get_task_manager():save(packet) -----------------------------makdm_start----------------------------- if art_sp_mgr then art_sp_mgr.get_art_spawner_manager():save( packet ) end ]] -----------------------------makdm_end------------------------------- Пока, с целью эксперимента, чтобы проверить, что можно безболезненно вынести во внешние сохранения. Почему у тебя вырос объём данных, записываемых в нет-пакет актора, сказать не могу, тут надо смотреть, что ты пишешь. Если беспокоит или просто интересно, для анализа организуй сам дополнительный вывод в лог соответствующей информации, это не сложно. Но, в принципе, в случае ЗП объем 8000 байт не страшен, в ЗП и ЧН безопасно записывать в нет-пакет до 16000-16200 байт. Это, кстати, учитывается в механизме se_stor.Сам объём не вырос, судя по всему. Там, похоже, просто номер метки сохранения увеличывается, скачком и единомоментно. Вот пример лога ... c:\gam\s-cop\se_stor:(298):read_tail_packet:chunk_key=[xr_statistic],chunk_size=[715]:(717) c:\gam\s-cop\se_stor:(298):read_tail_packet:chunk_key=[psy_antenna],chunk_size=[3]:(5) c:\gam\s-cop\se_stor:(298):read_tail_packet:chunk_key=[bind_actor],chunk_size=[80]:(82) c:\gam\s-cop\se_stor:(315):~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c:\gam\s-cop\se_stor:(316):Load Storehouse: size(1)=[856], keys=[1] :BuildSav=[-1] c:\gam\s-cop\se_stor:(317):~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * Game 0 is successfully loaded from file 'c:\users\public\documents\stalker-cop\savedgames\0.scop' (3.088s) * phase time: 3041 ms * phase cmem: 448435 K _se_actor: set save marker: 8795 _se_actor: SAVE DIF: 1 _se_level_changer: set save marker: 268 _se_level_changer: SAVE DIF: 26 _se_level_changer: set save marker: 273 _se_level_changer: SAVE DIF: 26 ... ... * [Loading IB] 760575 indices, 1485 Kb * phase time: 1282 ms * phase cmem: 552458 K * phase time: 170 ms * phase cmem: 561488 K * [DETAILS] VertexConsts(256), Batch(61) * [DETAILS] 10126 v(20), 5368 p * [DETAILS] Batch(61), VB(197K), IB(31K) * phase time: 71 ms * phase cmem: 561549 K * Loading HOM: c:\gam\s-cop\gamedata\levels\zaton\level.hom * phase time: 1763 ms * phase cmem: 562359 K * phase time: 24 ms * phase cmem: 562359 K * phase time: 21 ms * phase cmem: 562359 K * t-report - base: 2125, 1050208 K * t-report - lmap: 16, 16386 K _se_actor: set save marker: 8795 _se_actor: SAVE DIF: 1 _se_level_changer: set save marker: 268 _se_level_changer: SAVE DIF: 26 _se_level_changer: set save marker: 273 _se_level_changer: SAVE DIF: 26 ... ... * [win32]: free[1977620 K], reserved[84592 K], committed[2132028 K] * [ D3D ]: textures[1141354 K] * [x-ray]: process heap[628826 K], game lua[25658 K], render[7655 K] * [x-ray]: economy: strings[28744 K], smem[319117 K] * [win32]: free[1978452 K], reserved[84920 K], committed[2130868 K] * [ D3D ]: textures[1142378 K] * [x-ray]: process heap[628585 K], game lua[25766 K], render[7656 K] * [x-ray]: economy: strings[28744 K], smem[319117 K] _actor_binder: set save marker: 126 _Crelease_body: set save marker: 404 _Crelease_body: SAVE DIF: 4 _AtmosFear: set save marker: 410 _AtmosFear: SAVE DIF: 217 _PsiStorm: set save marker: 629 _PsiStorm: SAVE DIF: 14 _Fallout: set save marker: 645 _Fallout: SAVE DIF: 18 _SurgeHide: set save marker: 665 _SurgeHide: SAVE DIF: 14 _sr_psy_antenna: set save marker: 681 _sr_psy_antenna: SAVE DIF: 1 _sound_actor_save: set save marker: 685 _sound_actor_save: SAVE DIF: 3102 _CTreasureManager: set save marker: 4508 _CTreasureManager: SAVE DIF: 3582 _CRandomTask: set save marker: 8093 _CGeneralTask: set save marker: 8115 _CGeneralTask: SAVE DIF: 64 _CGeneralTask: set save marker: 8203 _CGeneralTask: SAVE DIF: 68 _CGeneralTask: set save marker: 8295 _CGeneralTask: SAVE DIF: 68 _CGeneralTask: set save marker: 8386 _CGeneralTask: SAVE DIF: 66 _CGeneralTask: set save marker: 8474 _CGeneralTask: SAVE DIF: 64 _CRandomTask: SAVE DIF: 447 _AS_manager: set save marker: 8546 _AS_manager: SAVE DIF: 8 c:\gam\s-cop\bind_stalker:(701):bind_stalker:save:size=[8430] c:\gam\s-cop\se_stor:(117):save_storehouse:size=[0/nil]>) _sr_psy_antenna: set save marker: 2 _sr_psy_antenna: SAVE DIF: 1 _WeatherManager: set save marker: 2 _WeatherManager: SAVE DIF: 78 c:\gam\s-cop\se_stor:(165):save_storehouse:key[xr_statistic],type_key[string],type_chunk[boolean]~not saved:<Warning!> c:\gam\s-cop\se_stor:(159):save_storehouse:chunk_name=[psy_antenna],chunk_size=[3],len=[19]=>[19] c:\gam\s-cop\se_stor:(159):save_storehouse:chunk_name=[bind_actor],chunk_size=[80],len=[95]=>[114] c:\gam\s-cop\se_stor:(237):~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c:\gam\s-cop\se_stor:(238):Save Storehouse: size(1)=[125], keys=[1] : BuildSav=[-1] c:\gam\s-cop\se_stor:(239):~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ _actor_binder: SAVE DIF: 8430 WARNING! may be this is problem save point _anomaly_zone_binder: set save marker: 242 _anomaly_zone_binder: SAVE DIF: 34 _anomaly_zone_binder: set save marker: 284 ... DIF изменяется в небольшом диапазоне, а вот save_marker сразу скачком. А сам размер сохранения, физический, практически не изменился... Изменено 9 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 9 Октября 2015 Поделиться Опубликовано 9 Октября 2015 Ну так это se_actor, там свои данные пишутся. Сейчас тебя больше должно интересовать всё, что касается сохранения в bind_stalker, а там, как я смотрю, порядок. «SAVE DIF» показывает объём записанных за одно действие данных, а «set save marker» - результирующий объём нет-пакета. Вроде всё сходится. Единственное, что слегка настораживает: c:\gam\s-cop\se_stor:(165):save_storehouse:key[xr_statistic],type_key[string],type_chunk[boolean]~not saved:<Warning!> Я бы на твоём месте глянул, что пишется в этом модуле и почему se_stor выдаёт это предупреждение. Не факт, что что-то критичное, но удостовериться в этом надо. Инструмент Ссылка на комментарий
Romz 142 Опубликовано 9 Октября 2015 Поделиться Опубликовано 9 Октября 2015 (изменено) Я бы на твоём месте глянул, что пишется в этом модуле и почему se_stor выдаёт это предупреждение. Собственно, function save(package) package:w_u16(actor_statistic.surges) package:w_u16(actor_statistic.completed_quests) package:w_u32(actor_statistic.killed_monsters) package:w_u32(actor_statistic.killed_stalkers) package:w_u16(actor_statistic.founded_secrets) package:w_u16(actor_statistic.artefacts_founded) package:w_u32(actor_statistic.best_monster_rank) package:w_stringZ(tostring(actor_statistic.best_monster)) package:w_stringZ(tostring(actor_statistic.favorite_weapon_sect)) local i = 0 for k,v in pairs(weapons_table) do i = i + 1 end package:w_u8(i) for k,v in pairs(weapons_table) do package:w_stringZ(tostring(k)) package:w_float(v) end i = 0 for k,v in pairs(artefacts_table) do i = i + 1 end package:w_u8(i) for k,v in pairs(artefacts_table) do package:w_stringZ(tostring(k)) package:w_bool(v) end i = 0 for k,v in pairs(taken_artefacts) do i = i + 1 end package:w_u8(i) for k,v in pairs(taken_artefacts) do package:w_u32(k) end end function load(package) actor_statistic = {} actor_statistic.surges = package:r_u16() actor_statistic.completed_quests = package:r_u16() actor_statistic.killed_monsters = package:r_u32() actor_statistic.killed_stalkers = package:r_u32() actor_statistic.founded_secrets = package:r_u16() actor_statistic.artefacts_founded = package:r_u16() actor_statistic.best_monster_rank = package:r_u32() local str = package:r_stringZ() if(str~="nil") then actor_statistic.best_monster = str end str = package:r_stringZ() if(str~="nil") then actor_statistic.favorite_weapon_sect = str end weapons_table = {} local n = package:r_u8() for i = 1,n do local k = package:r_stringZ() local v = package:r_float() weapons_table[k] = v end artefacts_table = {} n = package:r_u8() for i = 1,n do log("n "..tostring(n)) local k = package:r_stringZ() local v = package:r_bool() artefacts_table[k] = v end taken_artefacts = {} n = package:r_u8() for i = 1,n do local k = package:r_u32() taken_artefacts[k] = k end end Кстати, в нём нет классов. А именно это предупреждение в se_stor выдаётся, если не проходит условие if type(key) == 'string' and key ~= "" and type(ch_pk) == 'userdata' and type(ch_pk.r_eof) == 'function' then ... ... else to_log("save_storehouse:key[%s],type_key[%s],type_chunk[%s]~not saved:<%s>", key, type(key), type(ch_pk), "Warning!") --/#~# а там, как видно, тип чанка, почему-то, получился boolean Кстати, может быть из-за совпадения имени чанка с именем файла. Сейчас переименовал вот так tPkChunks["xr_stat" ] = { file = "xr_statistic" } --/ статистика и, как результат c:\gam\s-cop\se_stor:(159):save_storehouse:chunk_name=[xr_stat],chunk_size=[709],len=[721]=>[721] c:\gam\s-cop\se_stor:(159):save_storehouse:chunk_name=[psy_antenna],chunk_size=[3],len=[19]=>[740] c:\gam\s-cop\se_stor:(159):save_storehouse:chunk_name=[bind_actor],chunk_size=[80],len=[95]=>[835] c:\gam\s-cop\se_stor:(237):~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ c:\gam\s-cop\se_stor:(238):Save Storehouse: size(1)=[845], keys=[1] : BuildSav=[-1] c:\gam\s-cop\se_stor:(239):~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ _actor_binder: SAVE DIF: 8457 WARNING! may be this is problem save point Изменено 9 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
Kirgudu 1 217 Опубликовано 9 Октября 2015 Поделиться Опубликовано 9 Октября 2015 Что странно, никаких предпосылок к этому я не вижу. Имя чанка никак не участвует в формировании технологического нет-пакета (только как ключ таблицы), а ошибка в логе говорит о том, что вместо нет-пакета во временную таблицу было записано значение типа boolean. Чего быть не может, судя по коду se_stor.Ну да ладно. 1 Инструмент Ссылка на комментарий
Romz 142 Опубликовано 9 Октября 2015 Поделиться Опубликовано 9 Октября 2015 (изменено) Вроде, взлетело. Вот так выглядит у меня сейчас else --/ for CoP tPkChunks["psy_antenna" ] = { file = "sr_psy_antenna" } --/ зоны пси-излучения tPkChunks["xr_stat" ] = { file = "xr_statistic" } --/ статистика tPkChunks["bind_actor" ] = { file = "bind_stalker" } --/ ... end и вот такой self.weather_manager:save(packet) release_body_manager.get_release_body_manager():save(packet) -- AtmosFear if atmosfear then self.atmosfear:save(packet) self.psi_storm_manager:save(packet) self.fallout_manager:save(packet) end -- End AtmosFear self.surge_manager:save(packet) xr_sound.actor_save(packet) treasure_manager.get_treasure_manager():save(packet) task_manager.get_task_manager():save(packet) -----------------------------makdm_start----------------------------- if art_sp_mgr then art_sp_mgr.get_art_spawner_manager():save( packet ) end -----------------------------makdm_end------------------------------- То есть, присутствуют и вызовы из оригинала, и вызовы из модов. Всё загружается и сохраняется. Скрипты вроде не слетели. Да, и set_save_marker перестал ругаться на размер сохранения. Изменено 9 Октября 2015 пользователем Romz 1 Шаман - СисАдмин Всяко-разно: для ЧН Ссылка на комментарий
jenek96 48 Опубликовано 9 Октября 2015 Поделиться Опубликовано 9 Октября 2015 Всем привет. Столкнулся с таким логом : Expression : assertion failed Function : CUIXmlInit::InitText File : D:\prog_repository\sources\trunk\xrGame\ui\UIXmlInit.cpp Line : 315 Description : pTmpFont Ребят подскажите как его исправить. Желательно в ЛС. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти