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

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

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


 

 

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

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

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

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

 

 

local clstp = sobj:CLASS_TYPE()

Попробуй так:

local clstp = sobj and type(sobj.CLASS_TYPE) == 'function' and sobj:CLASS_TYPE()

На тот случай, если для данного конкретного объекта не сработало «if SOBJ then».

Ссылка на комментарий
ощущение не-связанности рук приятно.

Плавали, после того как надоело ждать по 10 минут загрузки игры кинули якорь.

 

что я делаю не так?

Все не так, код совершенно некорректный, надо использовать метатаблицы. Объект и пространство имен это немного разные понятия ;), к тому же я совершенно не уверен о возможности добавления методов к серверному объекту (пробуй получать метатаблицу того-же актора и что-нибудь добавить/переопределить). Тут ты, очевидно, добавляешь метод объекту, а не полю, чего ты еще ждал от такого кода? :facepalm:

Изменено пользователем Struck
Ссылка на комментарий

По 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

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

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

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

@Romz, проверь каким-нибудь чекером, что lua_extensions.script не имеет ошибок. Маловероятно, но возможно, что он из-за этого не загружается.

Кроме того, до и после после prefetch попробуй проверить (например, выводом в лог) тип переопределяемого метода. Если всё в порядке, type(table.size) должно выдать значение 'function'.

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

 

 

проверь каким-нибудь чекером, что 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

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

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

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

Он сподобился, но выложил как раз от 09.09, а потом вроде удалил.

Даже и не знаю, что посоветовать. Объективных причин скрытию lua_extension я не вижу... в ЧН цепляется без проблем.


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


И да, что показала проверка типа table.size до и после префетча?

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

 

 

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

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

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

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

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

Ещё предложение.

В lua_extension есть функция fStringExtraFormat, в комплекте se_stor от 09.2013 она идёт в самом начале.
В функции в двух местах есть шаблон '%\%[s|d|f]' (строки 65 и 78) и в одном месте шаблон '%\%[d|s|f]' (строка 72). Попробуй убрать в этих шаблонах вертикальную черту.

@Charsi говорит, что после такого изменения lua_extension у него в ЗП загрузился (а до того также не был виден).

Изменено пользователем Kirgudu
Ссылка на комментарий
Щас пробую закинуть lua_extension от 09.09.2013

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

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

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

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

Попробуй то, что я выше написал.

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

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

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

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

Это exformat, table.size и, возможно, что-то ещё, что вызывается в se_stor, а также вызывается уже из этих функций.

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

К сожалению, сам я не смогу этим заняться как минимум неделю, а то и больше.

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

 

 

Попробуй вместо 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

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

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

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

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

Хоть десяток функций друг в друга вкладывай. Тут дело в другом... надо думать.

Пока предложение следующее.

 

Вариант 1.

Функция fStringExtraFormat (она же exformat в глобальном пространстве _G) используется только для вывода отладочной информации в модуле хранилища.

Закомментируй её целиком, также закомментируй:

  • lua_extension: строки 874-876, 929-931
  • se_stor: строки 47-49

При добавлении из _g_ADD.script не надо добавлять строки 53-67.

Всё должно заработать, но без вывода возможной отладочной информации.

 

Вариант 2.

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

Изменено пользователем Kirgudu
  • Согласен 1
  • Полезно 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, добавляются значения дополнительных аргументов.

Строго говоря, артосовский шаблон тоже не совсем верен - как справедливо заметил в кулуарной беседе @Charsi, в нём должно быть экранирование процента процентом же, а не escape-символ. Но, как ни странно, в ТЧ и ЧН шаблон Артоса не приводит к «невидимости» модуля и нормально работает.

Ты же добавляешь ещё один символ, который приводит к неправильной работе указанного выше вывода в лог. Функция в твоей редакции просто не найдёт %s и др. и выведет исходную строку в лог как есть, без подстановки аргументов.

Правильным вариантом шаблона должен быть именно тот, что приведён выше: '%%...' и без вертикальных чёрточек между символами в квадратных скобках. Например, '%%[sdf]' или '%%'.

Изменено пользователем Kirgudu
  • Полезно 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

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

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

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

@Romz, если не ошибаюсь, последний se_stor глючный в принципе (проблема то-ли с записью, то-ли с чтением чанков, то-ли и с тем и с тем), надо искать более раннюю версию. У меня где-то комплект этих приблуд валялся, найду - скину. Возможно @Kirgudu поможет с этим раньше меня.

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

@Карлан, у меня более старая версия se_stor встроена в мод (платформа ЧН), причём с изменениями, так что выковыривать оттуда будет сложно.

 

@Romz, всё намного проще. Если ты глянешь в se_stor таблицу tPkChunks, то увидишь, что в ней для ЗП перечислены модули, которые Артос предлагал сохранять в чанках. В том числе и level_weathers. А этот модуль у тебя либо отсуствует, либо в нём нет метода save - отсюда и принудительный вылет в функции сохранения чанков. Проверь для начала это.

Если судить по ЧН, в модуле level_weathers действительно нет публичного метода save. Там надо сначала получить экземпляр класса, у которого уже этот метод будет. Стандартно этот экземпляр класса сохраняется в экземпляре класса актора. Поэтому level_weathers мы из tPkChunks удаляем, вместо этого возвращаем в actor_binder:save() такую строчку:

self.weather_manager:save(packet)
Также надо вернуть аналогичную строчку в actor_binder:load()

 

Затем надо проверить остальные модули, которые Artos добавил в чанки для ЗП.

sr_psy_antenna и treasure_manager имеют публичные методы save и load (повторяю на всякий случай, пишу для ЧН! ЗП нет в наличии, но там по аналогии), их оставляем в чанках.

task_manager в ЧН публичных save и load не имеет - его из чанков убираем, возвращая в actor_binder:save() и actor_binder:load() (если в ЗП по-другому, действовать соответственно).

bind_actor - тут Artos для ЧН ошибся, этот модуль называется bind_stalker. Возможно, для ЗП это тоже так. Публичные методы save и load в него ты добавляешь согласно инструкции se_stor. Внутри них дёргаются опять же добавленные ext_save и ext_load, а там - пишутся/читаются данные ещё кое-каких внешних модулей.

Записываемые/читаемые в ext_save и ext_load модули надо не тупо взять из примера se_stor (который, как мы знаем, сделан для ТЧ), а сверить с оригинальными save и load ЗП.

 

Надеюсь, понятно расписал. Уверен на 99%, если внести все эти поправки, se_stor заработает. И это стало бы хорошим взносом для всех будущих пользователей хранилища в любых частях игры.

Возможно, на следующей неделе у меня самого будет время посидеть и соорудить готовые примеры использования модуля для всех платформ, а не только для ТЧ, как это сделано в оригинальном комплекте.

 

Поправка насчёт weather_manager. Его сохранение/загрузку Artos прописал и в таблицу чанков, и в доп. методы ext_save и ext_load. Это, понятное дело, избыточно (разве только в ЗП в этом модуле есть публичные save и load). Поэтому делаем что-то одно - либо оставляем в ext_save/load и убираем из таблицы чанков, либо убираем и из таблицы и из ext_save/load, но возвращаем в save/load.

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

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

как

...

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

...

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

 

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

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

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

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

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

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

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

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

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

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

Войти

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

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

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