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

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

@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

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