Overf1rst 1 503 Опубликовано 1 июля, 2020 Тема посвящена моддингу на платформе Зов Припяти. Правила темы: Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть. Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода. Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа). Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться. 19 9 1 1 2 6 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Xenomorphom 5 Опубликовано 20 ноября, 2020 Может кто сможет помочь? Open X-Ray 221 + AF3 + Анимация использования предметов. Вылетает вот с такой ошибкой в логе: Спойлер stack trace: C:\Windows\system32\KERNELBASE.dll at 000007FEFD35B87D RaiseException() + 61 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC8D7E5E lua_gethookcount() + 3342 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC8D7EFC lua_gethookcount() + 3500 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC901E54 lua_close() + 23652 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\LuaJIT.dll at 000007FEEC8AF012 lua_newuserdata() + 82 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\luabind.dll at 000007FEF13634B0 luabind::detail::push_new_instance() + 32 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEBFFDB57F D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC07AC1A3 CxImage::`copy constructor closure'() + 192419 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC07C7FBA CxImage::`copy constructor closure'() + 306618 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC07B5EF1 CxImage::`copy constructor closure'() + 232689 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8ED7F77 CObjectList::Update() + 903 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E86983 IGame_Level::OnFrame() + 35 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrGame.dll at 000007FEC05B2976 D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E12058 CRenderDevice::CSecondVPParams::IsSVPFrame() + 1076 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E115C1 CRenderDevice::FrameMove() + 337 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E10BA3 CRenderDevice::on_idle() + 243 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E11118 CRenderDevice::message_loop() + 392 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8E1138B CRenderDevice::Run() + 507 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8EDD2A9 Startup() + 521 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.dll at 000007FED8EDD8FD RunApplication() + 1229 byte(s) D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.exe at 000000013F3A14AF D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.exe at 000000013F3A1594 D:\Games\S.T.A.L.K.E.R. Call of Pripyat\bin\xrEngine.exe at 000000013F3A19A2 C:\Windows\system32\kernel32.dll at 00000000773F556D BaseThreadInitThunk() + 13 byte(s) C:\Windows\SYSTEM32\ntdll.dll at 000000007755372D RtlUserThreadStart() + 29 byte(s) Вылетает на Янове или на Скадовске Заранее Спасибо Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Neptun 885 Опубликовано 21 ноября, 2020 Добро. Как формируется файл сохранения? Как можно добавить новые переменные для сохранения? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 978 Опубликовано 21 ноября, 2020 (изменено) 1 час назад, Neptun сказал: Как формируется файл сохранения? Файл сохранения формируется движком, точнее его серверной частью. В файл попадает информация о каждом объекте в игре вероятнее всего в виде нетпакетов объектов (специальным образом сформированный блок информации с текущем статусом объекта). 1 час назад, Neptun сказал: Как можно добавить новые переменные для сохранения? 1. Если задан биндер объекта, то движком вызываются две функции - колбеки событий сохранения нетпакета и его загрузки. Например: function door_binder_labx8:save(packet) и function door_binder_labx8:load(packet). В этих функциях имеется возможность напрямую добавить переменные в нетпакет. Спойлер -- Saving function door_binder_labx8:save(packet) set_save_marker(packet, "save", false, "door_binder_labx8") object_binder.save(self, packet) xr_logic.save_obj(self.object, packet) packet:w_bool(self.is_idle) packet:w_bool(self.is_play_fwd) -- packet:w_u32(self.idle_end) packet:w_float(self.object:get_physics_object():anim_time_get()) set_save_marker(packet, "save", true, "door_binder_labx8") end -- Loading function door_binder_labx8:load(packet) set_save_marker(packet, "load", false, "door_binder_labx8") object_binder.load(self, packet) xr_logic.load_obj(self.object, packet) self.is_idle = packet:r_bool() self.is_play_fwd = packet:r_bool() -- self.idle_end = packet:r_u32() self.anim_time = packet:r_float() self.loaded = true set_save_marker(packet, "load", true, "door_binder_labx8") end 2. Есть специальная сущность db.storage (хранилище) в которую можно поместить свои переменные для сохранения и восстановления состояния объекта к кторому они привязаны: Спойлер function pstor_store(obj, varname, val) local npc_id = obj:id() if db.storage[npc_id].pstor == nil then db.storage[npc_id].pstor = {} end local tv = type(val) if val ~= nil and not pstor_is_registered_type(tv) then abort("xr_logic: pstor_store: not registered type '%s' encountered", tv) end db.storage[npc_id].pstor[varname] = val end function pstor_retrieve(obj, varname, defval) local npc_id = obj:id() if db.storage[npc_id].pstor ~= nil then local val = db.storage[npc_id].pstor[varname] if val ~= nil then return val end end if defval ~= nil then return defval end --abort("xr_logic: pstor_retrieve: variable '%s' does not exist", varname) return nil end function pstor_save_all(obj, packet) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end local ctr = 0 for k, v in pairs(pstor) do ctr = ctr + 1 end packet:w_u32(ctr) for k, v in pairs(pstor) do --printf("_bp: pstor_save_all: saving [%s]='%s'", utils.to_str(k), utils.to_str(v)) packet:w_stringZ(k) local tv = type(v) if tv == "number" then packet:w_u8(pstor_number) packet:w_float(v) elseif tv == "string" then packet:w_u8(pstor_string) packet:w_stringZ(v) elseif tv == "boolean" then packet:w_u8(pstor_boolean) packet:w_bool(v) else abort("xr_logic: pstor_save_all: not registered type '%s' encountered", tv) end end end function pstor_load_all(obj, reader) local npc_id = obj:id() local pstor = db.storage[npc_id].pstor if not pstor then pstor = {} db.storage[npc_id].pstor = pstor end local ctr = reader:r_u32() for i = 1, ctr do local varname = reader:r_stringZ() local tn = reader:r_u8() if tn == pstor_number then pstor[varname] = reader:r_float() elseif tn == pstor_string then pstor[varname] = reader:r_stringZ() elseif tn == pstor_boolean then pstor[varname] = reader:r_bool() else abort("xr_logic: pstor_load_all: not registered type N %d encountered", tn) end --printf("_bp: pstor_load_all: loaded [%s]='%s'", varname, utils.to_str(pstor[varname])) end end Спойлер xr_logic.pstor_store(db.actor, "zat_b30_days_cnt", 0) cnt = xr_logic.pstor_retrieve(actor, "zat_b30_days_cnt", 0) Изменено 21 ноября, 2020 пользователем denis2000 5 Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
NewValveCom 125 Опубликовано 21 ноября, 2020 В 20.11.2020 в 03:57, Neptun сказал: Во-первых, функцию спавна сквада необязательно выносить в отдельную строку логики, она прекрасно смотрится и в начале: on_actor_inside = {+shakhter_seventh_dialog_end} %+psevdoshakhter_spawn =create_squad(smart_psevdo_squad:smart_psevdo)% Во-вторых, не пробовал сейв вставить в эту же логику? Сразу после 7 нумера создать отдельную строку: [sr_idle@7] on_game_timer = 50 | %=ending_postprocess_cutscene_54 =ending_anim_cutscene_54 =ending_punches =enable_ui% sr_idle@save [sr_idle@save] on_info = %=scenario_autosave(save)% sr_idle@nil Ни в какую, то же самое. Пробовал и то, и то что снизу написал @makdm. Постпроцесс остался после сейвлоада Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
makdm 676 Опубликовано 21 ноября, 2020 19 минут назад, NewValveCom сказал: Ни в какую, то же самое. Чудес не бывает. Выкладывайте все то, что вы делали и опишите что вы хотите. Подробно.... Возможно вы вообще идете не тем путем.... 1 Терпение... И все получится. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Kalambur 25 Опубликовано 21 ноября, 2020 Подскажите пожалуйста, как закончить текст другим цветом в диалоге, чтобы дальше текст был написан стандартным цветом ? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 978 Опубликовано 21 ноября, 2020 Kalambur %c[default] насколько я помню. 1 Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 21 ноября, 2020 (изменено) Попробовал перенести один скрипт из CoC, а именно, появление полоски здоровья при нанесении хиту НПС. Спойлер Вызов скрипта из xr_motivator.script в hit_callback: if who_id==actor_id then hpbar.OnHit(obj,who) end ==================================================================================== Сам скрипт: local progress = nil local last_id = nil function OnHit(obj,who) local st = db.storage[obj:id()] if st and obj:alive() then if not st then return end local v = obj.health or 0 if last_id and last_id == obj:id() then if v <= 0.005 then cs_remove() end end if (who == nil or who:id() ~= 0) then return end local hud = get_hud() if not hud then return end local cs = hud:GetCustomStatic("cs_enemy_health") if cs == nil and obj:alive() then flags.timer_health_npc = time_global()+25000 hud:AddCustomStatic("cs_enemy_health", true) local xml = CScriptXmlInit() xml:ParseFile("ui_enemy_health.xml") cs = hud:GetCustomStatic("cs_enemy_health") local w = cs:wnd() progress = xml:InitProgressBar("enemy_health", w) end if v > 0.005 then progress:Show(true) progress:SetProgressPos(obj.health*100) last_id = obj:id() else cs_remove() end else cs_remove() end end function cs_remove() last_id = nil progress = nil local hud = get_hud() if hud and hud:GetCustomStatic("cs_enemy_health") then hud:RemoveCustomStatic("cs_enemy_health") end end Проблема в том, что после убийства НПС статика не исчезает с экрана, а видимо работает с другим НПС, которому не был нанесён хит, или как-то перезапускается. Как это исправить? Изменено 21 ноября, 2020 пользователем Winzor Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
NewValveCom 125 Опубликовано 21 ноября, 2020 5 часов назад, makdm сказал: Чудес не бывает. Выкладывайте все то, что вы делали и опишите что вы хотите. Подробно.... Возможно вы вообще идете не тем путем.... (в добавок к предыдущему): Даже если я поставлю совершенно другой постпроцесс (psychic.ppe), вызову функцию stop_postprocess, сохранюсь, и перезагружусь - почему-то вновь проигрывается постпроцесс который я вообще убрал (fire_hit). Моя цель: я реализовал после убийства определенного персонажа проигрывается нужный постпроцесс, его я зарегистрировал в xr_effects (ending_cutscene_54) + зарегистрировал и его уборку (ending_postprocess_cutscene_54): Спойлер function ending_cutscene_54() level.add_pp_effector("fire_hit.ppe", 1111, true) end function ending_postprocess_cutscene_54() level.remove_pp_effector(1111) end Ввел эти функции в логику рестриктора, чтобы оно проигралось: Спойлер [logic] active = sr_idle@3 [sr_idle@3] on_actor_inside = {+shakhter_seventh_dialog_end} %+psevdoshakhter_spawn% sr_idle@4 [sr_idle@4] on_info = %=create_squad(smart_psevdo_squad:smart_psevdo)% sr_idle@5 [sr_idle@5] on_info = {+psevdodeath} %=give_task(quest_killing_psevdoshakhter) =ending_cutscene_54 =ending_cutscene_54_2 =play_sound(end_cut54)% sr_idle@6 [sr_idle@6] on_info = {+shakhter_punches} %=ending_postprocess_cutscene_54 =ending_anim_cutscene_54% sr_idle@7 [sr_idle@7] on_game_timer = 30 | %+shakhter_puncher% sr_idle@nil [sr_idle@nil] Вроде как всё хорошо. Проигрывается всё хорошо, после того, как игра получила поршень shakhter_punches - постпроцесс убирается, но стоит после получения поршня сохранится и перезагрузить последнее сохранение - то постпроцесс будто и никуда не пропадал. Пробовал убрать эти фунцкции (что я раньше и упоминал) - и ничего, будто игра после перезагрузки сейва получает какой-то левый поршень, который и запускает этот постпроцесс. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Neptun 885 Опубликовано 22 ноября, 2020 16 часов назад, denis2000 сказал: xr_logic.pstor_store(db.actor, "zat_b30_days_cnt", 0) cnt = xr_logic.pstor_retrieve(actor, "zat_b30_days_cnt", 0) Данный метод кажется перспективным. Если бы его использовать немного по-другому. Например: Спойлер local news_4 = ReadString("news_messege","news",ini_file("stalker_news_4.ltx")) xr_logic.pstor_store(db.actor,"pk2_stalker_net_news_4", tostring(news_4)) function ReadString(iSec,sLin,fIni) if not fIni then fIni=system_ini() end return fIni:r_string(iSec,sLin) end По моей задумке, игра сохранит содержимое строки "news", а после вызова сохранённый параметр разметит в файле. local read_4 = stalker_site_write_news("gamedata\\configs\\stalker_news_4.ltx") xr_logic.pstor_retrieve(db.actor, "pk2_stalker_net_news_4", tostring(read_4)) Но игра вносит лишь параметр nil, говорящий о том, что, вероятно, никаких данных игра не сохранила. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 978 Опубликовано 22 ноября, 2020 (изменено) 13 часов назад, Winzor сказал: Проблема в том, что после убийства НПС статика не исчезает с экрана, а видимо работает с другим НПС, которому не был нанесён хит, или как-то перезапускается. Как это исправить? В рамках скрипта все работает корректно: после убийства НПС на которого настроена полоска она удаляется, но приходит новый колбек хита на другого НПС из этого же сквада (даже если ГГ не наносил ему хит!) и полоска появляется снова. Распознать это фейковый хит или же ГГ действительно его нанес в рамках этого скрипта НЕВОЗМОЖНО. Полоска удалиться только после полной зачистки сквада. Neptun Что за действия выполняются этим кодом решительно непонятно: 3 часа назад, Neptun сказал: local read_4 = stalker_site_write_news("gamedata\\configs\\stalker_news_4.ltx") xr_logic.pstor_retrieve(db.actor, "pk2_stalker_net_news_4", tostring(read_4)) Поскольку pstor_retrieve никакую перемнную скрипта не устанавливает в считанное из хранилища значение. Изменено 22 ноября, 2020 пользователем denis2000 1 Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Neptun 885 Опубликовано 22 ноября, 2020 1 час назад, denis2000 сказал: Что за действия выполняются этим кодом решительно непонятно: Оно производит запись в указанном файле, с этим функция справляется, но я не понимаю, как записать в файл некую переменную, которая должна сохраниться из предыдущего действия. Переменная содержится в строке news = просто_набор_символов Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
makdm 676 Опубликовано 22 ноября, 2020 (изменено) 43 минуты назад, Neptun сказал: как записать в файл некую переменную, Разрабами движка ЗП не предусмотрена писанина в LTX файлы. Все переменные, которые меняются во время игры, пишутся в один файл - файл сохранение игры. Оттуда же и считываются при загрузке. Хотя разраб SGM мода попытался писать сохранения в отдельный файл, но все это так ...., что если хотите разобраться и повторить можете там подсмотреть. Поэтому лучше используйте методы SAVE и LOAD для сохранения измененных данных. З.Ы. Наглядный пример - это файл xr_statistic.script Там постоянно меняются значения и все они сохраняются и считываются из сохранения. Изменено 22 ноября, 2020 пользователем makdm 1 Терпение... И все получится. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Metil 0 Опубликовано 22 ноября, 2020 Помогите пожалуйста , подхожу к нпс начинаю с ним разговор вылетает ошибка . Что делать? Expression : !phrase_dialog->m_PhraseVector.empty() Function : CPhraseDialog::SayPhrase File : D:\prog_repository\sources\trunk\xrGame\PhraseDialog.cpp Line : 146 Description : No available phrase to say, dialog[hello_dialog] Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 22 ноября, 2020 (изменено) 5 минут назад, Metil сказал: Помогите пожалуйста , подхожу к нпс начинаю с ним разговор вылетает ошибка . Что делать? Expression : !phrase_dialog->m_PhraseVector.empty() Function : CPhraseDialog::SayPhrase File : D:\prog_repository\sources\trunk\xrGame\PhraseDialog.cpp Line : 146 Description : No available phrase to say, dialog[hello_dialog] У НПС не прописан диалог встречи. Надо его (диалог) прописать в файл character_desc_локация, в профиль НПС под </supplies> вот это: <start_dialog>ID диалога</start_dialog> Изменено 22 ноября, 2020 пользователем Winzor Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Metil 0 Опубликовано 22 ноября, 2020 Благодорю Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Policai 1 333 Опубликовано 24 ноября, 2020 Народ! Поделитесь если есть у кого нормальным распаковщиком lanims.xr, без установки ActivePerl. Группа мода в VK Мод делался и тестировался на железе i5-11400, 32Гб ОЗУ, Radeon RX580 Разрешение 2560 х 1440. ВСЕ на максималке Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Xenomorphom 5 Опубликовано 24 ноября, 2020 Добрый день! Как добавить локацию в Atmosfear 3? Какие файлы надо править? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pavel 13 Опубликовано 24 ноября, 2020 Приветствую Решил вытащить файлы, которые отвечают за смену имени и фото гг, но не знаю какие именно Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 978 Опубликовано 24 ноября, 2020 (изменено) Xenomorphom level_weathers.script Pavel xrGame.dll Изменено 24 ноября, 2020 пользователем denis2000 1 1 Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 24 ноября, 2020 (изменено) 1 час назад, Pavel сказал: Приветствую Решил вытащить файлы, которые отвечают за смену имени и фото гг, но не знаю какие именно Так я же вам скидывал уже готовую библиотеку с этой функцией (смена портрета ГГ, а вот зачем имя менять в скорее всего сюжетном моде, я не понимаю). Там внесена всего одна правка - смена портрета ГГ по скрипту. Вот: https://yadi.sk/d/GHB0HKCA1nUm-g Изменено 24 ноября, 2020 пользователем Winzor 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pavel 13 Опубликовано 24 ноября, 2020 4 часа назад, Winzor сказал: Так я же вам скидывал уже готовую библиотеку с этой функцией (смена портрета ГГ, а вот зачем имя менять в скорее всего сюжетном моде, я не понимаю). Там внесена всего одна правка - смена портрета ГГ по скрипту. Вот: https://yadi.sk/d/GHB0HKCA1nUm-g Я помню, ещё раз спасибо, но смена имени также надо(по ходу игры должна произойти смена персонажей). Также я не понял при каких условиях меняется фото гг, это где-то нужно прописывать дополнительно? Я просто не работал с файлами dll и не понимаю как с ним работать Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
makdm 676 Опубликовано 24 ноября, 2020 17 минут назад, Pavel сказал: но смена имени также надо(по ходу игры должна произойти смена персонажей). Советую сразу задуматься над тем, как вы будете менять всю статистику в КПК ГГ, а так же вид от третьего лица. А то без этого будет совсем криво. 1 Терпение... И все получится. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Pavel 13 Опубликовано 24 ноября, 2020 3 часа назад, makdm сказал: Советую сразу задуматься над тем, как вы будете менять всю статистику в КПК ГГ, а так же вид от третьего лица. А то без этого будет совсем криво. С кпк надеюсь можно, что нибудь придумать, а и визуалом можно отдельную броню создать, но с тем же описанием и тд Но пока с сюжетом моего мода можно и убрать раздел статистики, а потом постараюсь найти способ Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Xenomorphom 5 Опубликовано 24 ноября, 2020 Подскажите, как адаптировать свою локацию под Open X-Ray 221? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты