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

Shoker Mod CS v[2.0]


*Shoker*

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

Я тоже столкнулся с такой ошибкой при разработке. Однако нет-пакет актора может заполняться не только в классе 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, который и так в эту функцию во всех случаях передаётся) и, на всякий случай, значение длины нет-пакета, при котором произошёл вылет.

 

Как временное решение от переполнения я принял запись во внешний файл всех лишних данных. Но может быть, более оптимально записывать всё-таки в основной сейв? К сожалению, даже перелопатив "школу моддинга" и, в частности, "справочник по функциям и классам", я пока не сумел понять, как я могу записать созданный мной новый нет-пакет, не привязанный к какому-либо игровому объекту.

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


Ссылка на сообщение
А вот 3-й вариант уже имеет решение и вполне пригодет. Исходная информация по универсальному безразмерному хранилищу уже давно была (см. топик Язык Lua. Общие вопросы программирования). Удобство и в том, что не только акторский нет-пакет разгружается, но и все что пожелает модмейкер.

Спасибо! Просмотрел почему-то, хотя изучал раздел вроде бы тщательно.

Уже интегрировал в мод, всё работает (пара уточнений ниже), потихоньку переношу сохраняемую информацию в новое хранилище.

 

*Shoker*, ведь тебе знакома тема про 'универсальное хранилище', самое время им заняться. Не так это и хлопотно и даже (при желании) совместимость с сэйвами можно сохранить.

*Shoker*, если брать "универсальное хранилище" отсюда (это то, что я нашёл), то для ЧН надо будет внести маленькую правку в se_stor.script - table.size(db.storehouse) заменить на собственный подсчёт размера таблицы. По крайней мере у меня в моде без расширений движка эта функция не существует. Ну и функция printf желательно должна быть универсальной, с обработкой любых возможных значений, иначе возможен вылет при передаче nil.

 

Друзья, я всё прекрасно понимаю, но пожалуйста такие вопросы обсуждайте в "Школе модинга". monk

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

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


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

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