Случайная подборка модов
Chernobyl Chronicles
4.2
Путь Человека. Шаг в неизвестность. Дежавю
3.4
Nature Winter v2.3 Black Edition
3.9
Зимний путь 1.2: Альтернатива
2.2
Радиоактивное мясо. Схватка
3.0
История Кота
3.4
Последние обновленные темы Прямой эфир Самые популярные темы Последние новости
  • Страница 1 из 2
  • 1
  • 2
  • »
Архив - только для чтения
Форум » Архив » Моддинг - Архив » [CoP] Прошу помощи в совмещении нескольких модов (Сел я тут в СТАЛКЕРа поиграть...)
[CoP] Прошу помощи в совмещении нескольких модов
Российская Федерация  Romz
Среда, 29.07.2015, 14:59 | Сообщение # 1
Статус:
Отмычка:
Сообщений: 104
Награды: 0
Регистрация: 16.07.2015

Товарищи скриптописатели! Нужна ваша помощь!

Проблема вот в чём. Пытаюсь сделать себе солянку на базе 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)

Это
Код
function actor_binder:load(reader)

оператор
Код
get_console():execute("g_game_difficulty "..game_difficulty_by_num[game_difficulty])

То есть, сбрасывается в сохранении, или не сохраняется уровень сложности. Возможно, ещё что-то.

если подставить костыль в виде
Код
local game_difficulty = 1

то сохранение может загрузиться нормально (с виду), или вылететь за отсутствием ещё какой-либо переменной, идентификатора погоды, например.

Моды, в основном, инициализируются через различные функции bind_stalker.script

Моды сами по себе не затрагивают ни погоду, ни уровень сложности.

Моды, подключенные по-отдельности к UnP 0.8, никаких проблем не вызывают, сохраняются/загружаются нормально.

Отключение модов без начала НИ сохранение не спасает, т.е. переменные обнуляются либо сбрасываются до/во время сохранения.

Если один из модов отключить, а потом начать НИ, проблема, обычно, пропадает.

Список модов:

___Up_CoP_v0.8\

Моды, подключаемые через bind_stalker:

ammo_fix_v100002\
Artefact_respawner_COP\
Detector_Fenix\
exchanging items mod COP 0.1\
Телевизор_у_Зулуса\

Моды без скриптов:

Morda_MOD_031\
NPCvisual\
Анекдоты из ЧН и ТЧ дзя ЗП\
retekstura-kurtki-novichka.zip

В логе ничего толкового нет больше. Нельзя ли получить более развёрнутый лог?

Позже, поковырявшись, вылет по [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]))

(Подсмотрел у OGSM)

Остаётся вылет с
Код
Expression    : it!=WeatherFXs.end()
Function      : CEnvironment::SetWeatherFX
File          : D:\prog_repository\sources\trunk\xrEngine\Environment.cpp
Line          : 311
Description   : Invalid weather effect name.
Arguments     : âd

Проблема, как я подозреваю, судя вот по этой части лога
переполнение или повреждение нет-пакета при/перед сохранением
Код
Description   : Invalid weather effect name.
Arguments     : âd

Помогите победить, а?
Любая помощь в совмещении и советы приветствуются...

Добавлено (20.07.2015, 17:58)
---------------------------------------------
Я задал этот вопрос на АМК-форуме, но пока ответа не получил. Сам ковыряюсь понемногу, читаю мануалы, но тоже пока безрезультатно. Работа с пстором и нетпакетами для меня - тёмный лес, ибо не программер ниразу...

Добавлено (29.07.2015, 14:59)
---------------------------------------------
Короче, разобрался.
Во всём виноват

Цитата Romz ()
Artefact_respawner_COP\
  Злобная реклама
Среда, 29.07.2015, 14:59
Статус:
Сообщений: 666
Регистрация: 16.07.2015
Российская Федерация  DukeKAn
Среда, 29.07.2015, 16:18 | Сообщение # 2
Статус:
Неопытный:
Сообщений: 491
Награды: 8
Регистрация: 25.11.2012

Цитата Romz ()
Позже, поковырявшись, вылет по [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\

Как разобрались? В чём ошибка была? Или просто не стали его адаптировать?
  Злобная реклама
Среда, 29.07.2015, 16:18
Статус:
Сообщений: 666
Регистрация: 25.11.2012
Российская Федерация  Romz
Четверг, 30.07.2015, 19:45 | Сообщение # 3
Статус:
Отмычка:
Сообщений: 104
Награды: 0
Регистрация: 16.07.2015

Цитата DukeKAn ()
Как разобрались? В чём ошибка была? Или просто не стали его адаптировать?

Один человек на АМК форуме подсказал, я его убрал из сборки. Вылеты прекратились. А потом ещё поковырялся в потрохах ЗП, в процессе добавления в сборку AtmosFear 3, и оказалось, что арты и так возрождаются, по крайней мере - должны, после выбросов. И я забил на Artefact_respawner_COP. Вот где бы дин.аномалии для ЗП нарыть?... У кого-то в моде я видел, но очень глубоко зарытое...
  Злобная реклама
Четверг, 30.07.2015, 19:45
Статус:
Сообщений: 666
Регистрация: 16.07.2015
Российская Федерация  makdm
Четверг, 30.07.2015, 20:16 | Сообщение # 4
Время Альянса
Статус:
Опытный:
Сообщений: 1787
Награды: 19
Регистрация: 22.11.2012

Цитата Romz ()
Вот где бы дин.аномалии для ЗП нарыть?... У кого-то в моде я видел, но очень глубоко зарытое...

Если в скриптах немного понимаешь, то забери из мода Припять.Точка отсчёта.
Аномалии во время выброса рассасываются, после выброса вновь появляются совсем в других местах и совсем другие аномалии.
Сделано для одной локации, но если дописать код, то работать будет на всех локациях.
Так же можешь забрать из мода воздействие аномалий на сталкеров.
  Злобная реклама
Четверг, 30.07.2015, 20:16
Статус:
Сообщений: 666
Регистрация: 22.11.2012
Российская Федерация  ALEX13
Четверг, 30.07.2015, 20:21 | Сообщение # 5
Статус:
Опытный:
Сообщений: 1625
Награды: 12
Регистрация: 26.12.2012

На playground.ru поищи в файлах для СоР, где-то в начальных страницах. Вот только игра из-за этого мода крашится.
  Злобная реклама
Четверг, 30.07.2015, 20:21
Статус:
Сообщений: 666
Регистрация: 26.12.2012
Российская Федерация  Romz
Пятница, 31.07.2015, 11:43 | Сообщение # 6
Статус:
Отмычка:
Сообщений: 104
Награды: 0
Регистрация: 16.07.2015

Вернусь к респавну атрефактов
В Artefact_respawner_COP, в скрипте art_mgr.script, присутствую две вот такие функции
Вот они то, скорее всего и вызывают проблемы в виде битых пакетов. Я так подозреваю, что в них используются методы, не очень совместимые с ЗП. В скриптах я не очень, дык, может, подскажет кто, как их православно под ЗВ переписать?
  Злобная реклама
Пятница, 31.07.2015, 11:43
Статус:
Сообщений: 666
Регистрация: 16.07.2015
Российская Федерация  makdm
Пятница, 31.07.2015, 13:55 | Сообщение # 7
Время Альянса
Статус:
Опытный:
Сообщений: 1787
Награды: 19
Регистрация: 22.11.2012

Romz, в файле bind_stalker.script в методе

function actor_binder:save(packet)
в самом конце метода перед строкой
set_save_marker(packet, "save", true, "actor_binder")
пишешь
art_mgr.save(packet)

В этом же файле в методе

function actor_binder:load(reader)

в самом конце метода перед строкой

set_save_marker(reader, "load", true, "actor_binder")
пишешь
art_mgr.load(reader)

Начинаешь новую игру.
  Злобная реклама
Пятница, 31.07.2015, 13:55
Статус:
Сообщений: 666
Регистрация: 22.11.2012
Российская Федерация  Romz
Пятница, 31.07.2015, 14:54 | Сообщение # 8
Статус:
Отмычка:
Сообщений: 104
Награды: 0
Регистрация: 16.07.2015

makdm, Так и было, всё равно вылетало. Я сейчас к автору адаптации обратился, он вроде правил этот вылет. Позже отпишусь.
  Злобная реклама
Пятница, 31.07.2015, 14:54
Статус:
Сообщений: 666
Регистрация: 16.07.2015
Российская Федерация  DukeKAn
Пятница, 31.07.2015, 16:11 | Сообщение # 9
Статус:
Неопытный:
Сообщений: 491
Награды: 8
Регистрация: 25.11.2012

Цитата Romz ()
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
  Злобная реклама
Пятница, 31.07.2015, 16:11
Статус:
Сообщений: 666
Регистрация: 25.11.2012
Российская Федерация  Romz
Пятница, 31.07.2015, 23:13 | Сообщение # 10
Статус:
Отмычка:
Сообщений: 104
Награды: 0
Регистрация: 16.07.2015

Автор адапта тоже ничего не смог с этим сделать, и забросил мод.
Цитата 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

Можно вообще таким образом с пакетами работать?
Блин, не смогу проверить в ближайшее время, до понедельника точно... sad
  Злобная реклама
Пятница, 31.07.2015, 23:13
Статус:
Сообщений: 666
Регистрация: 16.07.2015
Российская Федерация  DukeKAn
Суббота, 01.08.2015, 23:21 | Сообщение # 11
Статус:
Неопытный:
Сообщений: 491
Награды: 8
Регистрация: 25.11.2012

Цитата Romz ()
 if flag  = "artmgr" then

Так смысла нет, ибо никакой проверки нет, надо использовать ==, а не =, так как это присваивание.
В любом случае, даже если использовать ==, то получится ровно то, что хотел автор, только другими словами
Сообщение отредактировал DukeKAn - Суббота, 01.08.2015, 23:22
  Злобная реклама
Суббота, 01.08.2015, 23:21
Статус:
Сообщений: 666
Регистрация: 25.11.2012
Российская Федерация  Romz
Воскресенье, 02.08.2015, 21:24 | Сообщение # 12
Статус:
Отмычка:
Сообщений: 104
Награды: 0
Регистрация: 16.07.2015

Цитата DukeKAn ()
Так смысла нет, ибо никакой проверки нет, надо использовать ==, а не =, так как это присваивание.
Ну я проверку и имел ввиду. Просто забыл ещё один знак написать.
Цитата DukeKAn ()
В любом случае, даже если использовать ==, то получится ровно то, что хотел автор, только другими словами
А если не использовать проверку, разве не будет считываться первый попавшийся пакет?
  Злобная реклама
Воскресенье, 02.08.2015, 21:24
Статус:
Сообщений: 666
Регистрация: 16.07.2015
Российская Федерация  DukeKAn
Понедельник, 03.08.2015, 01:15 | Сообщение # 13
Статус:
Неопытный:
Сообщений: 491
Награды: 8
Регистрация: 25.11.2012

Цитата Romz ()
А если не использовать проверку, разве не будет считываться первый попавшийся пакет?

Пакет в эту функцию передаётся всегда один и тот же, ГГ-то один. Я может не понял, что вы спрашиваете, но не стирать же то, что понаписал внизу, хех)

Нет-пакет в сталкере используется для передачи информации от серверного объекта к клиентскому и обратно.
По сути - это структура данных.

Метод
Код
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
  Злобная реклама
Понедельник, 03.08.2015, 01:15
Статус:
Сообщений: 666
Регистрация: 25.11.2012
Украина  WALL-E
Понедельник, 03.08.2015, 01:17 | Сообщение # 14
Статус:
Неопытный:
Сообщений: 521
Награды: 6
Регистрация: 29.09.2013

Цитата Romz ()
Вот где бы дин.аномалии для ЗП нарыть?...
ARS mod
  Злобная реклама
Понедельник, 03.08.2015, 01:17
Статус:
Сообщений: 666
Регистрация: 29.09.2013
Российская Федерация  Romz
Понедельник, 03.08.2015, 11:25 | Сообщение # 15
Статус:
Отмычка:
Сообщений: 104
Награды: 0
Регистрация: 16.07.2015

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
  Злобная реклама
Понедельник, 03.08.2015, 11:25
Статус:
Сообщений: 666
Регистрация: 16.07.2015
Форум » Архив » Моддинг - Архив » [CoP] Прошу помощи в совмещении нескольких модов (Сел я тут в СТАЛКЕРа поиграть...)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: