Romz 142 Опубликовано 2 Октября 2015 Блин, чё-та я торможу... Есть таблица вида 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 Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 3 Октября 2015 Снова вопрошаю к уважаемому сообществу... Как отследить, что ГГ перешёл на другую локу? В процессе штудирования статей вроде попадалось что-то, но сейчас не могу найти. Поиск "смена уровня" и "смена локации" тоже ничего не даёт... Пробовал использовать 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 но безуспешно... Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 4 Октября 2015 (изменено) @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 Так вот, аномальки на локации, где находится в текущий момент ГГ, спавнятся нормально. То есть, как положено, на "земле"/"полу". А вот на других локах - могут появиться и в воздухе, и под террейном, и вложенные одна в одну, что вызывает дикие тормоза. Если заспавнить их по-новой, но уже находясь на другой локе, то уже на этой локе аномальки спавнятся нормально, а на остальных - таким вот странным образом, как я выше описывал, со всеми вытекающими последствиями. Пока я думаю решать эту проблему путём индивидуального спавна для каждой локации. То есть, устанавливать три флага (был_выброс, уже_есть_аномалии и смена_локи), запоминать их в псторе и проверять их на апдейте (либо актора, либо менеджера выбросов). Но, может быть, всё же есть способ сразу спавнить аномальки нормально по всем локам, чтобы они появлялись на своих местах, независимо от того, где находится ГГ? Изменено 4 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 5 Октября 2015 @naxac, @_Val_, Я бы не хотел обращаться к инфопоршням, потому что их нужно будет раскидывать ещё по другим скриптам. Сейчас у меня всё, связанное с аномальками, крутится в surge_manager и собственно скрипте аномалек. И я бы хотел это так и оставить. А вот хранилище от @Artos, в принципе, можно использовать. Может, ещё для чего пригодится. Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 5 Октября 2015 (изменено) @Dennis_Chikin, Ну, собственно, задача стоит не хранить что-то, а правильно спавнить аномальки на уровнях, на которых ГГ не присутствует. А т.к. это не получается реализовать нормально, то приходим к сохранению переменных между переходами ГГ с уровня на уровень. P.S. Инфо о посещениях/уходах с уровня - явный оверкилл. Если рассматривать в плане спавна аномалек - то нормально. Потому что, при спавне аномалек только на текущем уровне, нужно проверить, спавнились ли они тут уже после выброса, чтобы не спавнить их опять. Кстати, может есть какой-то явный признак начала игры? А то у меня сейчас наверчено проверок... А они, походу, не работают, потому что при загрузке/переходе на другой уровень все переменные переинициализируются... Вопрос по se_stor Как его правильно к ЗП прикрутить? А то там bind_stalker от ТЧ лежит, и в нём куча несуществующих уже в ЗП функций и переменных. Чегось запутался малёх... Изменено 5 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 5 Октября 2015 (изменено) @h0N0r, Я немного модифицировал скрипт генерации аномалек, чтобы gv/lv подставлялись реальные, а не просто максимальные для уровня или рандомные. Но всё равно аномальки спавнятся в воздухе. Может быть, это ещё от координат зависит, и на онлайновой локе объекты "притягиваются" к террейну, а на офлайновых, вешаются чисто по координатам. У меня так раз студни заспавнились на опорах ЛЭП, как на ёлках, а другой раз жарка появилась над Гавайцем и била вниз. Изменено 5 Октября 2015 пользователем Dennis_Chikin Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 5 Октября 2015 @Charsi, Ха, вона как... Не знал... Для сохранения "а был ли на этой локе выброс?" - просто записываю через запятую все локи на которых побывал актор, в отдельное поле того же se_stor. а при собственно выбросе - очищаю этот список.Остроумно! А я через флаги пытаюсь... Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 6 Октября 2015 (изменено) По 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 Изменено 6 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 6 Октября 2015 проверь каким-нибудь чекером, что lua_extensions.script не имеет ошибок После внесения изменений в скрипты всегда проверяю папку scripts script Syntax Checker-ом, потому что вполне могу где-то забыть then Он ошибок не выдал по этим скриптам. Кроме того, до и после после prefetch попробуй проверить Щас попробую.Вот бред же... Цепляю lua_helper от того же @Artos-а - всё норм, всё работает. lua_extension подцепился. Следом цепляю se_stor - всё, lua_extension не виден... lua_extension из lua_helper немного новее того, что с se_stor, но именно эти функции и там, и там одинаковые. Все файлы брал в этой теме, и в "Сборочном цехе" @Artos в своё время обещал выложить обновлённый se_stor, но так и не сподобился. Самый новый - от 09.09.2013 lua helper брал по ссылке @Artos-а - версия от 27.09.2013 Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 6 Октября 2015 И да, что показала проверка типа table.size до и после префетча? Как и следовало ожидать STRING:nil; ! [ERROR] --- Failed to load script lua_extension STRING:nil; Щас пробую закинуть lua_extension от 09.09.2013 Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 6 Октября 2015 (изменено) Щас пробую закинуть lua_extension от 09.09.2013 То же самое. Не хочет цепляться lua_extension @Kirgudu, Не, не взлетает... Кста, с одним lua_helper он он тоже не цепляется, оказывается. Просто сразу ошибку не вызывает. Самое интересное, что сам lua_helper прицепился и функции из него вызываются. Изменено 6 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 6 Октября 2015 Попробуй вместо 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 Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 6 Октября 2015 (изменено) Попробуй вместо комментирования всего и вся поменять в шаблонах этой функции %\% на %% (в четырёх местах). Применил сразу этот вариант. Только заменил %\% на %:%. 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 не подключал, но, думаю, теперь всё нормально будетНифига не угадал Подцепил 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 косяк... Изменено 6 Октября 2015 пользователем Romz 1 1 Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 7 Октября 2015 Artos написал шаблоны вида '%\%[s|d|f]', чтобы работало такое формирование строки, выводимой в лог: exformat("something %s something else %d something else 2]", param1, param2) То есть берётся исходная строка, в которую в подстановочные места, обозначенные %s, %d или %f, добавляются значения дополнительных аргументов. Ааа... Я посчитал это просто разделителем, между двумя значениями, тем более в других местах встречается вариант %/% и там косая - именно разделитель между значениями. А вертикальная черта - проглотилась нормально. Ок, поправлю. Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 7 Октября 2015 (изменено) Ну это уже с утра разбиратся буду. Похоже, что это в 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 под ЗП? Изменено 7 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 7 Октября 2015 (изменено) А как провернуть сие как ... сменить алгоритм хранения данных на хранение в виде субтаблиц в общей таблице 'storehouse'. ... Поиском пробежался по сайту - ничего тоже не нашёл... Или оно только Артосу извесно? Изменено 7 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 7 Октября 2015 @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 142 Опубликовано 8 Октября 2015 Что же касается вылета, видать твоя функция printf вовсе не так уж везде доступна. И при удалении, как ты говоришь, "самопальной" скрипту становится нечего вызывать. Вот это-то и непонятно... Она срабатывает во всех скриптах, кроме этого. Она в движке починена, вообще-то. И по всем скриптам Артоса я заменил его to_log на printf, и в остальных она нормально работает... Скорее всего, где-то в этом скрипте она неявно переопределяется... Поэкспериментирую (или забью). Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 8 Октября 2015 (изменено) Ок. Я честно пытался разобраться, как этой заразой пользоваться, но чегось не понял ничего. Перестраивать методы сохранения данных не вижу необходимости, поэтому давайте разберёмся с чанками. Вылет ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [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, но охота же понять, как пользоваться данным инструментом, хотя бы на самом элементарном уровне. Изменено 8 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение
Romz 142 Опубликовано 8 Октября 2015 (изменено) @Kirgudu, То есть, это только для внутреннего, так сказать, пользования? Дык se_stor же, вроде, пытается методы тупо напрямую вызывать? Типа level_weathers.load? Изменено 8 Октября 2015 пользователем Romz Шаман - СисАдмин Всяко-разно: для ЧН Поделиться этим сообщением Ссылка на сообщение