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

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

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

 

Изменено пользователем Kirgudu
Добавлено  Murarius,

Люблю такие посты - и полезные, и толково оформленные!

  • Спасибо 1
  • Полезно 3
Ссылка на комментарий

@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

 

Шаман - СисАдмин

Всяко-разно: для ЧН

Ссылка на комментарий

@Romz, я сейчас с мобильного вошёл, посмотреть не могу. ЕМНИП, при загрузке данные (кроме чанков) читаются в другом месте. Глянь функцию read_tail_packet (как-то так) и откуда она вызывается.
Если надо будет, уточню завтра.
Что же касается вылета, видать твоя функция printf вовсе не так уж везде доступна. И при удалении, как ты говоришь, "самопальной" скрипту становится нечего вызывать.

Посмотрел. Да, так и есть, я правильно запомнил. Во время загрузки данные в глобальную таблицу хранилища читаются функцией read_tail_packet, которая вызывается при регистрации каждого кастомного объекта, используемого для сохранения данных в файле.

Изменено пользователем Kirgudu
  • Спасибо 1
Ссылка на комментарий

Что же касается вылета, видать твоя функция printf вовсе не так уж везде доступна. И при удалении, как ты говоришь, "самопальной" скрипту становится нечего вызывать.

Вот это-то и непонятно... Она срабатывает во всех скриптах, кроме этого. Она в движке починена, вообще-то. И по всем скриптам Артоса я заменил его to_log на printf, и в остальных она нормально работает... Скорее всего, где-то в этом скрипте она неявно переопределяется... Поэкспериментирую (или забью).

Шаман - СисАдмин

Всяко-разно: для ЧН

Ссылка на комментарий

Честно говоря, я тоже других переопределений prinf (кроме как в комментируемой тобой строчке) не нашёл, не могу без предметного теста сказать, откуда берётся эта ошибка.

Да пусть у тебя в его модулях выводится через консоль, какая разница? На самом деле, после отладки вывод в лог вообще можно убрать.

Ссылка на комментарий

Ок. Я честно пытался разобраться, как этой заразой пользоваться, но чегось не понял ничего. Перестраивать методы сохранения данных не вижу необходимости, поэтому давайте разберёмся с чанками.

Вылет

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[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, но охота же понять, как пользоваться данным инструментом, хотя бы на самом элементарном уровне.

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

Шаман - СисАдмин

Всяко-разно: для ЧН

Ссылка на комментарий

Все файлы присутствуют, именно так называются, методы save и load в них присутствуют.

Точно присутствуют? В оригинальном ЗПшном level_weathers.script нет функции save.

Подарки

  • Ссылка на комментарий

    @abramcumner, об этом я уже писал здесь.

    @Romz, если подождёшь несколько дней, ориентировочно со вторника по пятницу на следующей неделе я постараюсь подготовить рабочий пример встраивания в чистый ЗП.


     

     

    Все файлы присутствуют, именно так называются, методы save и load в них присутствуют.

    В модуле level_weathers нет публичных функций save и load. Ну нету! Есть save и load, описанные только как методы класса WeatherManager. se_stor же ни о каких классах в подключаемых для сохранения модулях не знает. Поэтому тупо пользоваться примером из se_stor нельзя.

    Подробнее смотри по ссылке выше.

    Изменено пользователем Kirgudu
    • Спасибо 1
    • Согласен 1
    Ссылка на комментарий

    @Kirgudu,

    post-39154-0-48611900-1444322666_thumb.jpg

     


    То есть, это только для внутреннего, так сказать, пользования? Дык se_stor же, вроде, пытается методы тупо напрямую вызывать? Типа level_weathers.load?

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

    Шаман - СисАдмин

    Всяко-разно: для ЧН

    Ссылка на комментарий

    @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 в этом модуле существуют только в контексте класса. Изменено пользователем Kirgudu
    • Спасибо 1
    Ссылка на комментарий
    Похоже, ты просто не понимаешь разницы между публичной функцией модуля и методом класса в этом модуле

    Ну есть такое... Я думал, они равнозначно вызываются... Теперь понятно.

    В 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.

    Я правильно понял?

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

    Шаман - СисАдмин

    Всяко-разно: для ЧН

    Ссылка на комментарий

     

     

    То есть, всё, что не имеет публичных вызовов save и load убираем из чанков.

    А что имеет - добавляем (так как список в примере se_stor неточный).

     

     

    А если есть необходимость хранить их отдельно, переносим их  вызовы save и load из actor_binder:save и actor_binder:load в ext_save и ext_load.

    Примерно так. В примере из se_stor такие модули уже указаны в ext_save и ext_load. Надо только актуализировать список согласно реалиям ЗП.

    Либо - переделать таки эти модули на хранение данных в глобальной таблице хранилища, как я уже расписывал выше.

    Точнее сейчас сказать не могу, если это требуется - жди неделю.

    • Спасибо 1
    Ссылка на комментарий
    Либо - переделать таки эти модули на хранение данных в глобальной таблице хранилища, как я уже расписывал выше. Точнее сейчас сказать не могу, если это требуется - жди неделю.

    Подожду, конечно. А пока попробую сделать, как выше написал.

    Собственно, похоже, что 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, это размер сохранения он считает, как я понял, по поводу чего он и начал ругаться, что, мол проблемное сохранение. Хотя, собственно размер сохранения и не увеличился.

    Изменено пользователем Romz
    • Нравится 1

    Шаман - СисАдмин

    Всяко-разно: для ЧН

    Ссылка на комментарий

    @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.

    Изменено пользователем Kirgudu
    • Полезно 1
    Ссылка на комментарий

    @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 сразу скачком. А сам размер сохранения, физический, практически не изменился...

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

    Шаман - СисАдмин

    Всяко-разно: для ЧН

    Ссылка на комментарий

    Ну так это 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 выдаёт это предупреждение. Не факт, что что-то критичное, но удостовериться в этом надо.

    Ссылка на комментарий

    Я бы на твоём месте глянул, что пишется в этом модуле и почему 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
    
    Изменено пользователем Romz

    Шаман - СисАдмин

    Всяко-разно: для ЧН

    Ссылка на комментарий

    Что странно, никаких предпосылок к этому я не вижу. Имя чанка никак не участвует в формировании технологического нет-пакета (только как ключ таблицы), а ошибка в логе говорит о том, что вместо нет-пакета во временную таблицу было записано значение типа boolean. Чего быть не может, судя по коду se_stor.
    Ну да ладно.

    • Согласен 1
    Ссылка на комментарий

    Вроде, взлетело.

    Вот так выглядит у меня сейчас

    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 перестал ругаться на размер сохранения.

    Изменено пользователем Romz
    • Нравится 1

    Шаман - СисАдмин

    Всяко-разно: для ЧН

    Ссылка на комментарий

    Всем привет. Столкнулся с таким логом :

     

    Expression    : assertion failed

    Function      : CUIXmlInit::InitText
    File          : D:\prog_repository\sources\trunk\xrGame\ui\UIXmlInit.cpp
    Line          : 315
    Description   : pTmpFont
     
    Ребят подскажите как его исправить. Желательно в ЛС. :russian_ru:
    Ссылка на комментарий

    Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

    Комментарии могут оставлять только зарегистрированные пользователи

    Создать аккаунт

    Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

    Зарегистрировать новый аккаунт

    Войти

    Есть аккаунт? Войти.

    Войти
    • Недавно просматривали   0 пользователей

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

    AMK-Team.ru

    ×
    ×
    • Создать...