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

Скриптование


Svoboда

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

Блин, чё-та я торможу...

Есть таблица вида

 

local levels = {
	["zaton"] = {
		["game_vertex"] = 292,
		["count"] = 150,
	},
	["jupiter"] = {
		["game_vertex"] = 317,
		["count"] = 150,
	},
	["pripyat"] = {
		["game_vertex"] = 666,
		["count"] = 150,
	},
}

 

Далее по скрипту, в функции, она перебирается

 

	for _, level_t in pairs(levels) do

	local level_name = ?????????

 

Как мне получить в level_name имя локации???

Все мои попытки приводят или к level_name = nil или к тому, что в неё записывается содержимое ячейки...

level_name = levels.level_t

level_name = levels[level_t]

level_name = levels[levels.level_t]

i= i+1
level_name = levels[i]

i= i+1
level_name = levels.i

 

 

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

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

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


Ссылка на сообщение

Снова вопрошаю к уважаемому сообществу...

Как отследить, что ГГ перешёл на другую локу? В процессе штудирования статей вроде попадалось что-то, но сейчас не могу найти. Поиск "смена уровня" и "смена локации" тоже ничего не даёт...

Пробовал использовать

		new_level_name = level.name()
		level_changed = false
		cur_level_name = new_level_name
		if cur_level_name ~= old_level_name then
			level_changed = true
		end

 

но безуспешно...

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

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

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


Ссылка на сообщение
(изменено)

@naxac, А можно ли таким образом хранить свои переменные? Нужно сохранять между загрузками/переходами, был ли выброс и генерировались ли уже аномалии на уровне.

Или лучше для этого использовать модуль @Artos? А как его под ЗП настроить, а то он же, вроде, под ТЧ 1.0006...

Хотя @Artos, написал, что он, вроде, под ЗП и ЧН тоже работает...

 

Собственно, вопрос к знатокам. Я таким образом пытаюсь решить проблему. Аномальки у меня генерируются и складываются в табличку anomaly_queue

	for _, level_t in pairs(levels) do
		for i = 1, level_t.count do
			local anom_t = {}
			local pos_new = {}
			anom_t.game_vertex = level_t.game_vertex
			repeat
				anom_t.level_vertex = math.random(1571597)
				pos_new = level.vertex_position(anom_t.level_vertex)
			until anom_check(pos_new) == true
			anom_t.x = pos_new.x
			anom_t.y = pos_new.y
			anom_t.z = pos_new.z
			anom_t.section = anomaly_sections[math.random(1, #anomaly_sections)].anom_section
			if	string.find(anom_t.section, "zone_mine_gravitational") or
				string.find(anom_t.section, "_field_") or
				string.find(anom_t.section, "zone_radioactive") then
				anom_t.field = "field"
			else
				anom_t.field = nil
			end
			table.insert(anomaly_queue, anom_t)
		end
	end

 

А затем, через ещё одну функцию, которая просто берёт параметры из anomaly_queue и передаёт в функцию спавна, спавнятся на всех локациях ЗП. Я её раньше показывал уже, но продублирую

 

function create_anom(section, rad_anom, x, y, z, lv, gv, mode)

	if gv == nil then
		gv = db.actor:game_vertex_id()
	end
	if lv == nil then
		lv = db.actor:level_vertex_id()
	end
	local pos = db.actor:position()
	if x == nil then
		x = pos.x
	end
	if y == nil then
		y = pos.y
	end
	if z == nil then
		z = pos.z
	end

	local p_obj = alife():create(section, vector():set(x, y, z), lv, gv)
	local packet = net_packet()

---------------------Читаем нет-пакет----------------
	packet:w_begin(0)
	p_obj:STATE_Write(packet)
	packet:r_seek(2)

	local game_vertex_id			= packet:r_u16()
	local distance				= packet:r_float()
	local direct_control			= packet:r_s32()
	local level_vertex_id			= packet:r_s32()
	local object_flags			= packet:r_s32()
	local custom_data			= packet:r_stringZ()
	local story_id				= packet:r_s32()
	local spawn_story_id			= packet:r_s32()
	local shape_count			= packet:r_u8()

	for i = 1,shape_count do
		local shape_type		= packet:r_u8()
		if shape_type == 0 then
			local center		= packet:r_vec3()
			local radius		= packet:r_float()
		else
			local box		= packet:r_matrix()
		end
	end

	local restrictor_type			= packet:r_u8()
	local max_power				= packet:r_float()
	local owner_id				= packet:r_s32()
	local enabled_time			= packet:r_u32()
	local disabled_time			= packet:r_u32()
	local start_time_shift			= packet:r_u32()
	local offline_interactive_radius	= packet:r_float()
	local artefact_spawn_count		= packet:r_u16()
	local artefact_position_offset		= packet:r_s32()
	local last_spawn_time			= packet:r_u8()

---------------------Меняем данные пакета---------------------

	local new_center			= vector():set(0, 0, 0)
	owner_id				= bit_not(0)
	offline_interactive_radius		= 30
	if mode ~= nil then
		custom_data			= mode
	end
	if rad_anom ~= nil then
		radius				= rad_anom
	end

---------------------------Пишем в пакет---------------------

	packet:w_begin( 0 )

	packet:w_u16(game_vertex_id)
	packet:w_float(distance)
	packet:w_s32(direct_control)
	packet:w_s32(level_vertex_id)
	packet:w_s32(object_flags)
	packet:w_stringZ(custom_data)
	packet:w_s32(story_id)
	packet:w_s32(spawn_story_id)
	packet:w_u8(1)
	packet:w_u8(0)
	packet:w_vec3(new_center)
	packet:w_float(radius)
	packet:w_u8(restrictor_type)
	packet:w_float(max_power)
	packet:w_s32(owner_id)
	packet:w_u32(enabled_time)
	packet:w_u32(disabled_time)
	packet:w_u32(start_time_shift)
	packet:w_float(offline_interactive_radius)
	packet:w_u16(artefact_spawn_count)
	packet:w_s32(artefact_position_offset)

	if mode == nil then
		packet:w_u8(last_spawn_time)
	end

	packet:r_seek(2)
	p_obj:STATE_Read(packet, packet:w_tell())

	return p_obj
end

 

Так вот, аномальки на локации, где находится в текущий момент ГГ, спавнятся нормально. То есть, как положено, на "земле"/"полу".

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

Пока я думаю решать эту проблему путём индивидуального спавна для каждой локации. То есть, устанавливать три флага (был_выброс, уже_есть_аномалии и смена_локи), запоминать их в псторе и проверять их на апдейте (либо актора, либо менеджера выбросов).

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

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

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

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

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


Ссылка на сообщение

@naxac, @_Val_, Я бы не хотел обращаться к инфопоршням, потому что их нужно будет раскидывать ещё по другим скриптам. Сейчас у меня всё, связанное с аномальками, крутится в surge_manager и собственно скрипте аномалек. И я бы хотел это так и оставить.

А вот хранилище от @Artos, в принципе, можно использовать. Может, ещё для чего пригодится.

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

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

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


Ссылка на сообщение
(изменено)

@Dennis_Chikin, Ну, собственно, задача стоит не хранить что-то, а правильно спавнить аномальки на уровнях, на которых ГГ не присутствует. А т.к. это не получается реализовать нормально, то приходим к сохранению переменных между переходами ГГ с уровня на уровень.

 

P.S. Инфо о посещениях/уходах с уровня - явный оверкилл.

Если рассматривать в плане спавна аномалек - то нормально. Потому что, при спавне аномалек только на текущем уровне, нужно проверить, спавнились ли они тут уже после выброса, чтобы не спавнить их опять.

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


Вопрос по se_stor

Как его правильно к ЗП прикрутить? А то там bind_stalker от ТЧ лежит, и в нём куча несуществующих уже в ЗП функций и переменных. Чегось запутался малёх...

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

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

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

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


Ссылка на сообщение
(изменено)

@h0N0r, Я немного модифицировал скрипт генерации аномалек, чтобы gv/lv подставлялись реальные, а не просто максимальные для уровня или рандомные. Но всё равно аномальки спавнятся в воздухе. Может быть, это ещё от координат зависит, и на онлайновой локе объекты "притягиваются" к террейну, а на офлайновых, вешаются чисто по координатам.

У меня так раз студни заспавнились на опорах ЛЭП, как на ёлках, а другой раз жарка появилась над Гавайцем и била вниз.

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

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

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

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


Ссылка на сообщение

@Charsi, Ха, вона как... Не знал...


 

 

Для сохранения "а был ли на этой локе выброс?" - просто записываю через запятую все локи на которых побывал актор, в отдельное поле того же se_stor. а при собственно выбросе - очищаю этот список.
Остроумно! :) А я через флаги пытаюсь...

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

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

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


Ссылка на сообщение
(изменено)

По se_stor вопрос. Вроде прописал везде, как нужно. Но при начале НИ имею вылет

 

! [SCRIPT ERROR]: c:\gam\s-cop\gamedata\scripts\_g.script:1082: attempt to call field 'exformat' (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\_g.script:1082: attempt to call field 'exformat' (a nil value)

 

А строка 1082 у меня получается в _g.script вот здесь

 

--/------------------------------------------------------------------
--/ print-log (вывод отладочной информации)
--/------------------------------------------------------------------
local console
--/ функция вывода сообщения в игровую консоль
to_log = debug_print or logf or log1 or function(fmt,...)
	if not console then console = get_console() end
	console:execute("load ~:"..string.exformat(fmt,...)) --1082
end

 

В lua_extension "exformat" переопределяется.

Может, для ЗП не prefetch("lua_extension"), а как-то по-другому?


Переподключил по-новой. НИ сработала, но через некоторое время

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : ..\xrServerEntities\script_engine.cpp
Line          : 193
Description   : <no expression>
Arguments     : LUA error: c:\gam\s-cop\gamedata\scripts\se_stor.script:118: attempt to call field 'size' (a nil value)

 

Нашёл такую же проблему здесь: http://www.amk-team.ru/forum/index.php?showtopic=6185&p=794361

Но всё, что советовали, у меня уже есть, а вылет всё равно присутствует.

ИМХО, prefetch("lua_extension") не срабатывает, как должен... Попробую ещё его в начало _g.script прописать...


Не-а, не взлетело... Как эту заразу работать заставить?


Всё, сдаюсь. Не могу заставить se_stor работать... Разного рода шаманства тоже не помогают.

Попробую обойтись pstor

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

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

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

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


Ссылка на сообщение

 

 

проверь каким-нибудь чекером, что lua_extensions.script не имеет ошибок
После внесения изменений в скрипты всегда проверяю папку scripts script Syntax Checker-ом, потому что вполне могу где-то забыть then :) Он ошибок не выдал по этим скриптам.

 

Кроме того, до и после после prefetch попробуй проверить
Щас попробую.

Вот бред же... Цепляю lua_helper от того же @Artos-а - всё норм, всё работает. lua_extension подцепился.

Следом цепляю se_stor - всё, lua_extension не виден... :dash2:


lua_extension из lua_helper немного новее того, что с se_stor, но именно эти функции и там, и там одинаковые.


Все файлы брал в этой теме, и в "Сборочном цехе"


@Artos в своё время обещал выложить обновлённый se_stor, но так и не сподобился.

Самый новый - от 09.09.2013

lua helper брал по ссылке @Artos-а - версия от 27.09.2013

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

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

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


Ссылка на сообщение

 

 

И да, что показала проверка типа table.size до и после префетча?
Как и следовало ожидать
 STRING:nil;
! [ERROR] --- Failed to load script lua_extension
 STRING:nil;

Щас пробую закинуть lua_extension от 09.09.2013

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

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

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


Ссылка на сообщение
(изменено)
Щас пробую закинуть lua_extension от 09.09.2013

То же самое. Не хочет цепляться lua_extension

@Kirgudu, Не, не взлетает... Кста, с одним lua_helper он он тоже не цепляется, оказывается. Просто сразу ошибку не вызывает.

Самое интересное, что сам lua_helper прицепился и функции из него вызываются.

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

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

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

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


Ссылка на сообщение

 

 

Попробуй вместо prefetch("lua_extension") использовать if lua_extension then end
Так тоже попробовал, с равно тем же результатом.

 

 

Тогда как рабочий вариант могу посоветовать взять из lua_extension только используемые функции и вставить их куда-то ещё, да хоть в тот же _g.script. Это exformat, table.size и, возможно, что-то ещё, что вызывается в se_stor, а также вызывается уже из этих функций.
Попробую.

Собственно, вот виновник всего кипеша

 

local function fStringExtraFormat(fmt,...)
	--/ локальная функция: перевод аргумента в стринг
	local val2str = function(val,lua_type)
		if lua_type == 'table' then
			if tonumber(val.x) and tonumber(val.y) and tonumber(val.z) then
				return string.format('tbl{x=%.3f:y=%.3f:z=%.3f}',val.x,val.y,val.z) --/>
			end
			local tbl,str,separator = {},'tbl{',""
			for key,_ in pairs(val) do
				table.insert(tbl, key == tonumber(key) and tostring(key) or key)
			end
			table.sort(tbl)
			for _,key in ipairs(tbl) do
				if (tonumber(key) or 0) > 0 then
					str = str..separator..tostring(val[tonumber(key)])
				else
					str = str..separator..key.." = "..tostring(val[key])
				end
				separator = ", "
			end
			return str..'}' --/>
		elseif lua_type == 'userdata' then --/#?# а нужно ли привязываться к движку?
			if type(val.getP) == 'function' then
				if type(val.x) == 'number' and type(val.y) == 'number' and type(val.z) == 'number' then
					return string.format('vec(x=%.3f:y=%.3f:z=%.3f)',val.x,val.y,val.z) --/>
				end
				return '<vector>' --/>
			elseif type(val.setHMSms) == 'function' then
				return 'CTime('..val:dateToString(0).." "..val:timeToString(3)..")" --/> D/M/Y h:m:s:ms
			end
		elseif lua_type == 'string' then
			return val --string.format("%q", val) --/>
		elseif lua_type == 'boolean' then
			return val and "true" or "false" --/>
		elseif lua_type == 'number' then
			return tostring(val) --/>
		end
		return "<"..lua_type..">" --/>
	end
	--/ основное тело функции: парсинг исходной строки
	if type(fmt) == 'string' then
		if fmt:match('%\%[s|d|f]') then --/ есть патерн(ы)?
			if next({...}) then --/ есть аргумент(ы)?
				local arg,val,lua_type,i = {...},nil,nil,nil
				for i=1,#arg do
					val = arg[i] --/ значение текущего аргумента
					lua_type = type(val) --/ тип текущего аргумента
					if lua_type == 'number' then
						fmt = fmt:gsub('%\%[d|s|f]',val,1)
					else
						fmt = fmt:gsub('%\%s',val2str(val,lua_type),1)
					end
				end
			end
			fmt = fmt:gsub('%\%[s|d|f]',"<NOT_arg!>") --/ заглушка от отсутствия аргументов
		end
	else
		fmt = val2str(fmt,type(fmt))
	end
	return fmt --/> string
	--/ с заменой обычных пробелов (sym_space='\032') на печатные ('\160')
	--return fmt:gsub('%s','\160') --/> string
end

 

Я закомментировал в lua_extension эту функцию, после чего lua_extension благополучно подцепился. Давайте вместе разбираться, что не нравится движку ЗП...


Я не очень опытен в скриптах но...

Функция в функции - это нормально?

  • Полезно 1

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

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

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


Ссылка на сообщение
(изменено)
Попробуй вместо комментирования всего и вся поменять в шаблонах этой функции %\% на %% (в четырёх местах).

Применил сразу этот вариант. Только заменил %\% на %:%. lua_extension нормально подцепился, отладочные сообщения в лог посыпались.

local function fStringExtraFormat(fmt,...)
	--/ локальная функция: перевод аргумента в стринг
	local val2str = function(val,lua_type)
		if lua_type == 'table' then
			if tonumber(val.x) and tonumber(val.y) and tonumber(val.z) then
				return string.format('tbl{x=%.3f:y=%.3f:z=%.3f}',val.x,val.y,val.z) --/>
			end
			local tbl,str,separator = {},'tbl{',""
			for key,_ in pairs(val) do
				table.insert(tbl, key == tonumber(key) and tostring(key) or key)
			end
			table.sort(tbl)
			for _,key in ipairs(tbl) do
				if (tonumber(key) or 0) > 0 then
					str = str..separator..tostring(val[tonumber(key)])
				else
					str = str..separator..key.." = "..tostring(val[key])
				end
				separator = ", "
			end
			return str..'}' --/>
		elseif lua_type == 'userdata' then --/#?# а нужно ли привязываться к движку?
			if type(val.getP) == 'function' then
				if type(val.x) == 'number' and type(val.y) == 'number' and type(val.z) == 'number' then
					return string.format('vec(x=%.3f:y=%.3f:z=%.3f)',val.x,val.y,val.z) --/>
				end
				return '<vector>' --/>
			elseif type(val.setHMSms) == 'function' then
				return 'CTime('..val:dateToString(0).." "..val:timeToString(3)..")" --/> D/M/Y h:m:s:ms
			end
		elseif lua_type == 'string' then
			return val --string.format("%q", val) --/>
		elseif lua_type == 'boolean' then
			return val and "true" or "false" --/>
		elseif lua_type == 'number' then
			return tostring(val) --/>
		end
		return "<"..lua_type..">" --/>
	end
	--/ основное тело функции: парсинг исходной строки
	if type(fmt) == 'string' then
		if fmt:match('%:%[s|d|f]') then --/ есть патерн(ы)?
			if next({...}) then --/ есть аргумент(ы)?
				local arg,val,lua_type,i = {...},nil,nil,nil
				for i=1,#arg do
					val = arg[i] --/ значение текущего аргумента
					lua_type = type(val) --/ тип текущего аргумента
					if lua_type == 'number' then
						fmt = fmt:gsub('%:%[d|s|f]',val,1)
					else
						fmt = fmt:gsub('%:%s',val2str(val,lua_type),1)
					end
				end
			end
			fmt = fmt:gsub('%:%[s|d|f]',"<NOT_arg!>") --/ заглушка от отсутствия аргументов
		end
	else
		fmt = val2str(fmt,type(fmt))
	end
	return fmt --/> string
	--/ с заменой обычных пробелов (sym_space='\032') на печатные ('\160')
	--return fmt:gsub('%s','\160') --/> string
end

 

se_stor не подключал, но, думаю, теперь всё нормально будет

Вариант с %/%, я думаю, тоже бы прокатил.

 

 

se_stor не подключал, но, думаю, теперь всё нормально будет
Нифига не угадал :dash2:

Подцепил se_stor. На НИ вылетел с логом

 

* [win32]: free[2011336 K], reserved[87760 K], committed[2095144 K]
* [ D3D ]: textures[1098559 K]
* [x-ray]: process heap[592287 K], game lua[33214 K], render[103 K]
* [x-ray]: economy: strings[27513 K], smem[535318 K]
_se_actor: set load marker: 201
_se_actor: LOAD DIF: 1
! [SCRIPT ERROR]: No such operator defined
 
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: No such operator defined
 

stack trace:

 

Ну это уже с утра разбиратся буду. Похоже, что это в bind_stalker косяк...

Изменено пользователем Romz
  • Не согласен 1
  • Полезно 1

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

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

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


Ссылка на сообщение

Artos написал шаблоны вида '%\%[s|d|f]', чтобы работало такое формирование строки, выводимой в лог: exformat("something %s something else %d something else 2]", param1, param2) То есть берётся исходная строка, в которую в подстановочные места, обозначенные %s, %d или %f, добавляются значения дополнительных аргументов.

Ааа... Я посчитал это просто разделителем, между двумя значениями, тем более в других местах встречается вариант %/% и там косая - именно разделитель между значениями. А вертикальная черта - проглотилась нормально. Ок, поправлю.

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

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

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


Ссылка на сообщение
(изменено)

Ну это уже с утра разбиратся буду. Похоже, что это в bind_stalker косяк...

Нифига это не он

Этот вылет ловлю, когда пытаюсь закоментить вот этот кусок кода в 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

А вот если не трогать этот момент, то НИ начинается, а затем вылетает с таким логом

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[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)

Я подозреваю, что это связано с

...

1. Собственно сам модуль se_stor.script:

1.1 Скрипт se_stor.script имеет настройки, позволяющие использовать хранилище в разных версиях игры/модов (SoC|CS|CoP).

В данной версии комплекта скрипт полностью настроен на использование с оригинальной версией SoC (ТЧ патчи v1.0004 и выше).

...

4. В скрипте биндера актора (bind_stalker.script/bind_actor.script) требуется внести изменения помеченный в примере знаком #+#.

4.1. В методы 'save' и 'load' биндера необходимо добавить строки вызова соотв. функций (save/load) скрипта хранилища.

4.2. Если не предполанается изменение алгоритма хранения внешних модулей (погода, ...), то требуется организовать внешний доступ к биндеру актора.

4.3. В данном комплекте хранение данных модулями заданий, тайников, пси-зон вынесены в отдельные бинарные последовательности (chunks), что позволяет не вносить изменения в эти модули.

Однако необходимо описать в настройках хранилища (в таблице tPkChunks) внешние модули, в которых требуется сохранение данных в чанках (chunks).

Посоветовал бы все же сменить алгоритм хранения данных на хранение в виде субтаблиц в общей таблице 'storehouse'.

...

Это выдержки из readme_se_stor.txt

Исходя из этого, я подозреваю, что игра как раз и пытается грузить что-то из этих самых "чанков" но не находит их, потому что их тупо нет.

Так вот, из readme_se_stor.txt совершенно не понятно, как

...

сменить алгоритм хранения данных на хранение в виде субтаблиц в общей таблице 'storehouse'.

...

Поиском пробежался по сайту - ничего тоже не нашёл...

Кроме того, в se_stor присутствует для записи local function save_storehouse() и local function save_chunks() но вот для загрузки имеется только local function read_chunks()

Собственно, вопрос к знатокам: как бороться и с этими двумя фигнями?

Или, может, есть у кого нормально работающий se_stor под ЗП?

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

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

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

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


Ссылка на сообщение
(изменено)

А как провернуть сие

как

...

сменить алгоритм хранения данных на хранение в виде субтаблиц в общей таблице 'storehouse'.

...

Поиском пробежался по сайту - ничего тоже не нашёл...

 

Или оно только Артосу извесно?

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

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

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

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


Ссылка на сообщение

@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

 

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

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

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


Ссылка на сообщение

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

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

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

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

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


Ссылка на сообщение
(изменено)

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

Вылет

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[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

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

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

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


Ссылка на сообщение
(изменено)

@Kirgudu,

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

 


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

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

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

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

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


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

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

AMK-Team.ru

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