Проблема вот в чём. Пытаюсь сделать себе солянку на базе UnP 0.8
Игра - лицензия, патч 1.6.0.2
При подключении нескольких модов, с определённого момента, игра начинает вылетать с логом
Код
Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....l.k.e.r. - cop\gamedata\scripts\bind_stalker.script:478: attempt to concatenate field '?' (a nil value)
Помогите победить, а? Любая помощь в совмещении и советы приветствуются...
Добавлено (20.07.2015, 17:58) --------------------------------------------- Я задал этот вопрос на АМК-форуме, но пока ответа не получил. Сам ковыряюсь понемногу, читаю мануалы, но тоже пока безрезультатно. Работа с пстором и нетпакетами для меня - тёмный лес, ибо не программер ниразу...
Добавлено (29.07.2015, 14:59) --------------------------------------------- Короче, разобрался. Во всём виноват
Позже, поковырявшись, вылет по [game_difficulty] удалось победить, изменив конструкцию комманды Код get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])
на Код get_console():execute("g_game_difficulty "..tostring(game_difficulty_by_num[game_difficulty]))
У вас, судя по логу, ошибка в том, что при считывании уровня ложности (числа) из нетпакета, считалось число больше 3, либо просто какая-то чушь. Поэтому и конкатенировать строку "g_game_difficulty " с nil - вылетает (если в массиве использовать неправильный индекс, то и возвращается nil). Обойти проблему с помощью tostring() - нельзя, ибо хотя вместо значения nil будет значение "nil" - это проблему не решит. А ошибка, скорее всего, в неправильном использовании нетпакетов (или вы невнимательно адаптировали). Проверьте методы actor_binder:load(reader) и actor_binder:save(packet). Суть та, что если в нетпакет что-то записали, то и считать тоже нужно, и в конкретный момент.
ЦитатаRomz ()
Короче, разобрался. Во всём виноват Цитата Romz () Artefact_respawner_COP\
Как разобрались? В чём ошибка была? Или просто не стали его адаптировать?
Как разобрались? В чём ошибка была? Или просто не стали его адаптировать?
Один человек на АМК форуме подсказал, я его убрал из сборки. Вылеты прекратились. А потом ещё поковырялся в потрохах ЗП, в процессе добавления в сборку AtmosFear 3, и оказалось, что арты и так возрождаются, по крайней мере - должны, после выбросов. И я забил на Artefact_respawner_COP. Вот где бы дин.аномалии для ЗП нарыть?... У кого-то в моде я видел, но очень глубоко зарытое...
Вот где бы дин.аномалии для ЗП нарыть?... У кого-то в моде я видел, но очень глубоко зарытое...
Если в скриптах немного понимаешь, то забери из мода Припять.Точка отсчёта. Аномалии во время выброса рассасываются, после выброса вновь появляются совсем в других местах и совсем другие аномалии. Сделано для одной локации, но если дописать код, то работать будет на всех локациях. Так же можешь забрать из мода воздействие аномалий на сталкеров.
Вернусь к респавну атрефактов В Artefact_respawner_COP, в скрипте art_mgr.script, присутствую две вот такие функции
Код
function save(packet) packet:w_stringZ("artmgr") packet:w_stringZ(lev_str) packet:w_stringZ(lev_cur_sav) utils.w_CTime(packet, spawn_time) end
function load(packet) local flag = packet:r_stringZ() if flag ~= "artmgr" then return end lev_str = packet:r_stringZ() lev_cur_sav = packet:r_stringZ() spawn_time = utils.r_CTime(packet) end
Вот они то, скорее всего и вызывают проблемы в виде битых пакетов. Я так подозреваю, что в них используются методы, не очень совместимые с ЗП. В скриптах я не очень, дык, может, подскажет кто, как их православно под ЗВ переписать?
function actor_binder:save(packet) в самом конце метода перед строкой set_save_marker(packet, "save", true, "actor_binder") пишешь art_mgr.save(packet)
function save(packet) packet:w_stringZ("artmgr") packet:w_stringZ(lev_str) packet:w_stringZ(lev_cur_sav) utils.w_CTime(packet, spawn_time) end
function load(packet) local flag = packet:r_stringZ() if flag ~= "artmgr" then return end lev_str = packet:r_stringZ() lev_cur_sav = packet:r_stringZ() spawn_time = utils.r_CTime(packet) end
Ошибки не видно, если бы методы были не применимы - была бы ошибка с указанием на них. Да и в lua_hep.script они есть. Я не уверен, но возможно стоит переписать так:
Код
function load(packet) local flag = packet:r_stringZ() lev_str = packet:r_stringZ() lev_cur_sav = packet:r_stringZ() spawn_time = utils.r_CTime(packet) end
Автор адапта тоже ничего не смог с этим сделать, и забросил мод.
ЦитатаDukeKAn ()
Я не уверен, но возможно стоит переписать так:
То есть, просто убрать проверку на имя флага? А если так:
Код
function load(packet) local flag = packet:r_stringZ() if flag = "artmgr" then lev_str = packet:r_stringZ() lev_cur_sav = packet:r_stringZ() spawn_time = utils.r_CTime(packet) end end
Можно вообще таким образом с пакетами работать? Блин, не смогу проверить в ближайшее время, до понедельника точно...
Так смысла нет, ибо никакой проверки нет, надо использовать ==, а не =, так как это присваивание. В любом случае, даже если использовать ==, то получится ровно то, что хотел автор, только другими словами
Сообщение отредактировал DukeKAn - Суббота, 01.08.2015, 23:22
А если не использовать проверку, разве не будет считываться первый попавшийся пакет?
Пакет в эту функцию передаётся всегда один и тот же, ГГ-то один. Я может не понял, что вы спрашиваете, но не стирать же то, что понаписал внизу, хех)
Нет-пакет в сталкере используется для передачи информации от серверного объекта к клиентскому и обратно. По сути - это структура данных.
Метод
Код
actor_binder:load(reader)
вызывается во время перехода ГГ в онлайн, в этот момент в эту функцию передаётся нет-пакет reader, откуда можно считать данные.
Метод
Код
actor_binder:save(packet)
Вызывается при переходе ГГ в оффлайн, в функцию передаётся нет-пакет packet для записи в него данных.
С этой структурой данных нужно работать так: что записали, то и надо считать. К примеру, разрабы записали числа: write_number(11) write_number(22) write_number(33) И записали дату write_date(22.11.13)
Потом вы своим кодом после их кода записали числа write_number(1) write_number(2) write_number(3) Потом записали в него строку write_str("something").
и после идёт снова код разработчиков, пишущий в нет-пакет следующее: write_str("dev_string").
С нет-пакетом нужно строго соблюдать очередь, посмотрите оригинал, что записали - в том же порядке и считывают. Т.е. кодом разрабы считывают методами числа: n11 = read_number() n22 = read_number() n33 = read_number() Считывают дату: date = read_date()
Далее вы своим кодом должны считать: n1 = read_number() n2 = read_number() n3 = read_number() str = read_str()
И далее оставить код разрабов для считывания их данных: dev_str = read_str().
Если не соблюдать строгую очерёдность, и считать своим кодом лишь два числа вместо трёх, то последующий код разрабов вместо считывания своей строки, считают ваше третье число. А так как Lua - язык с динамической типизацией, то ваше число программа будет пытаться интерпретировать как строку, и получится полная фигня, считается совершенно не то, что записывали. У разраба мода же во первых, непонятно зачем вообще писать ту первую строку, во вторых, непонятно зачем не считывать свои же данные, ибо это порушит дальнейшую работу с нет-пакетами. Хотя я не представляю, может ли строка не совпадать, если вы говорите, что очерёдность соблюдена. Посмотрите, совпадают ли строки или нет, можно в лог написать результат. Ну и вообще, нет-пакет - ограниченного размера, и если писать слишком много данных, то всё тихо сломается без видной причины. Сомневаюсь, что там слишком большие данные записываются, но знать об этом стоит.
Сообщение отредактировал DukeKAn - Понедельник, 03.08.2015, 01:19
DukeKAn, Спасибо, теперь понял. То есть, если в bind_stalker.script в
Код
function actor_binder:save(packet) set_save_marker(packet, "save", false, "actor_binder") ... { что-то из оригинала } ... { вызов из мода1} { вызов из мода2} { вызов из мода3} { вызов из мода4} set_save_marker(packet, "save", true, "actor_binder") end
то в дальнейшем, это должно быть обязательно считано, и обязательно в таком же порядке. Просто немного запутано получается: Некоторые моды считытвание прописывают в function actor_binder:net_spawn(data), некоторые в function actor_binder:update(delta). Тот же Artefact_respawner_COP прописан и в save, и в load, и в update. правда, не работает нифига правильно. Хотя, в ТЧ вроде работал. Щас попробую воткнуть его в сборку в предложенном виде (без проверок).
Сообщение отредактировал Romz - Понедельник, 03.08.2015, 11:25