Kirgudu 1 204 Опубликовано 8 Июня 2012 Я тоже столкнулся с такой ошибкой при разработке. Однако нет-пакет актора может заполняться не только в классе actor_binder, но и в других, если они оттуда дополнительно вызываются (по крайней мере так исторически сделано в OGSM и, соответственно, других модах, на нём основанных; метод неправильный и я сейчас ищу замену). Соответственно, может быть полезно определить, в каком именно классе пишется слишком много данных. Я для себя модифицировал функцию set_save_marker так: function set_save_marker(p, mode, check, prefix, comment) comment = comment or "" if comment:len() > 0 then comment = " - "..comment end -- определяем ключ маркера. local result = "_"..prefix if check == true then if save_markers[result] == nil then abort("Trying to check without marker [%s]%s", result, comment) end if mode == "save" then local dif = p:w_tell() - save_markers[result] printf(result..": SAVE DIF: %s", dif) if dif >= 8000 then printf("WARNING! may be this is problem save point") end if dif >= 10240 then abort("You are saving too much [%s]%s", result, comment) end p:w_u16(dif) else local c_dif = p:r_tell() - save_markers[result] local dif = p:r_u16() if dif ~= c_dif then abort("INCORRECT LOAD [%s][%s].[%s]%s", dif, c_dif, result, comment) else printf(result..": LOAD DIF: %s", dif) end end return end if mode == "save" then local len = p:w_tell() printf(result..": set save marker: %s", len) save_markers[result] = len if len > 16000 then abort("You are saving too much [%s].[%s]%s", len, result, comment) end else printf(result..": set load marker: %s", p:r_tell()) save_markers[result] = p:r_tell() end end таким образом при вылете в лог будет записано название модуля (параметр prefix, который и так в эту функцию во всех случаях передаётся) и, на всякий случай, значение длины нет-пакета, при котором произошёл вылет. Как временное решение от переполнения я принял запись во внешний файл всех лишних данных. Но может быть, более оптимально записывать всё-таки в основной сейв? К сожалению, даже перелопатив "школу моддинга" и, в частности, "справочник по функциям и классам", я пока не сумел понять, как я могу записать созданный мной новый нет-пакет, не привязанный к какому-либо игровому объекту. Инструмент Поделиться этим сообщением Ссылка на сообщение
Kirgudu 1 204 Опубликовано 9 Июня 2012 (изменено) А вот 3-й вариант уже имеет решение и вполне пригодет. Исходная информация по универсальному безразмерному хранилищу уже давно была (см. топик Язык Lua. Общие вопросы программирования). Удобство и в том, что не только акторский нет-пакет разгружается, но и все что пожелает модмейкер. Спасибо! Просмотрел почему-то, хотя изучал раздел вроде бы тщательно. Уже интегрировал в мод, всё работает (пара уточнений ниже), потихоньку переношу сохраняемую информацию в новое хранилище. *Shoker*, ведь тебе знакома тема про 'универсальное хранилище', самое время им заняться. Не так это и хлопотно и даже (при желании) совместимость с сэйвами можно сохранить. *Shoker*, если брать "универсальное хранилище" отсюда (это то, что я нашёл), то для ЧН надо будет внести маленькую правку в se_stor.script - table.size(db.storehouse) заменить на собственный подсчёт размера таблицы. По крайней мере у меня в моде без расширений движка эта функция не существует. Ну и функция printf желательно должна быть универсальной, с обработкой любых возможных значений, иначе возможен вылет при передаче nil. Друзья, я всё прекрасно понимаю, но пожалуйста такие вопросы обсуждайте в "Школе модинга". monk Изменено 9 Июня 2012 пользователем monk Инструмент Поделиться этим сообщением Ссылка на сообщение